using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using AxCopilot.Services;

namespace AxCopilot.Views;

public partial class SettingsWindow
{
    // ─── 버전 표시 ──────────────────────────────────────────────────────────

    /// <summary>
    /// 하단 버전 텍스트를 AxCopilot.csproj &lt;Version&gt; 값에서 동적으로 읽어 설정합니다.
    /// 버전을 올릴 때는 AxCopilot.csproj → &lt;Version&gt; 하나만 수정하면 됩니다.
    /// 이 함수와 SettingsWindow.xaml 의 VersionInfoText 는 항상 함께 유지됩니다.
    /// </summary>
    private void SetVersionText()
    {
        try
        {
            var asm = System.Reflection.Assembly.GetExecutingAssembly();
            // FileVersionInfo 에서 읽어야 csproj <Version> 이 반영됩니다.
            var fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(asm.Location);
            var ver = fvi.ProductVersion ?? fvi.FileVersion ?? "?";
            // 빌드 메타데이터 제거 (예: "1.0.3+gitabcdef" → "1.0.3")
            var plusIdx = ver.IndexOf('+');
            if (plusIdx > 0) ver = ver[..plusIdx];
            VersionInfoText.Text = $"AX Copilot  ·  v{ver}";
        }
        catch (Exception)
        {
            VersionInfoText.Text = "AX Copilot";
        }
    }

    // ─── 핫키 (콤보박스 선택 방식) ──────────────────────────────────────────

    /// <summary>이전 녹화기에서 호출되던 초기화 — 콤보박스 전환 후 무연산 (호환용)</summary>
    private void RefreshHotkeyBadges() { /* 콤보박스 SelectedValue 바인딩으로 대체 */ }

    /// <summary>현재 핫키가 콤보박스 목록에 없으면 항목으로 추가합니다.</summary>
    private void EnsureHotkeyInCombo()
    {
        if (HotkeyCombo == null) return;
        var hotkey = _vm.Hotkey;
        if (string.IsNullOrWhiteSpace(hotkey)) return;

        // 이미 목록에 있는지 확인
        foreach (System.Windows.Controls.ComboBoxItem item in HotkeyCombo.Items)
        {
            if (item.Tag is string tag && tag == hotkey) return;
        }

        // 목록에 없으면 현재 값을 추가
        var display = hotkey.Replace("+", " + ");
        var newItem = new System.Windows.Controls.ComboBoxItem
        {
            Content = $"{display} (사용자 정의)",
            Tag = hotkey
        };
        HotkeyCombo.Items.Insert(0, newItem);
        HotkeyCombo.SelectedIndex = 0;
    }

    /// <summary>Window-level PreviewKeyDown — 핫키 녹화 제거 후 잔여 호출 보호</summary>
    private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { }

    /// <summary>WPF Key → HotkeyParser가 인식하는 문자열 이름.</summary>
    private static string GetKeyName(Key key) => key switch
    {
        Key.Space    => "Space",
        Key.Enter or Key.Return => "Enter",
        Key.Tab      => "Tab",
        Key.Back     => "Backspace",
        Key.Delete   => "Delete",
        Key.Escape   => "Escape",
        Key.Home     => "Home",
        Key.End      => "End",
        Key.PageUp   => "PageUp",
        Key.PageDown => "PageDown",
        Key.Left     => "Left",
        Key.Right    => "Right",
        Key.Up       => "Up",
        Key.Down     => "Down",
        Key.Insert   => "Insert",
        // A–Z
        >= Key.A and <= Key.Z   => key.ToString(),
        // 0–9 (메인 키보드)
        >= Key.D0 and <= Key.D9 => ((int)(key - Key.D0)).ToString(),
        // F1–F12
        >= Key.F1 and <= Key.F12 => key.ToString(),
        // 기호
        Key.OemTilde         => "`",
        Key.OemMinus         => "-",
        Key.OemPlus          => "=",
        Key.OemOpenBrackets  => "[",
        Key.OemCloseBrackets => "]",
        Key.OemPipe or Key.OemBackslash => "\\",
        Key.OemSemicolon     => ";",
        Key.OemQuotes        => "'",
        Key.OemComma         => ",",
        Key.OemPeriod        => ".",
        Key.OemQuestion      => "/",
        _                    => key.ToString()
    };

    private void HotkeyCombo_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        // 콤보박스 선택이 바뀌면 ViewModel의 Hotkey를 업데이트
        // (바인딩이 SelectedValue에 연결되어 자동 처리되지만,
        //  기존 RefreshHotkeyBadges 호출은 콤보박스 도입으로 불필요)
    }

    // ─── 기존 이벤트 핸들러 ──────────────────────────────────────────────────

    private async void BtnTestConnection_Click(object sender, RoutedEventArgs e)
    {
        var btn = sender as Button;
        if (btn != null) btn.Content = "테스트 중...";
        try
        {
            // 현재 UI 값으로 임시 LLM 서비스 생성하여 테스트 (설정 저장/창 닫기 없이)
            var llm = new Services.LlmService(_vm.Service);
            var (ok, msg) = await llm.TestConnectionAsync();
            llm.Dispose();
            CustomMessageBox.Show(msg, ok ? "연결 성공" : "연결 실패",
                MessageBoxButton.OK,
                ok ? MessageBoxImage.Information : MessageBoxImage.Warning);
        }
        catch (Exception ex)
        {
            CustomMessageBox.Show(ex.Message, "오류", MessageBoxButton.OK, MessageBoxImage.Error);
        }
        finally
        {
            if (btn != null) btn.Content = "테스트";
        }
    }
}
