using UnityEngine;

public class ConfigurablePart : MonoBehaviour
{
    [Header("Podstawowe informacje o części")]
    [SerializeField] private string partName = "Nowa część";

    [Header("Animacja")]
    [SerializeField] private Animator animator;
    [SerializeField] private string animationTriggerName = "PlayAnimation";

    [Header("Dźwięk")]
    [SerializeField] private AudioSource audioSource;
    [SerializeField] private AudioClip clickSound;

    // Renderer umożliwia zmianę wyglądu obiektu
    private Renderer objectRenderer;

    // Czy obiekt jest aktualnie zaznaczony
    private bool isSelected = false;

    // Czy kursor znajduje się nad obiektem
    private bool isHovered = false;

    // Umożliwia odczyt nazwy części z innych skryptów
    public string PartName
    {
        get { return partName; }
    }

    private void Start()
    {
        // Pobieramy Renderer z obiektu
        objectRenderer = GetComponent<Renderer>();

        // Jeśli nie ma go na tym obiekcie, szukamy w dzieciach
        if (objectRenderer == null)
        {
            objectRenderer = GetComponentInChildren<Renderer>();
        }

        // Pobieramy Animator, jeśli nie przypisano go ręcznie
        if (animator == null)
        {
            animator = GetComponent<Animator>();
        }

        // Pobieramy AudioSource, jeśli nie przypisano go ręcznie
        if (audioSource == null)
        {
            audioSource = GetComponent<AudioSource>();
        }

        // Ustawiamy początkowy kolor
        UpdateColor();
    }

    public void Select()
    {
        // Zmieniamy stan zaznaczenia
        isSelected = true;

        // Odświeżamy kolor
        UpdateColor();
    }

    public void Deselect()
    {
        // Wyłączamy stan zaznaczenia
        isSelected = false;

        // Odświeżamy kolor
        UpdateColor();
    }

    public void SetHover(bool value)
    {
        // Ustawiamy stan hover
        isHovered = value;

        // Odświeżamy kolor
        UpdateColor();
    }

    public void PlayClickAnimation()
    {
        // Jeśli brak Animatora, nic nie robimy
        if (animator == null)
            return;

        // Wysyłamy trigger do Animatora
        animator.SetTrigger(animationTriggerName);
    }

    public void PlayClickSound()
    {
        // Jeżeli nie ma komponentu AudioSource, kończymy działanie
        if (audioSource == null)
            return;

        // Jeżeli nie przypisano klipu dźwiękowego, kończymy działanie
        if (clickSound == null)
            return;

        // Odtwarzamy pojedynczy dźwięk kliknięcia
        audioSource.PlayOneShot(clickSound);
    }

    private void UpdateColor()
    {
        // Jeżeli nie mamy Renderera, nic nie zmieniamy
        if (objectRenderer == null)
            return;

        // Najwyższy priorytet ma zaznaczenie
        if (isSelected == true)
        {
            objectRenderer.material.color = Color.yellow;
        }
        // Następnie hover
        else if (isHovered == true)
        {
            objectRenderer.material.color = new Color(1f, 0.7f, 0.2f);
        }
        // Stan domyślny
        else
        {
            objectRenderer.material.color = Color.white;
        }
    }
}