using System;
using System.Threading.Tasks;
using ClaudeDo.Ui.ViewModels;
using ClaudeDo.Ui.ViewModels.Conflicts;
using ClaudeDo.Ui.ViewModels.Islands;
using ClaudeDo.Ui.ViewModels.Modals;

namespace ClaudeDo.Ui.Services;

/// <summary>
/// Single seam for opening modal dialogs. Replaces the per-modal <c>Show*Modal</c>
/// Func callbacks that were previously wired separately on the shell and the lists
/// island (and the Confirm/Error dialogs duplicated in both code-behinds). The view
/// layer supplies the implementation (<see cref="ClaudeDo.Ui.Views.WindowDialogService"/>);
/// callers build + initialize the VM and hand it here to be shown.
/// </summary>
public interface IDialogService
{
    Task ShowAboutAsync(AboutModalViewModel vm);
    Task ShowWeeklyReportAsync(WeeklyReportModalViewModel vm);
    Task ShowSettingsAsync(SettingsModalViewModel vm);
    Task ShowListSettingsAsync(ListSettingsModalViewModel vm);
    Task ShowRepoImportAsync(RepoImportModalViewModel vm);
    Task ShowWorktreesOverviewAsync(WorktreesOverviewModalViewModel vm);
    Task ShowWorkerConnectionAsync(WorkerConnectionModalViewModel vm);
    Task ShowConflictResolverAsync(ConflictResolverViewModel vm);
    Task ShowLogVisualizerAsync(LogVisualizerViewModel vm);

    /// <summary>Modal yes/no confirmation. Returns true only when confirmed.</summary>
    Task<bool> ConfirmAsync(string message);

    /// <summary>Modal error notice with a single dismiss button.</summary>
    Task ShowErrorAsync(string message);

    /// <summary>Show (or re-show + focus) the modeless Mission Control window. Lazily created; hides on close.</summary>
    void ShowMissionControl(MissionControlViewModel vm);

    /// <summary>Show a detached monitor in its own window; <paramref name="onClosed"/> re-docks it when that window closes.</summary>
    void ShowDetachedMonitor(TaskMonitorViewModel monitor, Action onClosed);
}
