using System.Windows.Input;
using Avalonia;
using Avalonia.Controls;

namespace DodoSSH.Client.App.Views;

/// <summary>
/// The v5b session shell's host header: the address, and a ghost button that crosses to the other surface.
/// See the remark at the top of SessionHeader.axaml.
/// </summary>
internal sealed partial class SessionHeader : UserControl
{
    /// <summary>What the cross-surface ghost button says — "Open SFTP" or "Open terminal".</summary>
    internal static readonly StyledProperty<string?> OpenLabelProperty =
        AvaloniaProperty.Register<SessionHeader, string?>(nameof(OpenLabel));

    /// <summary>What the cross-surface ghost button runs.</summary>
    /// <remarks>
    /// The terminal usage binds <c>SelectFilesHostCommand</c> with the selected tab as its parameter; the
    /// SFTP usage binds <c>OpenTerminalForFilesHostCommand</c>, which needs none — see the remark on both in
    /// <c>MainWindowViewModel</c> for why the two directions are not symmetrical.
    /// </remarks>
    internal static readonly StyledProperty<ICommand?> OpenCommandProperty =
        AvaloniaProperty.Register<SessionHeader, ICommand?>(nameof(OpenCommand));

    internal static readonly StyledProperty<object?> OpenCommandParameterProperty =
        AvaloniaProperty.Register<SessionHeader, object?>(nameof(OpenCommandParameter));

    /// <summary>What the header says instead of an address, while no session/host context is active.</summary>
    internal static readonly StyledProperty<string?> EmptyTextProperty =
        AvaloniaProperty.Register<SessionHeader, string?>(nameof(EmptyText));

    public SessionHeader() => InitializeComponent();

    internal string? OpenLabel
    {
        get => GetValue(OpenLabelProperty);
        set => SetValue(OpenLabelProperty, value);
    }

    internal ICommand? OpenCommand
    {
        get => GetValue(OpenCommandProperty);
        set => SetValue(OpenCommandProperty, value);
    }

    internal object? OpenCommandParameter
    {
        get => GetValue(OpenCommandParameterProperty);
        set => SetValue(OpenCommandParameterProperty, value);
    }

    internal string? EmptyText
    {
        get => GetValue(EmptyTextProperty);
        set => SetValue(EmptyTextProperty, value);
    }
}
