using Pilz.UI.Extensions;
using Pilz.UI.Telerik.Extensions;
using Telerik.WinControls;

namespace Pilz.UI.Telerik.Dialogs;

partial class RadDialogBase
{
    public delegate void DialogLoadingEventHandler(DialogLoadingEventArgs e);
    public delegate void DialogClosedEventHandler(DialogClosedEventArgs e);

    public static event DialogLoadingEventHandler? DialogLoading;
    public static event DialogClosedEventHandler? DialogClosed;

    public static T Show<T>(string? title, object? icon, object? tag = null) where T : RadFlyoutBase
    {
        return Show<T>(null, title, icon, tag);
    }

    public static T ShowDialog<T>(string? title, object? icon, object? tag = null) where T : RadFlyoutBase
    {
        return ShowDialog<T>(null, title, icon, tag);
    }

    public static T Show<T>(IWin32Window? parent, string? title, object? icon, object? tag = null) where T : RadFlyoutBase
    {
        return Show(CreatePanelInstance<T>(tag), parent, title, icon);
    }

    public static T ShowDialog<T>(IWin32Window? parent, string? title, object? icon, object? tag = null) where T : RadFlyoutBase
    {
        return ShowDialog(CreatePanelInstance<T>(tag), parent, title, icon);
    }

    public static T Show<T>(T dialogPanel, string? title, object? icon) where T : RadFlyoutBase
    {
        return Show(dialogPanel, null, title, icon);
    }

    public static T ShowDialog<T>(T dialogPanel, string? title, object? icon) where T : RadFlyoutBase
    {
        return ShowDialog(dialogPanel, null, title, icon);
    }

    public static T Show<T>(T dialogPanel, IWin32Window? parent, string? title, object? icon) where T : RadFlyoutBase
    {
        CreateForm(dialogPanel, parent, title, icon).Show();
        return dialogPanel;
    }

    public static T ShowDialog<T>(T dialogPanel, IWin32Window? parent, string? title, object? icon) where T : RadFlyoutBase
    {
        CreateForm(dialogPanel, parent, title, icon).ShowDialog();
        return dialogPanel;
    }

    private static T CreatePanelInstance<T>(object? tag) where T : RadFlyoutBase
    {
        T dialogPanel = Activator.CreateInstance<T>();
        dialogPanel.Tag = tag;
        return dialogPanel;
    }

    private static RadDialogBase CreateForm<T>(T dialogPanel, IWin32Window? parent, string? title, object? icon) where T : RadFlyoutBase
    {
        dialogPanel.Dock = DockStyle.Fill;

        if (icon is RadSvgImage svg)
            icon = svg.ToImage();
        if (icon is Image img)
            icon = img.ToIcon();

        var dialog = new RadDialogBase(dialogPanel)
        {
            Text = title,
            Icon = icon as Icon,
            StartPosition = parent == null ? FormStartPosition.CenterScreen : FormStartPosition.CenterParent,
            ClientSize = dialogPanel.Size
        };

        dialog.Controls.Add(dialogPanel);

        return dialog;
    }
}
