using System.Text.Json.Serialization;

namespace AxCopilot.Models;

/// <summary>대화 주제 카테고리.</summary>
public static class ChatCategory
{
    public const string General     = "일반";
    public const string Management  = "경영";
    public const string HR          = "인사";
    public const string Finance     = "재무";
    public const string RnD         = "연구개발";
    public const string Product     = "제품분석";
    public const string Yield       = "수율분석";
    public const string MfgTech     = "제조기술";
    public const string System      = "시스템";

    public static readonly (string Key, string Label, string Symbol, string Color)[] All =
    {
        (General,    "일반",     "\uE8BD", "#6B7280"),  // Chat – gray
        (Management, "경영",     "\uE902", "#8B5CF6"),  // Briefcase – purple
        (HR,         "인사",     "\uE716", "#0EA5E9"),  // People – sky blue
        (Finance,    "재무",     "\uE8C7", "#D97706"),  // Money – amber/orange
        (RnD,        "연구개발", "\uE9A8", "#3B82F6"),  // Research – blue
        (Product,    "제품분석", "\uE9D9", "#EC4899"),  // Design – pink
        (Yield,      "수율분석", "\uE9F9", "#F59E0B"),  // Analytics – amber
        (MfgTech,    "제조기술", "\uE90F", "#10B981"),  // Manufacturing – emerald
        (System,     "시스템",   "\uE770", "#EF4444"),  // IT System – red
    };

    public static string GetSymbol(string? category)
    {
        if (string.IsNullOrEmpty(category)) return "\uE8BD";
        foreach (var (key, _, symbol, _) in All)
            if (key == category) return symbol;
        return "\uE8BD";
    }

    public static string GetColor(string? category)
    {
        if (string.IsNullOrEmpty(category)) return "#6B7280";
        foreach (var (key, _, _, color) in All)
            if (key == category) return color;
        return "#6B7280";
    }
}

/// <summary>하나의 대화(세션). 복수의 메시지를 포함합니다.</summary>
public class ChatConversation
{
    [JsonPropertyName("id")]
    public string Id { get; set; } = Guid.NewGuid().ToString("N");

    [JsonPropertyName("title")]
    public string Title { get; set; } = "새 대화";

    [JsonPropertyName("createdAt")]
    public DateTime CreatedAt { get; set; } = DateTime.Now;

    [JsonPropertyName("updatedAt")]
    public DateTime UpdatedAt { get; set; } = DateTime.Now;

    [JsonPropertyName("pinned")]
    public bool Pinned { get; set; } = false;

    /// <summary>대화가 속한 탭. "Chat" | "Cowork" | "Code".</summary>
    [JsonPropertyName("tab")]
    public string Tab { get; set; } = "Chat";

    /// <summary>대화 주제. ChatCategory 상수 중 하나.</summary>
    [JsonPropertyName("category")]
    public string Category { get; set; } = ChatCategory.General;

    /// <summary>사용자가 보이지 않는 시스템 명령어 (대화별 커스텀 프롬프트).</summary>
    [JsonPropertyName("systemCommand")]
    public string SystemCommand { get; set; } = "";

    /// <summary>대화에 연결된 작업 폴더 경로.</summary>
    [JsonPropertyName("workFolder")]
    public string WorkFolder { get; set; } = "";

    /// <summary>첫 사용자 메시지 요약 (검색용, 최대 100자). 저장 시 자동 갱신.</summary>
    [JsonPropertyName("preview")]
    public string Preview { get; set; } = "";

    /// <summary>분기 원본 대화 ID. null이면 원본 대화.</summary>
    [JsonPropertyName("parentId")]
    public string? ParentId { get; set; }

    /// <summary>분기 라벨 (예: "대안 A", "접근법 2").</summary>
    [JsonPropertyName("branchLabel")]
    public string? BranchLabel { get; set; }

    /// <summary>분기 시점의 메시지 인덱스 (parentId의 Messages[index] 이후부터 분기).</summary>
    [JsonPropertyName("branchAtIndex")]
    public int? BranchAtIndex { get; set; }

    // ─── 대화별 설정 (하단 바에서 변경, 대화마다 독립 저장) ───

    /// <summary>파일 접근 권한. null이면 전역 설정 사용. "Auto" | "Ask" | "Deny"</summary>
    [JsonPropertyName("permission")]
    public string? Permission { get; set; }

    /// <summary>데이터 활용 모드. null이면 전역 설정 사용. "active" | "passive" | "none"</summary>
    [JsonPropertyName("dataUsage")]
    public string? DataUsage { get; set; }

    /// <summary>출력 포맷. null이면 전역 설정 사용.</summary>
    [JsonPropertyName("outputFormat")]
    public string? OutputFormat { get; set; }

    /// <summary>무드/디자인 템플릿. null이면 전역 설정 사용.</summary>
    [JsonPropertyName("mood")]
    public string? Mood { get; set; }

    [JsonPropertyName("messages")]
    public List<ChatMessage> Messages { get; set; } = new();
}

/// <summary>대화 내 개별 메시지.</summary>
public class ChatMessage
{
    [JsonPropertyName("role")]
    public string Role { get; set; } = "user";   // "user" | "assistant" | "system"

    [JsonPropertyName("content")]
    public string Content { get; set; } = "";

    [JsonPropertyName("timestamp")]
    public DateTime Timestamp { get; set; } = DateTime.Now;

    /// <summary>피드백 상태. null=없음, "like", "dislike"</summary>
    [JsonPropertyName("feedback")]
    public string? Feedback { get; set; }

    /// <summary>첨부된 파일 경로 목록.</summary>
    [JsonPropertyName("attachedFiles")]
    public List<string>? AttachedFiles { get; set; }

    /// <summary>첨부된 이미지 목록. base64 인코딩된 이미지 데이터.</summary>
    [JsonPropertyName("images")]
    public List<ImageAttachment>? Images { get; set; }
}

/// <summary>이미지 첨부 데이터. LLM Vision API에 전달되는 base64 인코딩 이미지.</summary>
public class ImageAttachment
{
    /// <summary>base64 인코딩된 이미지 데이터.</summary>
    [JsonPropertyName("base64")]
    public string Base64 { get; set; } = "";

    /// <summary>MIME 타입. image/png, image/jpeg 등.</summary>
    [JsonPropertyName("mimeType")]
    public string MimeType { get; set; } = "image/png";

    /// <summary>원본 파일명 또는 설명.</summary>
    [JsonPropertyName("fileName")]
    public string FileName { get; set; } = "";
}
