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

public class KeyboardManager : MonoBehaviour
{
    public enum ShiftMode { Lowercase, NextUppercase, Uppercase }

    [Header("UI References")]
    public TMP_Text nameTextField;
    public TMP_Text scoreTextField;
    public Button shiftButton;
    public Button backspaceButton;
    public Button enterButton;
    public Button spaceButton;

    [Header("Letter Buttons")]
    public List<Button> letterButtons;

    public int inputTextLimit = 12;
    public ScoreBoard scoreBoard; // Reference to ScoreBoard
    public string placeHolderText; 
    private string _input = "";
    private float _currentScore;
    private ShiftMode _shiftMode = ShiftMode.Lowercase;

    void Start()
    {
        foreach (var button in letterButtons)
        {
            button.onClick.AddListener(() => OnLetterPressed(button));
        }

        shiftButton.onClick.AddListener(OnShiftPressed);
        backspaceButton.onClick.AddListener(OnBackspacePressed);
        enterButton.onClick.AddListener(OnEnterPressed);
        spaceButton.onClick.AddListener(OnSpacePressed);



        gameObject.SetActive(false); // Start disabled
    }

    public void Activate(float score, Transform assignedTransform)
    {
        _currentScore = score;
        _input = "";
        nameTextField.text = placeHolderText;
        Debug.Log(_currentScore);
        Debug.Log(_currentScore.ToString());
        scoreTextField.text = _currentScore.ToString();
        gameObject.SetActive(true);

        gameObject.transform.position = assignedTransform.position;
        gameObject.transform.rotation = assignedTransform.rotation;

    }

    public void DeActivate()
    {
        gameObject.SetActive(false);
    }

    private void addToInput(string newInput)
    {

        if (_input.Length < inputTextLimit)
            _input += newInput;
    }

    void OnLetterPressed(Button button)
    {
        var label = button.GetComponentInChildren<TMP_Text>();
        if (label == null) return;

        string letter = label.text;

        switch (_shiftMode)
        {
            case ShiftMode.Lowercase:
                addToInput(letter.ToLower());
                break;
            case ShiftMode.Uppercase:
                addToInput(letter.ToUpper());
                break;
            case ShiftMode.NextUppercase:
                addToInput(letter.ToUpper());
                _shiftMode = ShiftMode.Lowercase;
                UpdateKeyLabels();
                break;
        }

        UpdateOutput();
    }

    void OnShiftPressed()
    {
        _shiftMode = _shiftMode switch
        {
            ShiftMode.Lowercase => ShiftMode.NextUppercase,
            ShiftMode.NextUppercase => ShiftMode.Uppercase,
            ShiftMode.Uppercase => ShiftMode.Lowercase,
            _ => ShiftMode.Lowercase
        };

        UpdateKeyLabels();
    }

    void OnBackspacePressed()
    {
        if (_input.Length > 0)
            _input = _input.Substring(0, _input.Length - 1);
        UpdateOutput();
    }

    void OnEnterPressed()
    {
        if (_input.Length > 0)
        {
            scoreBoard.SaveScore(_input, _currentScore);
            gameObject.SetActive(false);
        }
    }

    void OnSpacePressed()
    {
        addToInput(" ");
        UpdateOutput();
    }

    void UpdateOutput()
    {
        nameTextField.text = _input;
    }

    void UpdateKeyLabels()
    {
        foreach (var button in letterButtons)
        {
            var label = button.GetComponentInChildren<TMP_Text>();
            if (label == null) continue;

            label.text = _shiftMode == ShiftMode.Lowercase ? label.text.ToLower() : label.text.ToUpper();
        }
    }
}