using System.IO; using AxCopilot.SDK; using AxCopilot.Services; using AxCopilot.Themes; namespace AxCopilot.Handlers; /// /// L5-5: 배치 파일 이름변경 핸들러. "batchren" 프리픽스로 사용합니다. /// 예: batchren → 기능 소개 + 창 열기 /// batchren C:\work\*.xlsx → 해당 패턴 파일을 창에 미리 로드 /// public class BatchRenameHandler : IActionHandler { public string? Prefix => "batchren"; public PluginMetadata Metadata => new( "BatchRename", "배치 파일 이름변경 — batchren", "1.0", "AX"); public Task> GetItemsAsync(string query, CancellationToken ct) { var q = query.Trim(); var items = new List { 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>(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; } }