import Foundation

/// Static catalog of CommandCode subscription plans → monthly credit allowance (in USD).
///
/// The `/internal/billing/credits` endpoint exposes the *remaining* `monthlyCredits`,
/// not the plan total. The plan total is published on the public pricing page
/// (https://commandcode.ai/pricing) and is keyed by `planId` returned from
/// `/internal/billing/subscriptions`.
public enum CommandCodePlanCatalog {
    public struct Plan: Sendable, Equatable {
        public let id: String
        public let displayName: String
        /// Monthly credit allowance in USD.
        public let monthlyCreditsUSD: Double

        public init(id: String, displayName: String, monthlyCreditsUSD: Double) {
            self.id = id
            self.displayName = displayName
            self.monthlyCreditsUSD = monthlyCreditsUSD
        }
    }

    public static let plans: [Plan] = [
        Plan(id: "individual-go", displayName: "Go", monthlyCreditsUSD: 10),
        Plan(id: "individual-goat", displayName: "GOAT", monthlyCreditsUSD: 70),
        Plan(id: "individual-pro", displayName: "Pro", monthlyCreditsUSD: 30),
        Plan(id: "individual-max", displayName: "Max", monthlyCreditsUSD: 150),
        Plan(id: "individual-ultra", displayName: "Ultra", monthlyCreditsUSD: 300),
    ]

    public static func plan(forID planID: String) -> Plan? {
        let normalized = planID.lowercased()
        return self.plans.first(where: { $0.id == normalized })
    }
}
