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

namespace Tainikey.Mappers
{
    public class TaiVietMapper : IKeyMapper
    {
        private readonly Dictionary<Keys, MapEntry> _map =
            new Dictionary<Keys, MapEntry>
        {
            // HÀNG 1: 123
            { 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("ꪾ", "ꪽ") },

            // HÀNG 2: QWERTY
            { 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("ꪞ", "ꪟ") },

            // HÀNG 3: ASDFGHJKL
            { 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("ꪩ", "ꪨ") },

            // HÀNG 4: ZXCVBNM
            { 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("ꪣ", "ꪢ") }
        };

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

            output = null;
            return false;
        }
    }
}
