package quotaBucket

import (
	"errors"
	"strings"
)

type QuotaBucketType interface {
	resetCount(bucket *QuotaBucket) error
}

type SynchronousQuotaBucketType struct{}

func (sQuotaBucket SynchronousQuotaBucketType) resetCount(qBucket *QuotaBucket) error {
	//do nothing.
	return nil
}

type AsynchronousQuotaBucketType struct{}

func (sQuotaBucket AsynchronousQuotaBucketType) resetCount(qBucket *QuotaBucket) error {
	//yet to implement
	return nil
}

type NonDistributedQuotaBucketType struct{}

func (sQuotaBucket NonDistributedQuotaBucketType) resetCount(qBucket *QuotaBucket) error {
	//yet to implement
	return nil
}

func GetQuotaBucketHandler(qBucket string) (QuotaBucketType, error) {
	var quotaBucketType QuotaBucketType
	qBucketType := strings.ToLower(strings.TrimSpace(qBucket))
	switch qBucketType {
	case QuotaBucketTypeSynchronous:
		quotaBucketType = &SynchronousQuotaBucketType{}
		return quotaBucketType, nil
	case QuotaBucketTypeAsynchronous:
		quotaBucketType = &AsynchronousQuotaBucketType{}
		return quotaBucketType, nil
	case QuotaBucketTypeNonDistributed:
		quotaBucketType = &NonDistributedQuotaBucketType{}
		return quotaBucketType, nil
	default:
		return nil, errors.New("Ignoring unrecognized quota type in request: " + qBucket)

	}
}
