using System.Diagnostics;
using System.IO;
using System.Windows;
using AxCopilot.Models;
using AxCopilot.SDK;
using AxCopilot.Services;
using AxCopilot.Themes;

namespace AxCopilot.ViewModels;

public partial class LauncherViewModel
{
    // ─── 파일 액션 서브메뉴 ───────────────────────────────────────────────────

    public void EnterActionMode(LauncherItem item)
    {
        if (!_settings.Settings.Launcher.EnableActionMode) return;
        if (item.Data is not IndexEntry entry) return;

        _actionSourceItem = item;
        _savedQuery = _inputText;
        IsActionMode = true;

        var path = Environment.ExpandEnvironmentVariables(entry.Path);
        var isDir = Directory.Exists(path);
        var name = Path.GetFileName(path);

        Results.Clear();
        Results.Add(MakeAction("경로 복사",
            path, FileAction.CopyPath, Symbols.Clipboard, "#8764B8"));

        Results.Add(MakeAction("전체 경로 복사",
            path, FileAction.CopyFullPath, Symbols.Clipboard, "#C55A11"));

        Results.Add(MakeAction("파일 탐색기에서 열기",
            "Explorer에서 위치 선택됨으로 표시", FileAction.OpenExplorer, Symbols.Folder, "#107C10"));

        if (!isDir)
            Results.Add(MakeAction("관리자 권한으로 실행",
                "UAC 권한 상승 후 실행", FileAction.RunAsAdmin, Symbols.Lock, "#C50F1F"));

        Results.Add(MakeAction("터미널에서 열기",
            isDir ? path : Path.GetDirectoryName(path) ?? path,
            FileAction.OpenTerminal, Symbols.Terminal, "#323130"));

        if (!isDir)
            Results.Add(MakeAction("파일 속성 보기",
                "Windows 속성 대화 상자 열기", FileAction.ShowProperties, Symbols.Info, "#6B2C91"));

        Results.Add(MakeAction("이름 바꾸기",
            name, FileAction.Rename, Symbols.Rename, "#D97706"));

        Results.Add(MakeAction("휴지통으로 삭제",
            "복구 가능한 삭제  ·  확인 후 실행", FileAction.DeleteToRecycleBin, Symbols.Delete, "#C50F1F"));

        SelectedItem = Results.FirstOrDefault();

        static LauncherItem MakeAction(string title, string subtitle,
            FileAction action, string symbol, string colorHex)
        {
            var data = new FileActionData(subtitle, action);
            return new LauncherItem(title, subtitle, null, data, Symbol: symbol);
        }
    }

    public void ExitActionMode()
    {
        IsActionMode = false;
        _actionSourceItem = null;
        // 이전 검색 쿼리 복원
        var q = _savedQuery;
        _savedQuery = "";
        _ = SearchAsync(q);
    }

    private static void ExecuteFileAction(FileActionData data)
    {
        var path = data.Path;
        switch (data.Action)
        {
            case FileAction.CopyPath:
                Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(path));
                break;

            case FileAction.OpenExplorer:
                if (File.Exists(path))
                    Process.Start("explorer.exe", $"/select,\"{path}\"");
                else
                    Process.Start("explorer.exe", $"\"{path}\"");
                break;

            case FileAction.RunAsAdmin:
                try
                {
                    Process.Start(new ProcessStartInfo(path)
                        { UseShellExecute = true, Verb = "runas" });
                }
                catch (Exception ex)
                {
                    LogService.Warn($"관리자 실행 취소: {ex.Message}");
                }
                break;

            case FileAction.CopyFullPath:
                Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(path));
                break;

            case FileAction.ShowProperties:
                try
                {
                    var psi = new ProcessStartInfo("explorer.exe")
                    {
                        Arguments = $"/select,\"{path}\"",
                        UseShellExecute = true
                    };
                    Process.Start(psi);
                    // Shell property dialog
                    var propInfo = new ProcessStartInfo
                    {
                        FileName = "rundll32.exe",
                        Arguments = $"shell32.dll,ShellExec_RunDLL \"properties\" \"{path}\"",
                        UseShellExecute = false
                    };
                    // 대안: Shell verb "properties"
                    try
                    {
                        Process.Start(new ProcessStartInfo(path)
                            { UseShellExecute = true, Verb = "properties" });
                    }
                    catch (Exception) { /* 일부 파일 형식에서 지원 안됨 */ }
                }
                catch (Exception ex) { LogService.Warn($"속성 열기 실패: {ex.Message}"); }
                break;

            case FileAction.Rename:
                // 런처에서 rename 핸들러로 전달
                // ExitActionMode 후 InputText가 rename 프리픽스로 설정됨
                break;

            case FileAction.DeleteToRecycleBin:
                // LauncherWindow.xaml.cs의 ExecuteSelected에서 확인 다이얼로그 처리
                break;

            case FileAction.OpenTerminal:
                var dir = File.Exists(path) ? Path.GetDirectoryName(path) ?? path : path;
                try { Process.Start("wt.exe", $"-d \"{dir}\""); }
                catch (Exception)
                {
                    try { Process.Start("cmd.exe", $"/k cd /d \"{dir}\""); }
                    catch (Exception ex) { LogService.Warn($"터미널 열기 실패: {ex.Message}"); }
                }
                break;
        }
    }
}
