using UnityEngine;
using UnityEngine.UI;
using Unity.Netcode;
using UnityEngine.InputSystem;
using System.Collections.Generic;
using Unity.VisualScripting;
using TMPro;
using Unity.VisualScripting.Antlr3.Runtime;

public class UiManager : NetworkBehaviour {

    public string Class = "";

    // In-game UI
    [SerializeField] Canvas inGameUI;
    [SerializeField] Slider manaSlider;
    [SerializeField] Slider healthSlider;
    [SerializeField] Slider ammoSlider;

    // Starting UI & classes
    [SerializeField] Canvas StartingUI;
    [SerializeField] Button LancerOption;
    [SerializeField] Button MageOption;
    [SerializeField] GameObject LeaveSessionStuff;
    [SerializeField] GameObject ShowLobbyCodeButton;
    [SerializeField] Canvas MultiplayerCanvas;
    [SerializeField] GameObject MultiplayerWidgetCanvas;
    [SerializeField] TMP_Text ClassTextBox;
    [SerializeField] TMP_Text ActualClassTextBox;

    // player scripts
    public PlayerStatHandler PlayerStatHandler;
    public PlayerSpells PlayerSpells;
    public PlayerMovement PlayerMovement;
    public BulletScript BulletScript;

    public List<GameObject> RandomPartsOfTheMultiplayerUi = new List<GameObject>();
    public List<GameObject> ChildrenOfManaSlider = new List<GameObject>();
    public List<GameObject> ChildrenOfAmmoSlider = new List<GameObject>();

    // Teleport points
    [SerializeField] GameObject TestMapTeleportPoint;
    [SerializeField] GameObject TutorialMapTeleportPoint;
    [SerializeField] GameObject SpawnBoxTeleportPoint;




    // for PlayerMovement.cs
    public float classMovespeedMultiplier;
    private float lancerClassMovespeedMultiplier = 1.25f;
    private float mageClassMovespeedMultiplier = 1f;

    private ulong clientId;

    private bool hasConnected = false;

    private float mouseLockTimer = 0f;
    private float mouseLockCooldownTimer = 0.2f;

    // inputs
    private InputAction MouseMode;

    void Start()
    {
        // disable the in-game UI until a class and lobby has been chosen
        inGameUI.enabled = false;
        manaSlider.enabled = false;
        healthSlider.enabled = false;
        ammoSlider.enabled = false;

        LancerOption.enabled = false;
        MageOption.enabled = false;
        StartingUI.enabled = false;

        MultiplayerCanvas.enabled = true;

        LeaveSessionStuff.SetActive(false);

        NetworkManager.Singleton.OnClientConnectedCallback += ClientConnected;

        Debug.Log("Start Function - phase 0 - everything set to its proper value + network client grabbed");
    }

    private void ClientConnected(ulong id)
    {
        if (id == NetworkManager.Singleton.LocalClientId)
        {
            // disable the in-game UI until a class and lobby has been chosen
            inGameUI.enabled = false;
            manaSlider.enabled = false;
            healthSlider.enabled = false;
            ammoSlider.enabled = false;

            if (IsServer)
            {
                LancerOption.enabled = false;
                MageOption.enabled = false;
                StartingUI.enabled = false;
            }
            else
            {
                LancerOption.enabled = true;
                MageOption.enabled = true;
                StartingUI.enabled = true;
            }
            Debug.Log("lancer option enabled? " + LancerOption.enabled);

            LeaveSessionStuff.SetActive(false);        

            PlayerStatHandler = NetworkManager.Singleton.ConnectedClients[id].PlayerObject.GetComponent<PlayerStatHandler>();
            PlayerSpells = NetworkManager.Singleton.ConnectedClients[id].PlayerObject.GetComponent<PlayerSpells>();
            PlayerMovement = NetworkManager.Singleton.ConnectedClients[id].PlayerObject.GetComponent<PlayerMovement>();
            BulletScript = NetworkManager.Singleton.ConnectedClients[id].PlayerObject.GetComponent<BulletScript>();

            MouseMode = InputSystem.actions.FindAction("setMouseMode");

            hasConnected = true;

            clientId = id;

            // set the players position to the starting box
            // NetworkManager.Singleton.ConnectedClients[id].PlayerObject.transform.position = transform.position = new Vector3(30f, 6f, 2f);
            MultiplayerSelection();

            Debug.Log("ClientConnected function finished");
        }
    }

    void FixedUpdate()
    {
        if (hasConnected == true && Class != "")
        {
            HealthStuffs();

            if (Class == "Mage") { ManaStuffs(); }

            // AmmoStuffs()

            handleMouseMode();
        }
    }

    // actual constant UI stuffs
    void ManaStuffs()
    {
        manaSlider.value = PlayerSpells.playerMana / PlayerSpells.playerMaxMana;
    }

    void AmmoStuffs()
    {
        if (BulletScript.enabled == true)
        {
            ammoSlider.value = BulletScript.ammo / BulletScript.maxAmmo;
        }
    }

    void HealthStuffs()
    {
        // adjust the health bar
        healthSlider.value = PlayerStatHandler.PlayerHP / PlayerStatHandler.PlayerMaxHP;    
    }



