using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
using UnityEngine.UI;

namespace DesktopVision {
/// <summary>
/// This class is used to create a key on a keyboard
/// </summary>
public class key
{
    /// <summary>
    /// The default value that will be shown on the key
    /// </summary>
    public string label;
    /// <summary>
    /// The key identifier
    /// </summary>
    public string id;
    /// <summary>
    /// The value that will be shown on the key when shifting
    /// </summary>
    public string shiftLabel;
    /// <summary>
    /// the true value of the key
    /// </summary>
    /// <example>
    /// "@" is actually "2" + "Shift"
    /// </example>
    public string trueKey;
    /// <summary>
    /// The percentage width that the key will occupy in its row
    /// </summary>
    public int width = 0;
    /// <summary>
    /// if the key requires shift to be pressed
    /// </summary>
    public bool shiftKey;
    /// <summary>
    /// The actual label of the key
    /// </summary>
    public Text buttonLabel;

    /// <summary>
    /// The key for the keyboard
    /// </summary>
    /// <param name="label">The default value that will be shown on the key</param>
    /// <param name="id">The key identifier</param>
    /// <param name="trueKey">the true value of the key</param>
    /// <param name="width">The percentage width that the key will occupy in its row</param>
    /// <param name="shift">if the key requires shift to be pressed</param>
    /// <param name="trueKey">The true value of the key</param>
    /// 
    public key(string id, string label = null, int width = 0, bool shift = false, string trueKey = null)
    {
        this.id = id;
        this.shiftLabel = label != null ? label : id.ToUpper();
        this.label = label ??= id;
        this.trueKey = trueKey ??= id;
        this.width = width;
    }

}
/// <summary>
/// This class is used to create keyboard layouts for special keys, numbers, and letters
/// </summary>
public class KeyboardLayout
{
    /// <summary>
    /// The letter layout of the keyboard
    /// </summary>
    public List<List<key>> letterLayout;
    /// <summary>
    /// The number layout of the keyboard
    /// </summary>
    public List<List<key>> numberLayout;
    /// <summary>
    /// The special key layout of the keyboard
    /// </summary>
    public List<List<key>>  symbolLayout;
    private List<key> controlKeys;
    private List<key> lettersRowOne, lettersRowTwo, lettersRowThree, lettersRowFour;
    private List<key> numbersRowOne, numbersRowTwo, numbersRowThree, numbersRowFour;
    private List<key> symbolsRowOne, symbolsRowTwo, symbolsRowThree, symbolsRowFour;
    public KeyboardLayout()
    {
        createRows();
        createLayouts();
    }
    private void createRows()
    {
        createControlRow();
        createLetterRows();
        createNumberRows();
        createSymbolsRows();
    }

    private void createLayouts()
    {
        
        letterLayout = new List<List<key>>();
        letterLayout.Add(controlKeys);
        letterLayout.Add(lettersRowOne);
        letterLayout.Add(lettersRowTwo);
        letterLayout.Add(lettersRowThree);
        letterLayout.Add(lettersRowFour);
        
        numberLayout = new List<List<key>>();
        numberLayout.Add(controlKeys);
        numberLayout.Add(numbersRowOne);
        numberLayout.Add(numbersRowTwo);
        numberLayout.Add(numbersRowThree);
        numberLayout.Add(numbersRowFour);
        
        symbolLayout = new List<List<key>>();
        symbolLayout.Add(controlKeys);
        symbolLayout.Add(symbolsRowOne);
        symbolLayout.Add(symbolsRowTwo);
        symbolLayout.Add(symbolsRowThree);
        symbolLayout.Add(symbolsRowFour);
    }
    private void createControlRow()
    {
        controlKeys = new List<key>();
        controlKeys.Add(new key(id: "control", label: "ctrl"));
        controlKeys.Add(new key(id: "alt", label: "alt"));
        controlKeys.Add(new key(id: "delete", label: "delete"));
        controlKeys.Add(new key(id: "tab", label: "tab"));
        controlKeys.Add(new key(id: "CLOSE", label: "close"));
    }

