namespace VoiceCat.App.Forms;

partial class MainForm
{
    private System.ComponentModel.IContainer components = null!;

    // Menu bar + toolbar
    private MenuStrip menuStrip = null!;
    private ToolStrip toolStrip = null!;
    private ToolStripButton tsbJoinVoice = null!;
    private ToolStripButton tsbScreenShare = null!;

    // Status bar
    private Label lblStatus = null!;

    // Main left/right split
    private SplitContainer splitMain = null!;

    // Left panel: channel tree on top, user list on bottom
    private SplitContainer splitLeft = null!;
    private Label lblChannels = null!;
    private TreeView tvChannels = null!;
    private Label lblUsers = null!;
    private ListBox lstUsers = null!;

    // Right panel: unified log, compose row, output volume
    private TableLayoutPanel tblRight = null!;
    private Label lblLog = null!;
    private RichTextBox rtbLog = null!;
    private TableLayoutPanel tblCompose = null!;
    private TextBox txtCompose = null!;
    private Button btnSend = null!;
    private Label lblOutputVolume = null!;
    private TrackBar trkOutputVolume = null!;

    // Voice control panel (docked Bottom)
    private Panel pnlVoice = null!;
    private FlowLayoutPanel flpVoiceTop = null!;
    private CheckBox chkMute = null!;
    private CheckBox chkDeafen = null!;
    private Label lblLevel = null!;
    private ProgressBar pbLevel = null!;

    protected override void Dispose(bool disposing)
    {
        if (disposing) components?.Dispose();
        base.Dispose(disposing);
    }

