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

namespace Tainikey.Mappers
{
    public enum InputMode { None, SueTai, LaiTai }

    public class KeyboardEngine
    {
        private readonly Dictionary<InputMode, IKeyMapper> _mappers;
        public InputMode Mode { get; set; } = InputMode.None;

        // Khai báo thiếu gây lỗi CS1061 trong image_f3d09a.jpg
        public char? LastTypedChar { get; set; } = null;
        public string LastTypedString { get; private set; } = "";

        public KeyboardEngine()
        {
            var special = new SpecialMapper { Engine = this };

            _mappers = new Dictionary<InputMode, IKeyMapper>
            {
                { InputMode.SueTai, new TaiVietMapper() },
                { InputMode.LaiTai, new TaiYoMapper() },
                { InputMode.None, special }
            };
        }

        public bool ProcessKey(Keys key, bool shift, out string output)
        {
            output = null;

            // 1. Reset buffer khi Space/Điều hướng
            if (key == Keys.Space || (key >= Keys.Left && key <= Keys.Down))
            {
                LastTypedString = "";
                LastTypedChar = null;
                return false;
            }

            // 2. Ưu tiên SpecialMapper (Dấu - và _)
            var specialMapper = _mappers[InputMode.None] as SpecialMapper;
            if (specialMapper != null && specialMapper.TryMap(key, shift, out output))
            {
                // Khi dùng dấu tổ hợp, ta không cập nhật LastTypedChar 
                // để người dùng có thể gõ thêm dấu khác nếu muốn (ví dụ gõ -- ra 2 dấu ngang)
                return true;
            }

            // 3. Bộ gõ Thái (SueTai / LaiTai)
            if (Mode != InputMode.None && _mappers.ContainsKey(Mode))
            {
                if (_mappers[Mode].TryMap(key, shift, out output)) return true;
            }

            // 4. Lưu buffer phím chữ cái bình thường
            if (key >= Keys.A && key <= Keys.Z)
            {
                char c = shift ? (char)key : char.ToLower((char)key);
                LastTypedChar = c;
                LastTypedString += c;
                if (LastTypedString.Length > 20) LastTypedString = LastTypedString.Substring(1);
            }

            return false;
        }

        public void FeedChar(string output)
        {
            if (string.IsNullOrEmpty(output)) return;
            foreach (char ch in output)
            {
                if (ch == '\b')
                {
                    if (LastTypedString.Length > 0)
                        LastTypedString = LastTypedString.Substring(0, LastTypedString.Length - 1);
                }
                else
                {
                    LastTypedString += ch;
                }
            }

            // Cập nhật lại LastTypedChar để SpecialMapper biết ký tự vừa gõ là gì (ví dụ: 'â' hoặc 'ơ')
            if (LastTypedString.Length > 0)
                LastTypedChar = LastTypedString[LastTypedString.Length - 1];
        }
    }
}