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

[RequireComponent(typeof(AudioSource))]
public class PanelHiderButton : MonoBehaviour
{
    private int colliderCount = 0;
    private bool isLocked = false;
    private float timer = 0f;
    private bool actionTaken = false;
    private Renderer r;

    [Header("Settings")]
    [SerializeField]
    private float holdTime = 1f;

    [Header("Components")]
    [SerializeField]
    private RawImage statusImg;
    [SerializeField]
    private Image timerRing;
    [SerializeField]
    private List<GameObject> panelButtons;

    [Header("Assets")]
    [SerializeField]
    private Texture lockImg;
    [SerializeField]
    private Texture unlockImg;
    [SerializeField]
    private AudioClip lockSound;
    [SerializeField]
    private AudioClip unlockSound;

    private AudioSource audioSrc;
    private void Start()
    {
        audioSrc = GetComponent<AudioSource>();
        r = GetComponent<Renderer>();
        statusImg.texture = isLocked ? lockImg : unlockImg;
        audioSrc.clip = lockSound;
    }

    private void OnTriggerEnter(Collider _)
    {
        r.material.color = Color.white;
        ++colliderCount;
    }

    private void OnTriggerExit(Collider _)
    {
        r.material.color = Color.gray;
        colliderCount = Mathf.Clamp(colliderCount - 1, 0, colliderCount);
    }

    private void Update()
    {
        if (colliderCount >= 1)
        {
            timer += Time.unscaledDeltaTime;
            float ratio = Mathf.Clamp(timer, 0, holdTime) / holdTime;

            timerRing.fillAmount = Mathf.Pow(ratio, 3f);

            if (ratio >= 1 && !actionTaken)
            {
                isLocked = !isLocked;
                
                foreach (var btn in panelButtons)
                {
                    btn.SetActive(!isLocked);
                }
                actionTaken = true;

                timerRing.color = Color.cyan;
                statusImg.texture = isLocked ? lockImg : unlockImg;

                audioSrc.clip = isLocked ? lockSound : unlockSound;
                audioSrc.Play();
            }
        }
        else
        {
            timer = 0;
            timerRing.fillAmount = 0;
            timerRing.color = Color.white;
            actionTaken = false;
        }
    }
}