using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;

namespace AxCopilot.Models;

/// <summary>Phase 17-F: 에이전트 권한 설정.</summary>
public class PermissionsConfig
{
    /// <summary>권한 모드. default | acceptEdits | plan | bypassPermissions</summary>
    [JsonPropertyName("mode")]
    public string Mode { get; set; } = "default";

    /// <summary>허용 규칙 목록. 규칙 매칭 시 확인 없이 자동 허용.</summary>
    [JsonPropertyName("allow")]
    public List<PermissionRuleEntry> AllowRules { get; set; } = new();

    /// <summary>차단 규칙 목록. 규칙 매칭 시 즉시 차단.</summary>
    [JsonPropertyName("deny")]
    public List<PermissionRuleEntry> DenyRules { get; set; } = new();
}

/// <summary>권한 규칙 항목 (설정 저장용).</summary>
public class PermissionRuleEntry
{
    [JsonPropertyName("tool")]
    public string ToolName { get; set; } = "";

    [JsonPropertyName("pattern")]
    public string? Pattern { get; set; }

    [JsonPropertyName("behavior")]
    public string Behavior { get; set; } = "allow";  // allow | deny | ask
}

/// <summary>Phase 17-B: 이벤트 로그 설정.</summary>
public class EventLogConfig
{
    [JsonPropertyName("enabled")]
    public bool Enabled { get; set; } = true;

    [JsonPropertyName("retention_days")]
    public int RetentionDays { get; set; } = 30;
}

/// <summary>Phase 17-A: Reflexion(자기성찰) 설정.</summary>
public class ReflexionConfig
{
    [JsonPropertyName("enabled")]
    public bool Enabled { get; set; } = true;

    [JsonPropertyName("max_context_entries")]
    public int MaxContextEntries { get; set; } = 5;

    [JsonPropertyName("evaluate_on_success")]
    public bool EvaluateOnSuccess { get; set; } = true;
}

/// <summary>Phase 17-C: 확장 훅 설정.</summary>
public class ExtendedHooksConfig
{
    // ── 라이프사이클 이벤트 ──────────────────────────────────────────────
    [JsonPropertyName("session_start")]
    public List<ExtendedHookEntryConfig> SessionStart { get; set; } = new();

    [JsonPropertyName("session_end")]
    public List<ExtendedHookEntryConfig> SessionEnd { get; set; } = new();

    [JsonPropertyName("agent_stop")]
    public List<ExtendedHookEntryConfig> AgentStop { get; set; } = new();

    [JsonPropertyName("user_prompt_submit")]
    public List<ExtendedHookEntryConfig> UserPromptSubmit { get; set; } = new();

    // ── 도구 이벤트 ─────────────────────────────────────────────────────
    [JsonPropertyName("pre_tool_use")]
    public List<ExtendedHookEntryConfig> PreToolUse { get; set; } = new();

    [JsonPropertyName("post_tool_use")]
    public List<ExtendedHookEntryConfig> PostToolUse { get; set; } = new();

    [JsonPropertyName("post_tool_use_failure")]
    public List<ExtendedHookEntryConfig> PostToolUseFailure { get; set; } = new();

    // ── 컨텍스트 압축 이벤트 ────────────────────────────────────────────
    [JsonPropertyName("pre_compact")]
    public List<ExtendedHookEntryConfig> PreCompact { get; set; } = new();

    [JsonPropertyName("post_compact")]
    public List<ExtendedHookEntryConfig> PostCompact { get; set; } = new();

    // ── 파일·권한 이벤트 ────────────────────────────────────────────────
    [JsonPropertyName("file_changed")]
    public List<ExtendedHookEntryConfig> FileChanged { get; set; } = new();

    [JsonPropertyName("permission_request")]
    public List<ExtendedHookEntryConfig> PermissionRequest { get; set; } = new();
}

/// <summary>확장 훅 항목 설정.</summary>
public class ExtendedHookEntryConfig
{
    [JsonPropertyName("name")]
    public string Name { get; set; } = "";

    [JsonPropertyName("mode")]
    public string Mode { get; set; } = "command";  // command | http | prompt | agent

    [JsonPropertyName("matcher")]
    public string? Matcher { get; set; }

    [JsonPropertyName("script_path")]
    public string? ScriptPath { get; set; }

    [JsonPropertyName("url")]
    public string? Url { get; set; }

    [JsonPropertyName("prompt")]
    public string? Prompt { get; set; }

    [JsonPropertyName("model")]
    public string? Model { get; set; }

    [JsonPropertyName("enabled")]
    public bool Enabled { get; set; } = true;

    [JsonPropertyName("once")]
    public bool Once { get; set; } = false;

    [JsonPropertyName("async")]
    public bool IsAsync { get; set; } = false;

    [JsonPropertyName("timeout_seconds")]
    public int TimeoutSeconds { get; set; } = 30;

    [JsonPropertyName("status_message")]
    public string? StatusMessage { get; set; }

    [JsonPropertyName("watch_paths")]
    public List<string> WatchPaths { get; set; } = new();
}

/// <summary>사용자 정의 커스텀 프리셋 (settings.json에 저장).</summary>
public class CustomPresetEntry
{
    [JsonPropertyName("id")]
    public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8];

    [JsonPropertyName("label")]
    public string Label { get; set; } = "";

    [JsonPropertyName("description")]
    public string Description { get; set; } = "";

    [JsonPropertyName("systemPrompt")]
    public string SystemPrompt { get; set; } = "";

    [JsonPropertyName("color")]
    public string Color { get; set; } = "#6366F1";

    [JsonPropertyName("symbol")]
    public string Symbol { get; set; } = "\uE713";

    /// <summary>프리셋이 속하는 탭. "Chat" | "Cowork" | "Code"</summary>
    [JsonPropertyName("tab")]
    public string Tab { get; set; } = "Chat";
}