    // on button press (lancer button)
    public void selectLancerClass()
    {
        Class = "Lancer";

        PlayerMovement.classMovespeedMultiplier = lancerClassMovespeedMultiplier;

        Debug.Log("Lancer Class picked");

        startingClassPickHasBeenChosen();
    }



    // on button press (mage button)
    public void selectMageClass()
    {
        Class = "Mage";

        PlayerMovement.classMovespeedMultiplier = mageClassMovespeedMultiplier;

        Debug.Log("Mage class has been picked");

        startingClassPickHasBeenChosen();
    }

    public void MultiplayerSelection()
    {
        if (IsServer)
        {
            StartingUI.enabled = false;
            inGameUI.enabled = false;
            LancerOption.enabled = false;
            MageOption.enabled = false;


            foreach (GameObject obj in RandomPartsOfTheMultiplayerUi)
            {
                obj.SetActive(true);
            }

            LeaveSessionStuff.SetActive(false);

            Debug.Log("MultiplayerSelection Function");
        }
    }

    public void afterMultiplayerSelection()
    {
        Debug.Log("Activating stuff");
        
        StartingUI.enabled = true;
        LancerOption.enabled = true;
        MageOption.enabled = true;

        LeaveSessionStuff.SetActive(true);
        ShowLobbyCodeButton.SetActive(true);

        foreach (GameObject obj in RandomPartsOfTheMultiplayerUi)
        {
            obj.SetActive(false);
        }

        moveUserToBlackBox(clientId);

        Debug.Log("AfterMultiplayerSelection function");

        if (Class != "")
        {
            enableInGameUI();
        }
    }

    void handleMouseMode()
    {
        if (mouseLockTimer <= mouseLockCooldownTimer) { mouseLockTimer += Time.deltaTime; }

        if (MouseMode != null && MouseMode.IsPressed() && mouseLockTimer >= mouseLockCooldownTimer)
        {
            
            mouseLockTimer = 0f;

            if (Cursor.lockState == CursorLockMode.None)
            {
                Cursor.lockState = CursorLockMode.Locked;
                MultiplayerCanvas.enabled = false;
            }
            else
            {
                Cursor.lockState = CursorLockMode.None;
                MultiplayerCanvas.enabled = true;
            }
        }
    }



    void startingClassPickHasBeenChosen()
    {
        Debug.Log("StartingClassPickHasBeenChosen");
        disableStartingUI();
        enableInGameUI();
    }

    void disableStartingUI()
    {
        // remove the buttons from the UI once the classes have been chosen
        LancerOption.enabled = false;
        MageOption.enabled = false;
        StartingUI.enabled = false;
        Debug.Log("Disabled UI");

        // lock the cursor after selecting a menu option

        moveUserToTestMap(clientId);
        Cursor.lockState = CursorLockMode.Locked;
        MultiplayerCanvas.enabled = false;
    }

    void moveUserToTestMap(ulong id)
    {
        NetworkManager.Singleton.ConnectedClients[id].PlayerObject.transform.position = TestMapTeleportPoint.transform.position;
    }
    void moveUserToBlackBox(ulong id)
    {
        NetworkManager.Singleton.ConnectedClients[id].PlayerObject.transform.position = SpawnBoxTeleportPoint.transform.position;
    }

    void enableInGameUI()
    {
        // enable the in-game UI since a class and lobby has been chosen
        inGameUI.enabled = true;
        healthSlider.enabled = true;
        MultiplayerCanvas.enabled = false;

        Debug.Log("In-game UI enabled");

        disableInGameUIbasedOnClass();
    }

    void disableInGameUIbasedOnClass()
    {

        // if the player chose mage as their class then enable the mana bar for them
        if (Class == "Mage")
        {
            // enable all the mage stuff
            manaSlider.enabled = true;

            foreach (GameObject obj in ChildrenOfManaSlider)
            {
                obj.SetActive(true);
                Debug.Log("Child in ManaSlider enabled");
            }

            // disable ammo slider + all it's children
            ammoSlider.enabled = false;

            foreach (GameObject obj in ChildrenOfAmmoSlider)
            {
                obj.SetActive(false);
                Debug.Log("Child in AmmoSlider disabled");
            }
        }

        else if (Class == "Lancer")
        {
            // disable mana slider + all it's children
            manaSlider.enabled = false;

            foreach (GameObject obj in ChildrenOfManaSlider)
            {
                obj.SetActive(false);
                Debug.Log("Child in ManaSlider disabled");
            }


            // disable ammo slider + all it's children
            ammoSlider.enabled = false;
            foreach (GameObject obj in ChildrenOfAmmoSlider)
            {
                obj.SetActive(false);
                Debug.Log("Child in AmmoSlider disabled");
            }
        }

        // Change the text on the text components.
        ClassTextBox.text = "current class:";
        ClassTextBox.color = new Color(ClassTextBox.color.r, ClassTextBox.color.g, ClassTextBox.color.b, 0.7f);
        
        ActualClassTextBox.text = Class;

        if (Class == "Lancer")
        {
            ActualClassTextBox.color = new Color(1f, 0.155f, 0.55f, 0.7f); // semi-transparent pink for lancer
        }
        else if (Class == "Mage")
        {
            ActualClassTextBox.color = new Color(0f, 0f, 1f, 0.7f); // semi-transparent blue for mage
        }
    }
}