using System;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.WinUI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Messaging.UI;


namespace Wino.Mail.WinUI.Controls;

public sealed partial class AccountCreationDialogControl : UserControl, IRecipient<CopyAuthURLRequested>
{
    private string copyClipboardURL = string.Empty;

    public event EventHandler? CancelClicked;

    public AccountCreationDialogState State
    {
        get { return (AccountCreationDialogState)GetValue(StateProperty); }
        set { SetValue(StateProperty, value); }
    }

    public static readonly DependencyProperty StateProperty = DependencyProperty.Register(nameof(State), typeof(AccountCreationDialogState), typeof(AccountCreationDialogControl), new PropertyMetadata(AccountCreationDialogState.Idle, new PropertyChangedCallback(OnStateChanged)));

    public AccountCreationDialogControl()
    {
        InitializeComponent();
    }

    private static void OnStateChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        if (obj is AccountCreationDialogControl dialog)
        {
            dialog.UpdateVisualStates();
        }
    }

    private void UpdateVisualStates() => VisualStateManager.GoToState(this, State.ToString(), false);

    public async void Receive(CopyAuthURLRequested message)
    {
        copyClipboardURL = message.AuthURL;

        await Task.Delay(2000);

        await DispatcherQueue.EnqueueAsync(async () =>
        {
            AuthHelpDialogButton.Visibility = Microsoft.UI.Xaml.Visibility.Collapsed;
        });
    }

    private void ControlLoaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
    {
        WeakReferenceMessenger.Default.Register(this);
    }

    private void ControlUnloaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
    {
        WeakReferenceMessenger.Default.UnregisterAll(this);
    }

    private async void CopyClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
    {
        if (string.IsNullOrEmpty(copyClipboardURL)) return;

        var clipboardService = WinoApplication.Current.Services.GetRequiredService<IClipboardService>();
        await clipboardService.CopyClipboardAsync(copyClipboardURL);
    }


    private void CancelButtonClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) => CancelClicked?.Invoke(this, EventArgs.Empty);
}