    private void createLetterRows()
    {
        lettersRowOne = new List<key>();
        lettersRowOne.Add(new key(id: "q"));
        lettersRowOne.Add(new key(id: "w"));
        lettersRowOne.Add(new key(id: "e"));
        lettersRowOne.Add(new key(id: "r"));
        lettersRowOne.Add(new key(id: "t"));
        lettersRowOne.Add(new key(id: "y"));
        lettersRowOne.Add(new key(id: "u"));
        lettersRowOne.Add(new key(id: "i"));
        lettersRowOne.Add(new key(id: "o"));
        lettersRowOne.Add(new key(id: "p"));

        lettersRowTwo = new List<key>();
        lettersRowTwo.Add(new key(id: "a"));
        lettersRowTwo.Add(new key(id: "s"));
        lettersRowTwo.Add(new key(id: "d"));
        lettersRowTwo.Add(new key(id: "f"));
        lettersRowTwo.Add(new key(id: "g"));
        lettersRowTwo.Add(new key(id: "h"));
        lettersRowTwo.Add(new key(id: "j"));
        lettersRowTwo.Add(new key(id: "k"));
        lettersRowTwo.Add(new key(id: "l"));

        lettersRowThree = new List<key>();
        lettersRowThree.Add(new key(id: "shift", label: "shift", width: 20));
        lettersRowThree.Add(new key(id: "z"));
        lettersRowThree.Add(new key(id: "x"));
        lettersRowThree.Add(new key(id: "c"));
        lettersRowThree.Add(new key(id: "b"));
        lettersRowThree.Add(new key(id: "n"));
        lettersRowThree.Add(new key(id: "m"));
        lettersRowThree.Add(new key(id: "backspace", label: "Backspace", width: 25));

        lettersRowFour = new List<key>();
        lettersRowFour.Add(new key(id: "toggleNumbers", label: "123", width: 15));
        lettersRowFour.Add(new key(id: "space", label: "", width: 70));
        lettersRowFour.Add(new key(id: "enter", label: "enter", width: 15));
    }
    private void createNumberRows()
    {
        numbersRowOne = new List<key>();
        numbersRowOne.Add(new key(id: "1"));
        numbersRowOne.Add(new key(id: "2"));
        numbersRowOne.Add(new key(id: "3"));
        numbersRowOne.Add(new key(id: "4"));
        numbersRowOne.Add(new key(id: "5"));
        numbersRowOne.Add(new key(id: "6"));
        numbersRowOne.Add(new key(id: "7"));
        numbersRowOne.Add(new key(id: "8"));
        numbersRowOne.Add(new key(id: "9"));
        numbersRowOne.Add(new key(id: "0"));

        numbersRowTwo = new List<key>();
        numbersRowTwo.Add(new key(id: "-", shift: true));
        numbersRowTwo.Add(new key(id: "/", shift: true));
        numbersRowTwo.Add(new key(id: ":", shift: true, trueKey: ";"));
        numbersRowTwo.Add(new key(id: ";", shift: true));
        numbersRowTwo.Add(new key(id: "(", shift: true, trueKey: "9"));
        numbersRowTwo.Add(new key(id: ")", shift: true, trueKey: "0"));
        numbersRowTwo.Add(new key(id: "$", shift: true, trueKey: "4"));
        numbersRowTwo.Add(new key(id: "&", shift: true, trueKey: "7"));
        numbersRowTwo.Add(new key(id: "@", shift: true, trueKey: "2"));
        numbersRowTwo.Add(new key(id: "\"", shift: true, trueKey: "'"));
        

        numbersRowThree = new List<key>();
        numbersRowThree.Add(new key(id: "toggleSymbols", label: "#+=", width: 20, shift: true));
        numbersRowThree.Add(new key(id: ".", shift: true));
        numbersRowThree.Add(new key(id: ","));
        numbersRowThree.Add(new key(id: "?", shift: true, trueKey: "/"));
        numbersRowThree.Add(new key(id: "!", shift: true, trueKey: "1"));
        numbersRowThree.Add(new key(id: "'"));
        numbersRowThree.Add(new key(id: "backspace", label: "Backspace", width: 25));

        numbersRowFour = new List<key>();
        numbersRowFour.Add(new key(id: "toggleLetters", label: "ABC", width: 15));
        numbersRowFour.Add(new key(id: "space", label: "", width: 70));
        numbersRowFour.Add(new key(id: "enter", label: "enter", width: 15));
    }
    private void createSymbolsRows()
    {
        symbolsRowOne = new List<key>();
        symbolsRowOne.Add(new key(id: "["));
        symbolsRowOne.Add(new key(id: "]"));
        symbolsRowOne.Add(new key(id: "{", trueKey: "[", shift: true));
        symbolsRowOne.Add(new key(id: "}", trueKey: "]", shift: true));
        symbolsRowOne.Add(new key(id: "%", trueKey: "3", shift: true));
        symbolsRowOne.Add(new key(id: "^", trueKey: "6", shift: true));
        symbolsRowOne.Add(new key(id: "*", trueKey: "8", shift: true));
        symbolsRowOne.Add(new key(id: "+", trueKey: "=", shift: true));
        symbolsRowOne.Add(new key(id: "="));

        symbolsRowTwo = new List<key>();
        symbolsRowTwo.Add(new key(id: "_", trueKey: "-", shift: true));
        symbolsRowTwo.Add(new key(id: "\\"));
        symbolsRowTwo.Add(new key(id: "`"));
        symbolsRowTwo.Add(new key(id: "|", trueKey: "\\", shift: true));
        symbolsRowTwo.Add(new key(id: "~", trueKey: "`", shift: true));
        symbolsRowTwo.Add(new key(id: "<", trueKey: ",", shift: true));
        symbolsRowTwo.Add(new key(id: ">", trueKey: ".", shift: true));
        

        symbolsRowThree = new List<key>();
        symbolsRowThree.Add(new key(id: "toggleNumbers", label: "123", width: 20, shift: true));
        symbolsRowThree.Add(new key(id: ".", shift: true));
        symbolsRowThree.Add(new key(id: ","));
        symbolsRowThree.Add(new key(id: "?", shift: true, trueKey: "/"));
        symbolsRowThree.Add(new key(id: "!", shift: true, trueKey: "1"));
        symbolsRowThree.Add(new key(id: "'"));
        symbolsRowThree.Add(new key(id: "backspace", label: "Backspace", width: 25));

        symbolsRowFour = new List<key>();
        symbolsRowFour.Add(new key(id: "toggleLetters", label: "ABC", width: 15));
        symbolsRowFour.Add(new key(id: "space", label: "", width: 70));
        symbolsRowFour.Add(new key(id: "enter", label: "enter", width: 15));
    }
}
}