/// <summary>사용자 정의 디자인 무드 (CSS 템플릿).</summary>
public class CustomMoodEntry
{
    [JsonPropertyName("key")]
    public string Key { get; set; } = "";

    [JsonPropertyName("label")]
    public string Label { get; set; } = "";

    [JsonPropertyName("icon")]
    public string Icon { get; set; } = "🎯";

    [JsonPropertyName("description")]
    public string Description { get; set; } = "";

    [JsonPropertyName("css")]
    public string Css { get; set; } = "";
}

/// <summary>저장된 프롬프트 템플릿.</summary>
public class PromptTemplate
{
    [JsonPropertyName("name")]
    public string Name { get; set; } = "";

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

    [JsonPropertyName("icon")]
    public string Icon { get; set; } = "\uE8BD";
}

/// <summary>
/// 사내 LLM 등록 모델. 별칭(UI 표시용) + 암호화된 실제 모델명.
/// 향후 멀티 에이전트에서는 특화 업무와 연결됩니다.
/// </summary>
public class RegisteredModel
{
    /// <summary>UI에 표시할 별칭 (예: "코드 리뷰 전용", "일반 대화")</summary>
    [JsonPropertyName("alias")]
    public string Alias { get; set; } = "";

    /// <summary>실제 모델명. EncryptionEnabled=true일 때 PortableEncrypt로 암호화된 Base64 값, false일 때 평문.</summary>
    [JsonPropertyName("encryptedModelName")]
    public string EncryptedModelName { get; set; } = "";

    /// <summary>이 모델이 연결될 서비스 타입. ollama | vllm</summary>
    [JsonPropertyName("service")]
    public string Service { get; set; } = "ollama";

    /// <summary>이 모델 전용 서버 엔드포인트. 비어있으면 LlmSettings의 기본 엔드포인트 사용.</summary>
    [JsonPropertyName("endpoint")]
    public string Endpoint { get; set; } = "";

    /// <summary>이 모델 전용 API 키. 비어있으면 LlmSettings의 기본 API 키 사용.</summary>
    [JsonPropertyName("apiKey")]
    public string ApiKey { get; set; } = "";

    // ── CP4D (IBM Cloud Pak for Data) 인증 ──────────────────────────────

    /// <summary>인증 방식. bearer (기본) | cp4d</summary>
    [JsonPropertyName("authType")]
    public string AuthType { get; set; } = "bearer";

    /// <summary>CP4D 인증 서버 URL (예: https://cpd-host.example.com)</summary>
    [JsonPropertyName("cp4dUrl")]
    public string Cp4dUrl { get; set; } = "";

    /// <summary>CP4D 사용자 이름</summary>
    [JsonPropertyName("cp4dUsername")]
    public string Cp4dUsername { get; set; } = "";

    /// <summary>CP4D 비밀번호 또는 API 키 (EncryptionEnabled=true 시 암호화 저장)</summary>
    [JsonPropertyName("cp4dPassword")]
    public string Cp4dPassword { get; set; } = "";
}

/// <summary>
/// 자동 모델 라우팅용 모델 능력 점수.
/// 각 모델의 인텐트 카테고리별 적합도를 0.0~1.0으로 지정합니다.
/// 개발자가 하드코딩 기본값을 수정하려면 ModelRouterService.GetDefaultCapabilities()를 참조하세요.
/// </summary>
public class ModelCapability
{
    /// <summary>서비스 타입. ollama | vllm | gemini | claude</summary>
    [JsonPropertyName("service")]
    public string Service { get; set; } = "";

    /// <summary>모델 식별자. 서비스별 모델 ID (예: "gemini-2.5-flash", "claude-sonnet-4-6")</summary>
    [JsonPropertyName("model")]
    public string Model { get; set; } = "";

    /// <summary>UI 표시용 별칭.</summary>
    [JsonPropertyName("alias")]
    public string Alias { get; set; } = "";

    /// <summary>인텐트 카테고리별 적합도 점수. key=카테고리명, value=0.0~1.0</summary>
    [JsonPropertyName("scores")]
    public Dictionary<string, double> Scores { get; set; } = new();

    /// <summary>라우팅 후보에 포함 여부.</summary>
    [JsonPropertyName("enabled")]
    public bool Enabled { get; set; } = true;
}

/// <summary>에이전트 훅 설정 항목. 도구 실행 전/후 사용자 스크립트 실행.</summary>
public class AgentHookEntry
{
    /// <summary>훅 이름 (UI 표시용).</summary>
    [JsonPropertyName("name")]
    public string Name { get; set; } = "";

    /// <summary>대상 도구 이름. "*" = 모든 도구, 특정 도구명 = 해당 도구만.</summary>
    [JsonPropertyName("toolName")]
    public string ToolName { get; set; } = "*";

    /// <summary>실행 타이밍. "pre" = 도구 실행 전, "post" = 도구 실행 후.</summary>
    [JsonPropertyName("timing")]
    public string Timing { get; set; } = "post";

    /// <summary>실행할 스크립트 경로 (.bat, .ps1, .cmd).</summary>
    [JsonPropertyName("scriptPath")]
    public string ScriptPath { get; set; } = "";

    /// <summary>스크립트에 전달할 추가 인수 (선택).</summary>
    [JsonPropertyName("arguments")]
    public string Arguments { get; set; } = "";

    /// <summary>활성화 여부.</summary>
    [JsonPropertyName("enabled")]
    public bool Enabled { get; set; } = true;
}
