//
//  Settings.swift
//  Confab
//
//  Application settings and configuration
//
// 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 Settings: Codable {
    // Provider settings
    var defaultProvider: Provider
    var openrouterAPIKey: String?
    var anthropicAPIKey: String?
    var openaiAPIKey: String?
    var ollamaBaseURL: String
    
    // Model settings
    var defaultModel: String?
    var streamEnabled: Bool
    var maxTokens: Int
    var systemPrompt: String?
    var customPromptMode: CustomPromptMode

    // Feature flags
    var onlineMode: Bool
    var memoryEnabled: Bool
    var mcpEnabled: Bool
    
    // Web search
    var searchProvider: SearchProvider
    var googleAPIKey: String?
    var googleSearchEngineID: String?
    
    // UI
    var costWarningThreshold: Double
    
    enum Provider: String, Codable, CaseIterable {
        case openrouter
        case anthropic
        case openai
        case ollama
        case appleOnDevice = "apple_on_device"

        var displayName: String {
            switch self {
            case .appleOnDevice: return "Apple Intelligence"
            default: return rawValue.capitalized
            }
        }

        var iconName: String {
            switch self {
            case .openrouter: return "network"
            case .anthropic: return "brain"
            case .openai: return "sparkles"
            case .ollama: return "server.rack"
            case .appleOnDevice: return "apple.logo"
            }
        }
    }
    
    enum SearchProvider: String, Codable, CaseIterable {
        case anthropicNative = "anthropic_native"
        case duckduckgo
        case google

        var displayName: String {
            switch self {
            case .anthropicNative: return "Anthropic Native"
            case .duckduckgo: return "DuckDuckGo"
            case .google: return "Google"
            }
        }
    }

    enum CustomPromptMode: String, Codable, CaseIterable {
        case append = "append"
        case replace = "replace"

        var displayName: String {
            switch self {
            case .append: return "Append to Default"
            case .replace: return "Replace Default (BYOP)"
            }
        }

        var description: String {
            switch self {
            case .append: return "Your custom prompt will be added after the default system prompt"
            case .replace: return "Only use your custom prompt (Bring Your Own Prompt)"
            }
        }
    }
    
    // Default settings
    static let `default` = Settings(
        defaultProvider: .openrouter,
        openrouterAPIKey: nil,
        anthropicAPIKey: nil,
        openaiAPIKey: nil,
        ollamaBaseURL: "http://localhost:11434",
        defaultModel: nil,
        streamEnabled: true,
        maxTokens: 4096,
        systemPrompt: nil,
        customPromptMode: .append,
        onlineMode: false,
        memoryEnabled: true,
        mcpEnabled: false,
        searchProvider: .duckduckgo,
        googleAPIKey: nil,
        googleSearchEngineID: nil,
        costWarningThreshold: 1.0
    )
}
