using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Interact : MonoBehaviour
{
    public Transform cam;
    bool active = false;
    [SerializeField] float distance = 2f;

    private GameObject pc;
    private GameObject computer;

    private GameObject menu;
    private GameObject player;
    private GameObject movimentScript;
    private GameObject mouseLookScript;

    private GameObject On;
    private GameObject Off;

    private float animationDuration = 0.5f;
    private float timeElapsed;

    public static Vector3 player_position = new Vector3(0f, 0f, 0f);
    public static Quaternion player_rotation;

    public static string target;

    public static string location;

    public string sceneName;

    //private Canvas pc_interact;
    public Canvas[] casa;
    public Canvas[] npc;
    public Canvas[] use;

    private void Start()
    {
        menu = GameObject.Find("EventSystem");
        player = GameObject.Find("Player(Clone)");
        computer = GameObject.Find("PC");
        //pc_interact = GameObject.Find("PC_Interact").GetComponent<Canvas>();

        pc = GameObject.Find("PC_UI");

        On = computer.transform.GetChild(0).gameObject;
        Off = computer.transform.GetChild(1).gameObject;
        movimentScript = player.transform.GetChild(0).gameObject;
        mouseLookScript = movimentScript.transform.GetChild(2).gameObject;

        //use[0] = pc_interact;

        Scene currentScene = SceneManager.GetActiveScene();
        sceneName = currentScene.name;
    }
    private void Update()
    {
        timeElapsed += Time.deltaTime;

        RaycastHit hit;
        active = Physics.Raycast(cam.position, cam.TransformDirection(Vector3.forward), out hit, distance);

        Debug.DrawRay(cam.position, cam.TransformDirection(Vector3.forward) * distance, Color.yellow);

        if (Input.GetKeyDown(KeyCode.E) && active)
        {
            if (hit.transform.name == "PC")
            {
                pc.SetActive(true);
                Off.SetActive(false);
                On.SetActive(true);

                Cursor.lockState = CursorLockMode.Confined;

                movimentScript.GetComponent<PlayerMovement>().enabled = false;
                mouseLookScript.GetComponent<MouseLook>().enabled = false;
                menu.GetComponent<Menu>().enabled = false;
            }
            if (hit.transform.name == "Door")
            {
                SceneManager.LoadScene("Map");
            }
            else
            {
                Debug.Log(hit.transform.name);
                if (sceneName == "Map")
                {
                    player_position = transform.position;
                    player_rotation = transform.rotation;

                    if (hit.transform.GetComponent<Animator>() != null)
                    {
                        string door_tag = hit.transform.tag;
                        hit.transform.GetComponent<Animator>().SetTrigger("Open");
                        if (door_tag == "LabDoor")
                        {
                            StartCoroutine(ChangeSceneAfterDelay(door_tag, "ProfessorOakLab"));
                        }
                        else
                        {
                            Debug.Log("Porta não configurada");
                        }
                    }
                }

            }
        }
        if (hit.transform != null)
        {
            Debug.Log("Hit object: " + hit.transform.name);
            string targetName = hit.transform.name;

            if (hit.transform.tag == "NPC")
            {
                NpcsInteract(hit, targetName);
            }
            if (hit.transform.tag == "Door")
            {
                DoorsInteract(hit, targetName);

            }
            if (hit.transform.tag == "USE")
            {
                UsesInteract(hit, targetName);
            }
        }
        else
        {
            foreach (var i in npc)
            {
                i.gameObject.SetActive(false);
            }
            foreach (var i in casa)
            {
                i.gameObject.SetActive(false);
            }
            foreach (var i in use)
            {
                i.gameObject.SetActive(false);
            }
        }
    }

    private IEnumerator ChangeSceneAfterDelay(string tag, string sceneName)
    {
        if (tag == "LabDoor")
        {
            location = "LabDoor";
            yield return new WaitForSeconds(animationDuration);
            SceneManager.LoadScene(sceneName);
        }
    }
    private void NpcsInteract(RaycastHit hit, string name)
    {
        foreach (var i in npc)
        {
            if (i.gameObject.name == name)
            {
                i.gameObject.SetActive(true);
            }
            else
            {
                i.gameObject.SetActive(false);
            }
        }
    }
    private void DoorsInteract(RaycastHit hit, string name)
    {
        foreach (var i in casa)
        {
            if (i.gameObject.name == name)
            {
                i.gameObject.SetActive(true);
            }
            else
            {
                i.gameObject.SetActive(false);
            }
        }
    }
    private void UsesInteract(RaycastHit hit, string name)
    {
        foreach (var i in use)
        {
            if (i.gameObject.name == name)
            {
                i.gameObject.SetActive(true);
            }
            else
            {
                i.gameObject.SetActive(false);
            }
        }
    }
}