using VoiceCat.Interop;

namespace VoiceCat.App.Forms;

/// <summary>
/// Simple modal dialog for picking one user from a list of all server users.
/// Used by "New Private Message" to let the user send a PM to anyone on the server.
/// </summary>
public sealed class UserPickerDialog : Form
{
    private readonly ListBox _lstUsers;
    private readonly Button _btnOk;
    private readonly Button _btnCancel;

    private readonly List<UserInfo> _users;

    public uint SelectedUserId { get; private set; }

    public UserPickerDialog(List<UserInfo> users)
    {
        _users = users;

        Text = "New Private Message";
        ClientSize = new Size(280, 320);
        MinimumSize = new Size(220, 240);
        FormBorderStyle = FormBorderStyle.FixedDialog;
        MaximizeBox = false;
        MinimizeBox = false;
        StartPosition = FormStartPosition.CenterParent;

        var lbl = new Label
        {
            Text = "Select a user:",
            AutoSize = true,
            Padding = new Padding(6, 6, 6, 2),
            Dock = DockStyle.Top,
        };

        _lstUsers = new ListBox
        {
            Dock = DockStyle.Fill,
            AccessibleName = "User list",
        };
        foreach (var u in users)
            _lstUsers.Items.Add(new UserItem(u.Id, u.Nickname));

        var btnPanel = new FlowLayoutPanel
        {
            Dock = DockStyle.Bottom,
            FlowDirection = FlowDirection.RightToLeft,
            Height = 40,
            Padding = new Padding(4),
            AutoSize = false,
        };

        _btnCancel = new Button
        {
            Text = "Cancel",
            DialogResult = DialogResult.Cancel,
            AutoSize = true,
        };
        _btnOk = new Button
        {
            Text = "OK",
            DialogResult = DialogResult.OK,
            AutoSize = true,
            Enabled = false,
        };
        AcceptButton = _btnOk;
        CancelButton = _btnCancel;

        btnPanel.Controls.Add(_btnCancel);
        btnPanel.Controls.Add(_btnOk);

        Controls.Add(_lstUsers);
        Controls.Add(lbl);
        Controls.Add(btnPanel);

        _lstUsers.SelectedIndexChanged += (_, _) =>
            _btnOk.Enabled = _lstUsers.SelectedItem is UserItem;
        _lstUsers.DoubleClick += (_, _) =>
        {
            if (_lstUsers.SelectedItem is UserItem) DialogResult = DialogResult.OK;
        };
    }

    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (DialogResult == DialogResult.OK && _lstUsers.SelectedItem is UserItem item)
            SelectedUserId = item.UserId;
        base.OnFormClosing(e);
    }

    private sealed class UserItem(uint userId, string nickname)
    {
        public uint UserId { get; } = userId;
        public override string ToString() => nickname;
    }
}
