using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Variables;

public class MonsterController : MonoBehaviour, IResettable
{

    [SerializeField, Header("References")]
    Reference<float> m_light;

    [SerializeField]
    private GameObject[] m_possibleFrames;


    private Transform m_player;
    public GameObject m_defaultObject;

    [SerializeField]
    private float m_distance = 3;

    [SerializeField]
    private Vector3 m_offset = Vector3.zero;

    private bool m_hasChanged = false;

    private void OnEnable()
    {
        m_light.OnValueChanged += OnLightChange;
    }

    private void OnDisable()
    {
        m_light.OnValueChanged -= OnLightChange;
    }

    private void Start()
    {
        m_player = GameObject.FindGameObjectWithTag("Player").transform;
        foreach (Transform child in transform)
        {
            if (child.gameObject.activeInHierarchy)
                m_defaultObject = child.gameObject;
        }
    }



    private void ChangeRandomMonster()
    {
        GameObject[] inactiveFrames = m_possibleFrames.Where(p => !p.activeInHierarchy).ToArray();
        GameObject nextFrame = inactiveFrames[Random.Range(0, inactiveFrames.Length)];
        
        foreach(Transform child in transform)
        {
            child.gameObject.SetActive(child.gameObject == nextFrame);
        }
    }

    private void ResetMonster()
    {
        foreach (Transform child in transform)
        {
            child.gameObject.SetActive(child.gameObject == m_defaultObject);
        }
    }


    private void OnLightChange(float value)
    {
        float distanceToPlayer = Vector3.Distance(m_player.position, transform.position + m_offset);

        if (value <= 0.01 && distanceToPlayer < m_distance && !m_hasChanged)
        {
            Debug.Log(distanceToPlayer);
            ChangeRandomMonster();
            m_hasChanged = true;
        }
        else if (value <= 0 && !m_hasChanged)
        {
            ResetMonster();
        }
        if (value > 0.5)
        {
            m_hasChanged = false;
        }


    }

    public void OnLevelLoad()
    {

    }

    public IEnumerator OnResetStart(float time)
    {
        yield break;
    }

    public void OnResetEnd()
    {
        ResetMonster();
    }


    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position + m_offset, m_distance);
    }
}
