//
//  ModelInfo.swift
//  oAI
//
//  Model information and capabilities
//
// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2026 Rune Olsen
//
// This file is part of oAI.
//
// oAI is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// oAI is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
// Public License for more details.
//
// You should have received a copy of the GNU Affero General Public
// License along with oAI. If not, see <https://www.gnu.org/licenses/>.


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] = []

    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
    }

    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)
    }
}
