using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Terminal.Gui;

namespace UICatalog.Scenarios;

[ScenarioMetadata ("Simple Text Alignment", "Demonstrates horizontal text alignment")]
[ScenarioCategory ("Text and Formatting")]
public class TextAlignments : Scenario
{
    public override void Setup ()
    {
        Win.X = 10;
        Win.Width = Dim.Fill (10);

        var txt = "Hello world, how are you today? Pretty neat!";
        var unicodeSampleText = "A Unicode sentence (Ð¿ÑÐ Ð²ÐµÑ) has words.";

        List<TextAlignment> alignments = Enum.GetValues (typeof (TextAlignment)).Cast<TextAlignment> ().ToList ();
        Label [] singleLines = new Label [alignments.Count];
        Label [] multipleLines = new Label [alignments.Count];

        var multiLineHeight = 5;

        foreach (TextAlignment alignment in alignments)
        {
            singleLines [(int)alignment] = new Label
            {
                TextAlignment = alignment,
                X = 1,
                AutoSize = false,
                Width = Dim.Fill (1),
                Height = 1,
                ColorScheme = Colors.ColorSchemes ["Dialog"],
                Text = txt
            };

            multipleLines [(int)alignment] = new Label
            {
                TextAlignment = alignment,
                X = 1,
                AutoSize = false,
                Width = Dim.Fill (1),
                Height = multiLineHeight,
                ColorScheme = Colors.ColorSchemes ["Dialog"],
                Text = txt
            };
        }

        // Add a label & text field so we can demo IsDefault
        var editLabel = new Label { X = 0, Y = 0, Text = "Text:" };
        Win.Add (editLabel);

        var edit = new TextView
        {
            X = Pos.Right (editLabel) + 1,
            Y = Pos.Y (editLabel),
            Width = Dim.Fill ("Text:".Length + "  Unicode Sample".Length + 2),
            Height = 4,
            ColorScheme = Colors.ColorSchemes ["TopLevel"],
            Text = txt
        };

        edit.TextChanged += (s, e) =>
                            {
                                foreach (TextAlignment alignment in alignments)
                                {
                                    singleLines [(int)alignment].Text = edit.Text;
                                    multipleLines [(int)alignment].Text = edit.Text;
                                }
                            };
        Win.Add (edit);

        var unicodeSample = new Button { X = Pos.Right (edit) + 1, Y = 0, Text = "Unicode Sample" };
        unicodeSample.Accept += (s, e) => { edit.Text = unicodeSampleText; };
        Win.Add (unicodeSample);

        var update = new Button { X = Pos.Right (edit) + 1, Y = Pos.Bottom (edit) - 1, Text = "_Update" };

        update.Accept += (s, e) =>
                          {
                              foreach (TextAlignment alignment in alignments)
                              {
                                  singleLines [(int)alignment].Text = edit.Text;
                                  multipleLines [(int)alignment].Text = edit.Text;
                              }
                          };
        Win.Add (update);

        var enableHotKeyCheckBox = new CheckBox
        {
            X = 0, Y = Pos.Bottom (edit), Text = "Enable Hotkey (_)", Checked = false
        };

        Win.Add (enableHotKeyCheckBox);

        var label = new Label
        {
            Y = Pos.Bottom (enableHotKeyCheckBox) + 1, Text = "Demonstrating single-line (should clip):"
        };
        Win.Add (label);

        foreach (TextAlignment alignment in alignments)
        {
            label = new Label { Y = Pos.Bottom (label), Text = $"{alignment}:" };
            Win.Add (label);
            singleLines [(int)alignment].Y = Pos.Bottom (label);
            Win.Add (singleLines [(int)alignment]);
            label = singleLines [(int)alignment];
        }

        txt += "\nSecond line\n\nFourth Line.";
        label = new Label { Y = Pos.Bottom (label), Text = "Demonstrating multi-line and word wrap:" };
        Win.Add (label);

        foreach (TextAlignment alignment in alignments)
        {
            label = new Label { Y = Pos.Bottom (label), Text = $"{alignment}:" };
            Win.Add (label);
            multipleLines [(int)alignment].Y = Pos.Bottom (label);
            Win.Add (multipleLines [(int)alignment]);
            label = multipleLines [(int)alignment];
        }

        enableHotKeyCheckBox.Toggled += (s, e) =>
                                        {
                                            foreach (TextAlignment alignment in alignments)
                                            {
                                                singleLines [(int)alignment].HotKeySpecifier =
                                                    e.OldValue == true ? (Rune)0xffff : (Rune)'_';

                                                multipleLines [(int)alignment].HotKeySpecifier =
                                                    e.OldValue == true ? (Rune)0xffff : (Rune)'_';
                                            }

                                            Win.SetNeedsDisplay ();
                                            Win.LayoutSubviews ();
                                        };
    }
}
