using UnityEngine;
using UnityEngine.InputSystem;

public class ConfiguratorManager : MonoBehaviour
{
    [SerializeField] private Camera mainCamera;
    [SerializeField] private float maxRayDistance = 100f;
    [SerializeField] private LayerMask clickableLayer;

    // Aktualnie zaznaczona część
    private ConfigurablePart selectedPart;

    // Część, nad którą znajduje się kursor
    private ConfigurablePart hoveredPart;

    private void Start()
    {
        // Jeżeli nie przypisano kamery ręcznie, pobieramy główną kamerę sceny
        if (mainCamera == null)
        {
            mainCamera = Camera.main;
        }

        // Jeżeli nadal nie ma kamery, wyłączamy skrypt
        if (mainCamera == null)
        {
            Debug.LogError("ConfiguratorManager: nie przypisano kamery.");
            enabled = false;
            return;
        }
    }

    private void Update()
    {
        // W każdej klatce sprawdzamy hover i kliknięcie
        CheckHover();
        CheckClick();
    }

    private void CheckHover()
    {
        if (Mouse.current == null)
            return;

        // Odczyt pozycji kursora
        Vector2 mousePosition = Mouse.current.position.ReadValue();

        // Promień z kamery przez punkt kursora
        Ray ray = mainCamera.ScreenPointToRay(mousePosition);

        // Domyślnie zakładamy brak hovera
        ConfigurablePart newHoveredPart = null;

        // Jeżeli raycast coś trafił, próbujemy pobrać ConfigurablePart
        if (Physics.Raycast(ray, out RaycastHit hit, maxRayDistance, clickableLayer))
        {
            newHoveredPart = hit.collider.GetComponentInParent<ConfigurablePart>();
        }

        // Reagujemy tylko wtedy, gdy zmienił się obiekt pod kursorem
        if (hoveredPart != newHoveredPart)
        {
            // Wyłączamy hover na poprzednim obiekcie
            if (hoveredPart != null && hoveredPart != selectedPart)
            {
                hoveredPart.SetHover(false);
            }

            // Zapisujemy nowy obiekt hover
            hoveredPart = newHoveredPart;

            // Włączamy hover na nowym obiekcie
            if (hoveredPart != null && hoveredPart != selectedPart)
            {
                hoveredPart.SetHover(true);
            }
        }
    }

    private void CheckClick()
    {
        if (Mouse.current == null)
            return;

        // Reagujemy tylko na kliknięcie lewym przyciskiem
        if (Mouse.current.leftButton.wasPressedThisFrame == false)
            return;

        // Odczytujemy pozycję kursora
        Vector2 mousePosition = Mouse.current.position.ReadValue();

        // Tworzymy promień z kamery
        Ray ray = mainCamera.ScreenPointToRay(mousePosition);

        // Jeżeli trafiono obiekt na odpowiedniej warstwie
        if (Physics.Raycast(ray, out RaycastHit hit, maxRayDistance, clickableLayer))
        {
            ConfigurablePart clickedPart = hit.collider.GetComponentInParent<ConfigurablePart>();

            if (clickedPart != null)
            {
                if (selectedPart != null && selectedPart != clickedPart)
                {
                    selectedPart.Deselect();
                }

                selectedPart = clickedPart;
                selectedPart.Select();
                selectedPart.SetHover(false);
                selectedPart.PlayClickAnimation();
                selectedPart.PlayClickSound();

                Debug.Log("Wybrano część: " + selectedPart.PartName);
            }
            else
            {
                ClearSelection();
            }
        }
        else
        {
            // Kliknięcie poza obiektem usuwa zaznaczenie
            ClearSelection();
        }
    }

    private void ClearSelection()
    {
        // Jeżeli coś było zaznaczone, odznaczamy to
        if (selectedPart != null)
        {
            selectedPart.Deselect();
            selectedPart = null;
        }
    }
}