import Foundation
#if canImport(FoundationModels)
import FoundationModels
#endif

/// Lokale enhancement via Apple's on-device taalmodel (FoundationModels,
/// macOS 26+, Apple Intelligence). Gratis, privé, offline, geen Gemini-503's.
/// Volledig fallback-veilig: elke fout/onbeschikbaarheid → caller valt terug
/// op het bestaande cloud-pad. Niets aan bestaand gedrag wijzigt.
enum AppleOnDeviceEnhancer {

    enum ProbeResult {
        case available
        case unavailable(String)
        case unsupportedOS
    }

    /// Harde check of het on-device model nú bruikbaar is. Voor de log/probe.
    static func probe() -> ProbeResult {
        #if canImport(FoundationModels)
        if #available(macOS 26.0, *) {
            switch SystemLanguageModel.default.availability {
            case .available:
                return .available
            case .unavailable(let reason):
                return .unavailable("\(reason)")
            @unknown default:
                return .unavailable("onbekend")
            }
        } else {
            return .unsupportedOS
        }
        #else
        return .unsupportedOS
        #endif
    }

    /// Bewust KORTE instructie: het on-device model heeft een klein
    /// contextvenster. De volledige app-prompt (184 vocab-termen + context)
    /// overschrijdt dat ("Exceeded model context window size"). Termen worden
    /// al door de woordvervanging gecorrigeerd vóór deze stap — Apple hoeft
    /// alleen op te schonen, niet de vocab te kennen.
    static let leanInstructions = """
    Je bent een transcriptie-opschoner, GEEN chatbot. Beantwoord NIETS en \
    voeg niets toe. Verbeter uitsluitend interpunctie, hoofdletters en \
    evidente versprekingen in de tekst tussen <TRANSCRIPT>. Behoud de \
    woorden en betekenis exact. Geef ALLEEN de opgeschoonde tekst terug, \
    zonder uitleg, zonder <TRANSCRIPT>-tags.
    """

    /// Schoont de transcriptie lokaal op met de korte instructie (negeert
    /// bewust de zware app-prompt). Gooit bij onbeschikbaarheid of elke fout
    /// — de caller gebruikt try/catch en valt dan terug op het cloud-pad.
    static func enhance(user: String) async throws -> String {
        #if canImport(FoundationModels)
        if #available(macOS 26.0, *) {
            guard case .available = SystemLanguageModel.default.availability else {
                throw EnhancementError.notConfigured
            }
            let session = LanguageModelSession(instructions: leanInstructions)
            let response = try await session.respond(to: user)
            return response.content
        } else {
            throw EnhancementError.notConfigured
        }
        #else
        throw EnhancementError.notConfigured
        #endif
    }
}
