package pricing

import (
	"time"
)

type PricingProfileITF interface {
	GetPrice(quantity float64, val float64, start time.Time, end time.Time, params ...string) (float64, error)
	IsPurchased() bool
	GetOverrideStrategyValue() int
}

type RefundType int

const (
	REFUND_DEAD_END RefundType = iota
	REFUND_ON_ERROR
	REFUND_ON_EARLY_END
)

func (t RefundType) String() string {
	return [...]string{"REFUND ON DEAD END", "REFUND ON ERROR", "REFUND ON EARLY END"}[t]
}

func RefundTypeList() []RefundType {
	return []RefundType{REFUND_DEAD_END, REFUND_ON_ERROR, REFUND_ON_EARLY_END}
}

type AccessPricingProfile[T Strategy] struct { // only use for acces such as : DATA && PROCESSING
	Pricing       PricingStrategy[T] `json:"pricing,omitempty" bson:"pricing,omitempty"`   // Price is the price of the resource
	DefaultRefund RefundType         `json:"default_refund" bson:"default_refund"`         // DefaultRefund is the default refund type of the pricing
	RefundRatio   int32              `json:"refund_ratio" bson:"refund_ratio" default:"0"` // RefundRatio is the refund ratio if missing
}

func (b *AccessPricingProfile[T]) GetOverrideStrategyValue() int {
	return -1
}

type ExploitPrivilegeStrategy int

const (
	BASIC ExploitPrivilegeStrategy = iota
	GARANTED_ON_DELAY
	GARANTED
)

func ExploitPrivilegeStrategyList() []ExploitPrivilegeStrategy {
	return []ExploitPrivilegeStrategy{BASIC, GARANTED_ON_DELAY, GARANTED}
}

func (t ExploitPrivilegeStrategy) String() string {
	return [...]string{"NO GARANTY", "GARANTED ON SPECIFIC DELAY", "GARANTED"}[t]
}

type ExploitPricingProfile[T Strategy] struct { // only use for exploit such as : STORAGE, COMPUTE, WORKFLOW
	AccessPricingProfile[T]
	AdditionnalRefundTypes []RefundType `json:"refund_types" bson:"refund_types"` // RefundTypes is the refund types of the pricing

	PrivilegeStrategy   ExploitPrivilegeStrategy `json:"privilege_strategy,omitempty" bson:"privilege_strategy,omitempty"`       // Strategy is the strategy of the pricing
	GarantedDelaySecond uint                     `json:"garanted_delay_second,omitempty" bson:"garanted_delay_second,omitempty"` // GarantedDelaySecond is the garanted delay of the pricing

	Exceeding      bool  `json:"exceeding" bson:"exceeding"`                         // Exceeding is the exceeding of the bill
	ExceedingRatio int32 `json:"exceeding_ratio" bson:"exceeding_ratio" default:"0"` // ExceedingRatio is the exceeding ratio of the bill
}