    private void InitializeComponent()
    {
        components = new System.ComponentModel.Container();

        lblStatus = new Label();
        splitMain = new SplitContainer();
        splitLeft = new SplitContainer();
        lblChannels = new Label();
        tvChannels = new TreeView();
        lblUsers = new Label();
        lstUsers = new ListBox();
        tblRight = new TableLayoutPanel();
        lblLog = new Label();
        rtbLog = new RichTextBox();
        tblCompose = new TableLayoutPanel();
        txtCompose = new TextBox();
        btnSend = new Button();
        lblOutputVolume = new Label();
        trkOutputVolume = new TrackBar();
        pnlVoice = new Panel();
        flpVoiceTop = new FlowLayoutPanel();
        chkMute = new CheckBox();
        chkDeafen = new CheckBox();
        lblLevel = new Label();
        pbLevel = new ProgressBar();
        menuStrip = new MenuStrip();
        toolStrip = new ToolStrip();
        tsbJoinVoice = new ToolStripButton();
        tsbScreenShare = new ToolStripButton();

        // ── Status label ──────────────────────────────────────────────────────
        lblStatus.AccessibleName = "Connection status";
        lblStatus.Dock = DockStyle.Top;
        lblStatus.AutoSize = true;
        lblStatus.Padding = new Padding(6, 4, 6, 4);
        lblStatus.TabIndex = 0;
        lblStatus.Text = "Connecting...";

        // ── Channel tree ──────────────────────────────────────────────────────
        lblChannels.Text = "Channels:";
        lblChannels.Dock = DockStyle.Top;
        lblChannels.AutoSize = true;
        lblChannels.Padding = new Padding(4, 4, 4, 2);

        tvChannels.AccessibleName = "Channel list";
        tvChannels.AccessibleDescription =
            "Double-click or press Enter to join a channel. " +
            "Channels marked [password] require a password.";
        tvChannels.Dock = DockStyle.Fill;
        tvChannels.HideSelection = false;
        tvChannels.TabIndex = 0;

        // ── User list ─────────────────────────────────────────────────────────
        lblUsers.Text = "Users in channel:";
        lblUsers.Dock = DockStyle.Top;
        lblUsers.AutoSize = true;
        lblUsers.Padding = new Padding(4, 4, 4, 2);

        lstUsers.AccessibleName = "Users in current channel";
        lstUsers.AccessibleDescription =
            "People in the same channel. Double-click or press Enter for per-user volume settings. " +
            "Talking users are marked (talking).";
        lstUsers.Dock = DockStyle.Fill;
        lstUsers.TabIndex = 1;

        // ── Left split (channels top, users bottom) ───────────────────────────
        splitLeft.Orientation = Orientation.Horizontal;
        splitLeft.Dock = DockStyle.Fill;
        splitLeft.Panel1MinSize = 100;
        splitLeft.Panel2MinSize = 80;
        splitLeft.TabIndex = 0;
        // Keep the resize splitter out of the Tab cycle so focus moves control-to-control.
        splitLeft.TabStop = false;
        // Name the otherwise-anonymous "pane" containers so screen readers announce
        // orientation instead of a stack of unnamed panes.
        splitLeft.AccessibleName = "Channels and users";
        splitLeft.Panel1.AccessibleName = "Channels";
        splitLeft.Panel2.AccessibleName = "Users";
        splitLeft.Panel1.Controls.Add(tvChannels);
        splitLeft.Panel1.Controls.Add(lblChannels);
        splitLeft.Panel2.Controls.Add(lstUsers);
        splitLeft.Panel2.Controls.Add(lblUsers);

        // ── Unified log ───────────────────────────────────────────────────────
        lblLog.Text = "Chat & Activity:";
        lblLog.AutoSize = true;
        lblLog.Padding = new Padding(2, 2, 2, 1);

        rtbLog.AccessibleName = "Chat and activity log";
        rtbLog.AccessibleDescription = "Combined history of chat messages (normal) and activity events (gray).";
        rtbLog.Dock = DockStyle.Fill;
        rtbLog.ReadOnly = true;
        rtbLog.ScrollBars = RichTextBoxScrollBars.Vertical;
        rtbLog.BackColor = SystemColors.Window;
        rtbLog.TabIndex = 0;

        // ── Compose row ───────────────────────────────────────────────────────
        txtCompose.AccessibleName = "Message text";
        txtCompose.AccessibleDescription = "Type your channel message. Press Enter or click Send to send.";
        txtCompose.Dock = DockStyle.Fill;
        txtCompose.TabIndex = 1;

        btnSend.Text = "&Send";
        btnSend.Dock = DockStyle.Fill;
        btnSend.TabIndex = 2;

        tblCompose.ColumnCount = 2;
        tblCompose.RowCount = 1;
        tblCompose.Dock = DockStyle.Fill;
        tblCompose.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
        tblCompose.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 68F));
        tblCompose.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
        tblCompose.Padding = new Padding(0, 3, 0, 0);
        tblCompose.Controls.Add(txtCompose, 0, 0);
        tblCompose.Controls.Add(btnSend, 1, 0);

        // ── Output volume row ─────────────────────────────────────────────────
        lblOutputVolume.Text = "Output volume:";
        lblOutputVolume.AutoSize = true;
        lblOutputVolume.Padding = new Padding(2, 6, 4, 0);

        trkOutputVolume.AccessibleName = "Output volume";
        trkOutputVolume.AccessibleDescription = "Global playback volume for all incoming audio.";
        trkOutputVolume.Minimum = 0;
        trkOutputVolume.Maximum = 100;
        trkOutputVolume.Value = 80;
        trkOutputVolume.TickFrequency = 10;
        trkOutputVolume.SmallChange = 1;
        trkOutputVolume.LargeChange = 10;
        trkOutputVolume.Dock = DockStyle.Fill;
        trkOutputVolume.TabIndex = 3;

        // ── Right table layout ────────────────────────────────────────────────
        tblRight.ColumnCount = 1;
        tblRight.RowCount = 5;
        tblRight.Dock = DockStyle.Fill;
        tblRight.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
        tblRight.RowStyles.Add(new RowStyle(SizeType.AutoSize));        // row 0: lblLog
        tblRight.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));   // row 1: rtbLog
        tblRight.RowStyles.Add(new RowStyle(SizeType.Absolute, 34F));   // row 2: compose
        tblRight.RowStyles.Add(new RowStyle(SizeType.AutoSize));        // row 3: vol label
        tblRight.RowStyles.Add(new RowStyle(SizeType.Absolute, 45F));   // row 4: vol slider
        tblRight.Controls.Add(lblLog, 0, 0);
        tblRight.Controls.Add(rtbLog, 0, 1);
        tblRight.Controls.Add(tblCompose, 0, 2);
        tblRight.Controls.Add(lblOutputVolume, 0, 3);
        tblRight.Controls.Add(trkOutputVolume, 0, 4);

        // ── Main split ────────────────────────────────────────────────────────
        splitMain.Dock = DockStyle.Fill;
        splitMain.Panel1MinSize = 150;
        splitMain.TabIndex = 1;
        splitMain.TabStop = false;
        splitMain.AccessibleName = "Main";
        splitMain.Panel1.AccessibleName = "Channels and users";
        splitMain.Panel2.AccessibleName = "Chat and activity";
        splitMain.Panel1.Controls.Add(splitLeft);
        splitMain.Panel2.Controls.Add(tblRight);

        // ── Voice control panel ───────────────────────────────────────────────
        chkMute.Text = "&Mute mic";
        chkMute.AutoSize = true;
        chkMute.Enabled = false;
        chkMute.Margin = new Padding(0, 4, 6, 0);
        chkMute.TabIndex = 1;

        chkDeafen.Text = "&Deafen";
        chkDeafen.AutoSize = true;
        chkDeafen.Enabled = false;
        chkDeafen.Margin = new Padding(0, 4, 12, 0);
        chkDeafen.TabIndex = 2;

        flpVoiceTop.Dock = DockStyle.Fill;
        flpVoiceTop.AutoSize = false;
        flpVoiceTop.Padding = new Padding(4, 2, 4, 0);
        flpVoiceTop.Controls.Add(chkMute);
        flpVoiceTop.Controls.Add(chkDeafen);

        lblLevel.Text = "Level:";
        lblLevel.AutoSize = true;
        lblLevel.Margin = new Padding(12, 5, 4, 0);

        pbLevel.AccessibleName = "Microphone level";
        pbLevel.AccessibleDescription = "Current input level from the microphone.";
        pbLevel.Width = 120;
        pbLevel.Height = 16;
        pbLevel.Maximum = 100;
        pbLevel.Margin = new Padding(0, 6, 0, 0);
        pbLevel.Style = ProgressBarStyle.Continuous;
        pbLevel.TabStop = false;

        flpVoiceTop.Controls.Add(lblLevel);
        flpVoiceTop.Controls.Add(pbLevel);

        pnlVoice.Dock = DockStyle.Bottom;
        pnlVoice.Height = 38;
        pnlVoice.BorderStyle = BorderStyle.FixedSingle;
        pnlVoice.Padding = new Padding(0);
        pnlVoice.Controls.Add(flpVoiceTop);

        // ── Toolbar ───────────────────────────────────────────────────────────
        tsbJoinVoice.Text = "Join Voice";
        tsbJoinVoice.DisplayStyle = ToolStripItemDisplayStyle.Text;
        tsbJoinVoice.CheckOnClick = false;

        tsbScreenShare.Text = "Share Screen Audio";
        tsbScreenShare.DisplayStyle = ToolStripItemDisplayStyle.Text;
        tsbScreenShare.CheckOnClick = false;

        toolStrip.Dock = DockStyle.Top;
        toolStrip.Items.Add(tsbJoinVoice);
        toolStrip.Items.Add(new ToolStripSeparator());
        toolStrip.Items.Add(tsbScreenShare);
        toolStrip.TabIndex = 1;
        toolStrip.AccessibleName = "Toolbar";

        // ── Menu strip ────────────────────────────────────────────────────────
        menuStrip.AccessibleName = "Main menu";
        menuStrip.Dock = DockStyle.Top;
        menuStrip.TabIndex = 0;
        MainMenuStrip = menuStrip;

        // ── Form ──────────────────────────────────────────────────────────────
        AutoScaleMode = AutoScaleMode.Font;
        ClientSize = new Size(960, 680);
        MinimumSize = new Size(700, 540);
        KeyPreview = true;
        Controls.Add(splitMain);   // DockStyle.Fill
        Controls.Add(pnlVoice);    // DockStyle.Bottom
        Controls.Add(lblStatus);   // DockStyle.Top
        Controls.Add(toolStrip);   // DockStyle.Top (above status)
        Controls.Add(menuStrip);   // DockStyle.Top (topmost)
        StartPosition = FormStartPosition.CenterScreen;
        Text = "VoiceCat";
    }
}
