//
//  ModelInfo.swift
//  Confab
//
//  Model information and capabilities
//
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
// Copyright (C) 2026 Rune Olsen
//
// This file is part of Confab.
//
// Confab is licensed under the PolyForm Noncommercial License 1.0.0.
// You may use, study, modify, and share it for any noncommercial
// purpose. Commercial use — including selling Confab or any part of
// it, standalone or bundled into another product or service —
// requires a separate commercial license from the copyright holder.
//
// See the LICENSE file or
// <https://polyformproject.org/licenses/noncommercial/1.0.0> for
// the full license text. For commercial licensing, contact Rune
// Olsen via <https://confab.no>.


import Foundation

struct ModelInfo: Identifiable, Codable, Hashable {
    let id: String
    let name: String
    let description: String?
    let contextLength: Int
    let pricing: Pricing
    let capabilities: ModelCapabilities
    var architecture: Architecture? = nil
    var topProvider: String? = nil
    var categories: [ModelCategory] = []
    var releaseDate: Date? = nil

    struct Pricing: Codable, Hashable {
        let prompt: Double    // per 1M tokens
        let completion: Double
    }

    struct ModelCapabilities: Codable, Hashable {
        let vision: Bool           // Images/PDFs
        let tools: Bool            // Function calling
        let online: Bool           // Web search
        var imageGeneration: Bool = false  // Image output
        var thinking: Bool = false         // Reasoning/thinking tokens
        var usesImagesAPI: Bool = false    // OpenRouter dedicated /images endpoint
    }

    struct Architecture: Codable, Hashable {
        let tokenizer: String?
        let instructType: String?
        let modality: String?
    }

    // Computed properties
    var contextLengthDisplay: String {
        if contextLength >= 1_000_000 {
            return "\(contextLength / 1_000_000)M"
        } else if contextLength >= 1000 {
            return "\(contextLength / 1000)K"
        } else {
            return "\(contextLength)"
        }
    }
    
    var promptPriceDisplay: String {
        String(format: "$%.2f", pricing.prompt)
    }
    
    var completionPriceDisplay: String {
        String(format: "$%.2f", pricing.completion)
    }
}
