using System.Collections.Generic;
using System.Windows.Forms;

namespace Tainikey.Mappers
{
    public class TaiYoMapper : IKeyMapper
    {
        private readonly Dictionary<Keys, MapEntry> _map =
            new Dictionary<Keys, MapEntry>
        {
            { Keys.Oemtilde, new MapEntry("𞛿", "𞛿") },
            { Keys.D1, new MapEntry("𞛮", "𞛮") },
            { Keys.D2, new MapEntry("𞛭", "𞛭") },
            { Keys.D3, new MapEntry("𞛪", "𞛪") },
            { Keys.D4, new MapEntry("𞛫", "𞛫") },
            { Keys.D5, new MapEntry("𞛩", "𞛩") },
            { Keys.D6, new MapEntry("𞛧", "𞛧") },
            { Keys.D7, new MapEntry("𞛵", "𞛵") },
            { Keys.D8, new MapEntry("𞛣", "𞛣") },
            { Keys.D9, new MapEntry("𞛢", "𞛢") },
            { Keys.D0, new MapEntry("𞛲", "𞛲") },

            { Keys.OemMinus, new MapEntry("𞛳", "𞛳") },
            { Keys.Oemplus, new MapEntry("𞛴", "𞛴") },

            { Keys.Q, new MapEntry("𞛜", "𞛻") },
            { Keys.W, new MapEntry("𞛝", "𞛞") },
            { Keys.E, new MapEntry("𞛥", "𞛨") },
            { Keys.R, new MapEntry("𞛽", "𞛽") },
            { Keys.T, new MapEntry("𞛌", "𞛍") },
            { Keys.Y, new MapEntry("𞛎", "𞛶") },
            { Keys.U, new MapEntry("𞛤", "𞛤") },
            { Keys.I, new MapEntry("𞛡", "𞛡") },
            { Keys.O, new MapEntry("𞛬", "𞛾") },
            { Keys.P, new MapEntry("𞛑", "𞛒") },

            { Keys.OemOpenBrackets, new MapEntry("𞛓", "𞛷") },
            { Keys.OemCloseBrackets, new MapEntry("𞛔", "𞛕") },

            { Keys.A, new MapEntry("𞛠", "𞛦") },
            { Keys.S, new MapEntry("𞛇", "𞛈") },
            { Keys.D, new MapEntry("𞛋", "𞛸") },
            { Keys.F, new MapEntry("𞛼", "𞛼") },
            { Keys.G, new MapEntry("𞛅", "𞛯") },
            { Keys.H, new MapEntry("𞛚", "𞛛") },
            { Keys.J, new MapEntry("𞛗", "𞛺") },
            { Keys.K, new MapEntry("𞛀", "𞛁") },
            { Keys.L, new MapEntry("𞛘", "𞛘") },

            { Keys.OemSemicolon, new MapEntry("𞜉", "𞜉") },
            { Keys.OemQuotes, new MapEntry("𞛄", "𞛄") },

            { Keys.Z, new MapEntry("𞛉", "𞛊") },
            { Keys.X, new MapEntry("𞛂", "𞛃") },
            { Keys.C, new MapEntry("𞛆", "𞛟") },
            { Keys.V, new MapEntry("𞛙", "𞛙") },
            { Keys.B, new MapEntry("𞛐", "𞛹") },
            { Keys.N, new MapEntry("𞛏", "𞛰") },
            { Keys.M, new MapEntry("𞛖", "𞛱") },

            { Keys.Oemcomma, new MapEntry("、", "𞜊") },
            { Keys.OemPeriod, new MapEntry("。", "𞜋") },
        };

        public bool TryMap(Keys key, bool shift, out string output)
        {
            if (_map.TryGetValue(key, out MapEntry v))
            {
                output = shift ? v.Shift : v.Normal;
                return true;
            }

            output = null;
            return false;
        }
    }
}
