import CodexBarCore
import Foundation
import Testing
@testable import CodexBar

struct MistralMenuCardModelTests {
    @Test
    func `mistral credit balance renders like deepseek balance`() throws {
        let now = Date()
        let credits = MistralCreditsSnapshot(
            walletAmount: 0,
            creditNotesAmount: 0,
            ongoingUsageBalance: 0,
            currency: "USD")
        let snapshot = MistralUsageSnapshot(
            totalCost: 0,
            currency: "USD",
            currencySymbol: "$",
            totalInputTokens: 0,
            totalOutputTokens: 0,
            totalCachedTokens: 0,
            modelCount: 0,
            credits: credits,
            startDate: nil,
            endDate: nil,
            updatedAt: now)
            .toUsageSnapshot()
        let metadata = try #require(ProviderDefaults.metadata[.mistral])

        let model = UsageMenuCardView.Model.make(.init(
            provider: .mistral,
            metadata: metadata,
            snapshot: snapshot,
            credits: nil,
            creditsError: nil,
            dashboard: nil,
            dashboardError: nil,
            tokenSnapshot: nil,
            tokenError: nil,
            account: AccountInfo(email: nil, plan: nil),
            isRefreshing: false,
            lastError: nil,
            usageBarsShowUsed: false,
            resetTimeDisplayStyle: .countdown,
            tokenCostUsageEnabled: false,
            costSummaryInlineEnabled: true,
            showOptionalCreditsAndExtraUsage: true,
            hidePersonalInfo: false,
            now: now))

        let primary = try #require(model.metrics.first)
        #expect(primary.title == "Balance")
        #expect(primary.statusText == "$0.00")
        #expect(primary.resetText == nil)
        #expect(primary.detailText == nil)
    }

    @Test
    func `mistral credit balance renders separately from primary percent lane`() throws {
        let now = Date()
        let credits = MistralCreditsSnapshot(
            walletAmount: 10,
            creditNotesAmount: 2.5,
            ongoingUsageBalance: 0,
            currency: "USD")
        let usage = MistralUsageSnapshot(
            totalCost: 0,
            currency: "USD",
            currencySymbol: "$",
            totalInputTokens: 0,
            totalOutputTokens: 0,
            totalCachedTokens: 0,
            modelCount: 0,
            credits: credits,
            startDate: nil,
            endDate: nil,
            updatedAt: now)
            .toUsageSnapshot()
        let snapshot = UsageSnapshot(
            primary: RateWindow(
                usedPercent: 73,
                windowMinutes: nil,
                resetsAt: now.addingTimeInterval(3 * 24 * 60 * 60),
                resetDescription: "API spend this month"),
            secondary: nil,
            tertiary: nil,
            mistralUsage: usage.mistralUsage,
            updatedAt: now,
            identity: usage.identity)
        let metadata = try #require(ProviderDefaults.metadata[.mistral])

        let model = UsageMenuCardView.Model.make(.init(
            provider: .mistral,
            metadata: metadata,
            snapshot: snapshot,
            credits: nil,
            creditsError: nil,
            dashboard: nil,
            dashboardError: nil,
            tokenSnapshot: nil,
            tokenError: nil,
            account: AccountInfo(email: nil, plan: nil),
            isRefreshing: false,
            lastError: nil,
            usageBarsShowUsed: false,
            resetTimeDisplayStyle: .countdown,
            tokenCostUsageEnabled: false,
            costSummaryInlineEnabled: true,
            showOptionalCreditsAndExtraUsage: true,
            hidePersonalInfo: false,
            now: now))

        let primary = try #require(model.metrics.first)
        #expect(primary.id == "mistral-balance")
        #expect(primary.statusText == "$12.50")
        #expect(primary.detailText == nil)
        #expect(primary.resetText == nil)

        let percentMetric = try #require(model.metrics.dropFirst().first)
        #expect(percentMetric.id == "primary")
        #expect(percentMetric.percent == 27)
        #expect(percentMetric.detailText == "API spend this month")
    }

    @Test
    func `mistral model surfaces monthly cost as primary detail text`() throws {
        let now = Date()
        let resetsAt = now.addingTimeInterval(3 * 24 * 60 * 60)
        let identity = ProviderIdentitySnapshot(
            providerID: .mistral,
            accountEmail: nil,
            accountOrganization: nil,
            loginMethod: nil)
        let snapshot = UsageSnapshot(
            primary: RateWindow(
                usedPercent: 0,
                windowMinutes: nil,
                resetsAt: resetsAt,
                resetDescription: "€1.2345 this month"),
            secondary: nil,
            tertiary: nil,
            updatedAt: now,
            identity: identity)
        let metadata = try #require(ProviderDefaults.metadata[.mistral])

        let model = UsageMenuCardView.Model.make(.init(
            provider: .mistral,
            metadata: metadata,
            snapshot: snapshot,
            credits: nil,
            creditsError: nil,
            dashboard: nil,
            dashboardError: nil,
            tokenSnapshot: nil,
            tokenError: nil,
            account: AccountInfo(email: nil, plan: nil),
            isRefreshing: false,
            lastError: nil,
            usageBarsShowUsed: true,
            resetTimeDisplayStyle: .countdown,
            tokenCostUsageEnabled: false,
            costSummaryInlineEnabled: true,
            showOptionalCreditsAndExtraUsage: true,
            hidePersonalInfo: false,
            now: now))

        let primary = try #require(model.metrics.first)
        #expect(primary.detailText == "€1.2345 this month")
        #expect(primary.resetText?.hasPrefix("Resets") == true)
    }
}
