using System.IO;
using AxCopilot.SDK;
using AxCopilot.Services;
using AxCopilot.Themes;

namespace AxCopilot.Handlers;

/// <summary>
/// L5-5: 배치 파일 이름변경 핸들러. "batchren" 프리픽스로 사용합니다.
/// 예: batchren               → 기능 소개 + 창 열기
///     batchren C:\work\*.xlsx → 해당 패턴 파일을 창에 미리 로드
/// </summary>
public class BatchRenameHandler : IActionHandler
{
    public string? Prefix => "batchren";

    public PluginMetadata Metadata => new(
        "BatchRename",
        "배치 파일 이름변경 — batchren",
        "1.0",
        "AX");

    public Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)
    {
        var q = query.Trim();

        var items = new List<LauncherItem>
        {
            new LauncherItem(
                "배치 파일 이름변경 창 열기",
                "변수 패턴 또는 정규식으로 여러 파일을 한 번에 이름변경합니다",
                null,
                string.IsNullOrWhiteSpace(q) ? "__open__" : q,
                Symbol: Symbols.Rename),

            new LauncherItem(
                "변수: {name} 원본명 · {n} 순번 · {n:3} 세 자리 · {date} 날짜",
                "예: 보고서_{n:3}_{date}  →  보고서_001_2026-04-04.xlsx",
                null, null,
                Symbol: Symbols.Info),

            new LauncherItem(
                "변수: {ext} 확장자 · {date:yyyyMMdd} 날짜 형식 지정",
                "정규식 모드: /old_pattern/new_text/  → 패턴 일치 부분 치환",
                null, null,
                Symbol: Symbols.Info),
        };

        return Task.FromResult<IEnumerable<LauncherItem>>(items);
    }

    public Task ExecuteAsync(LauncherItem item, CancellationToken ct)
    {
        var dataStr = item.Data as string;
        if (dataStr == null) return Task.CompletedTask;

        System.Windows.Application.Current.Dispatcher.Invoke(() =>
        {
            var win = new Views.BatchRenameWindow();

            // 초기 경로 패턴이 지정된 경우 파일 미리 로드
            if (dataStr != "__open__" && !string.IsNullOrWhiteSpace(dataStr))
            {
                try
                {
                    var dir = Path.GetDirectoryName(dataStr);
                    var glob = Path.GetFileName(dataStr);
                    if (!string.IsNullOrWhiteSpace(dir) && Directory.Exists(dir))
                    {
                        var files = Directory.GetFiles(dir, glob ?? "*");
                        Array.Sort(files);
                        win.AddFiles(files);
                    }
                }
                catch (Exception ex)
                {
                    LogService.Warn($"BatchRenameHandler: 초기 로드 실패 — {ex.Message}");
                }
            }

            win.Show();
        });

        return Task.CompletedTask;
    }
}
