using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class TimeAndPlate : MonoBehaviour
{
    [SerializeField] private PressurePlate[] _plates;
    private bool[] _plateStates;

    // trigger on successful activation of all plates
    [SerializeField] private UnityEvent _onTrigger;

    private bool _triggered;

    private void Awake()
    {
        _plateStates = new bool[_plates.Length];

        foreach (var plate in _plates)
        {
            plate.OnPress.AddListener(() =>
            {
                _plateStates[Array.IndexOf(_plates, plate)] = true;
            });
            
            plate.OnReset.AddListener(() =>
            {
                _plateStates[Array.IndexOf(_plates, plate)] = false;
            });
        }
    }

    private void Update()
    {
        if (_triggered) return;
        
        // bail if any plates are inactive
        for (int i = 0; i < _plateStates.Length; i++)
        {
            if (!_plateStates[i]) return;
        }
        
        // all plates are active
        Trigger();
    }

    public void Trigger()
    {
        if (_triggered) return;
        
        for (int i = 0; i < _plates.Length; i++)
        {
            _plates[i].gameObject.SetActive(false);
        }
        
        _onTrigger.Invoke();
        _triggered = true;
    }
    
    public void Reset()
    {
        _triggered = false;

        for (int i = 0; i < _plates.Length; i++)
        {
            _plates[i].gameObject.SetActive(true);
            _plateStates[i] = false;
        }
    }
}
