import Foundation

enum ChatRole: String, Codable {
    case user
    case assistant
}

enum ChatMessageKind: String, Codable {
    case text
    case voice
}

struct ChatMessage: Codable, Identifiable, Equatable {
    var id: String
    var role: ChatRole
    var kind: ChatMessageKind
    var text: String
    var imagePath: String?
    var audioPath: String?
    var durationSec: Double?

    static func userText(_ text: String, imagePath: String? = nil) -> ChatMessage {
        ChatMessage(
            id: "msg_\(Int(Date().timeIntervalSince1970 * 1_000_000))",
            role: .user,
            kind: .text,
            text: text,
            imagePath: imagePath
        )
    }

    static func assistantText(_ text: String) -> ChatMessage {
        ChatMessage(
            id: "msg_\(Int(Date().timeIntervalSince1970 * 1_000_000))",
            role: .assistant,
            kind: .text,
            text: text
        )
    }

    static func userVoice(
        transcript: String,
        audioPath: String,
        durationSec: Double,
        imagePath: String? = nil
    ) -> ChatMessage {
        ChatMessage(
            id: "msg_\(Int(Date().timeIntervalSince1970 * 1_000_000))",
            role: .user,
            kind: .voice,
            text: transcript,
            imagePath: imagePath,
            audioPath: audioPath,
            durationSec: durationSec
        )
    }
}

struct ChatThread: Codable, Identifiable, Equatable {
    var id: String
    var title: String?
    var updatedAt: String
    var messages: [ChatMessage]
}

struct ChatHistoryFile: Codable {
    var sessionId: String
    var updatedAt: String
    var activeThreadId: String
    var threads: [ChatThread]
    /// Legacy flat messages — read-only for migration.
    var messages: [ChatMessage]?

    enum CodingKeys: String, CodingKey {
        case sessionId, updatedAt, activeThreadId, threads, messages
    }
}

struct ChatThreadSummary: Identifiable, Equatable {
    var id: String
    var title: String?
    var updatedAt: String
    var messageCount: Int
    var preview: String
}

enum StudyRightPanelMode: String, Equatable {
    case hidden
    case chat
    case pdf
}

enum StudyAskScenario {
    case pdf
    case video
    case audio

    func featureGate(_ features: AiFeatures) -> Bool {
        switch self {
        case .pdf: return features.pdfChat
        case .video: return features.videoRegionAsk
        case .audio: return features.audioClipAsk
        }
    }

    func systemPrompt(_ prompts: AiPrompts) -> String {
        switch self {
        case .pdf:
            return prompts.pdfAsk.isEmpty ? prompts.imageRegion : prompts.pdfAsk
        case .video: return prompts.videoAsk
        case .audio: return prompts.audioAsk
        }
    }
}
