namespace AxCopilot.Services.Agent.SlashCommands;

/// <summary>
/// Phase 22: 슬래시 명령 인터페이스 (Command 패턴).
/// /compact, /clear, /memory, /model 등 내장 명령과 스킬 명령을 통합 처리합니다.
/// </summary>
public interface ISlashCommand
{
    /// <summary>명령 이름 (소문자). 예: "compact", "memory"</summary>
    string Name { get; }

    /// <summary>별칭 목록. 예: /config → /settings</summary>
    string[] Aliases { get; }

    /// <summary>명령 설명 (도움말 표시용).</summary>
    string Description { get; }

    /// <summary>인수 힌트 (자동완성 표시용). null이면 인수 없음.</summary>
    string? ArgumentHint { get; }

    /// <summary>활성 세션이 필요한 명령인지 여부.</summary>
    bool RequiresActiveSession { get; }

    /// <summary>명령을 실행합니다.</summary>
    /// <param name="arguments">명령 뒤에 전달된 인수 문자열</param>
    /// <param name="context">채팅 컨텍스트 (서비스 접근)</param>
    /// <param name="ct">취소 토큰</param>
    Task ExecuteAsync(string arguments, IAgentChatContext context, CancellationToken ct);
}

/// <summary>
/// 슬래시 명령이 채팅 서비스에 접근하기 위한 인터페이스 (DIP).
/// ChatWindow.xaml.cs에서 구현하여 주입합니다.
/// </summary>
public interface IAgentChatContext
{
    /// <summary>LLM 서비스.</summary>
    LlmService Llm { get; }

    /// <summary>설정 서비스.</summary>
    SettingsService Settings { get; }

    /// <summary>스킬 로더 (SkillService 정적 접근 래퍼).</summary>
    IReadOnlyList<SkillDefinition> LoadedSkills { get; }

    /// <summary>훅 목록 (현재 설정 기반).</summary>
    IReadOnlyList<ExtendedHookEntry> Hooks { get; }

    /// <summary>현재 활성 탭. "Chat" | "Cowork" | "Code".</summary>
    string ActiveTab { get; }

    /// <summary>작업 폴더 경로.</summary>
    string WorkFolder { get; }

    /// <summary>슬래시 명령 레지스트리 (자기 참조, /help에서 사용).</summary>
    SlashCommandRegistry CommandRegistry { get; }

    /// <summary>시스템 메시지를 채팅에 표시합니다.</summary>
    Task SendSystemMessageAsync(string message);

    /// <summary>사용자 입력을 대기합니다. null이면 취소.</summary>
    Task<string?> PromptUserAsync(string question);

    /// <summary>채팅 메시지를 모두 지웁니다.</summary>
    void ClearMessages();

    /// <summary>세션 헤더 (모델명, 모드 등)를 갱신합니다.</summary>
    void UpdateSessionHeader();

    /// <summary>설정 패널을 토글합니다.</summary>
    void ToggleSettingsPanel();
}
