package state

// ModelTier represents the minimum subscription tier required to use a model.
type ModelTier int

const (
	// TierFree models are available to all users, including those without a Copilot subscription.
	TierFree ModelTier = iota
	// TierStandard models require an active Copilot subscription (individual or higher).
	TierStandard
	// TierPro models require an individual_pro, business, or enterprise subscription.
	TierPro
)

func (t ModelTier) String() string {
	switch t {
	case TierFree:
		return "free"
	case TierStandard:
		return "standard"
	case TierPro:
		return "pro"
	default:
		return "unknown"
	}
}

// modelTierMap defines the minimum subscription tier required for each Copilot model.
// Models not in this map default to TierStandard.
var modelTierMap = map[string]ModelTier{
	// TierFree
	"gpt-5-mini": TierFree,

	// TierStandard
	"gpt-5.2-codex":          TierStandard,
	"gpt-5.4":                TierStandard,
	"claude-haiku-4.5":       TierStandard,
	"claude-sonnet-4.6":      TierStandard,
	"gemini-3-flash-preview": TierStandard,
	"gemini-3-pro-preview":   TierStandard,
	"gemini-3.1-pro-preview": TierStandard,
	"grok-code-fast-1":       TierStandard,

	// TierPro
	"claude-opus-4.7": TierPro,
	"gpt-5.5":         TierPro,
}

// TierForModel returns the minimum subscription tier required for the given model.
// Unknown models default to TierStandard.
func TierForModel(model string) ModelTier {
	if tier, ok := modelTierMap[model]; ok {
		return tier
	}
	return TierStandard
}

// planTierMap maps GitHub copilot_plan strings to internal tier levels.
// Unknown plans default to TierFree (most permissive).
var planTierMap = map[string]ModelTier{
	"":               TierFree,
	"individual":     TierStandard,
	"individual_pro": TierPro,
	"business":       TierPro,
	"enterprise":     TierPro,
}

// PlanTier returns the tier level for a given copilot_plan string.
// Unknown plans default to TierFree.
func PlanTier(plan string) ModelTier {
	if tier, ok := planTierMap[plan]; ok {
		return tier
	}
	return TierFree
}

// tierFromString parses a tier string ("free", "standard", "pro") into a ModelTier.
// Returns TierStandard for unrecognized values.
func tierFromString(s string) ModelTier {
	switch s {
	case "free":
		return TierFree
	case "pro":
		return TierPro
	default:
		return TierStandard
	}
}

// ApplyModelTierOverrides applies user-configured model tier overrides from the config file.
// Keys are model names, values are tier strings: "free", "standard", "pro".
func ApplyModelTierOverrides(overrides map[string]string) {
	for model, tierStr := range overrides {
		modelTierMap[model] = tierFromString(tierStr)
	}
}
