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

public class DarknessController : MonoBehaviour
{

    [SerializeField, Header("References")]
    private Material m_darknessMat;

    [SerializeField]
    private Reference<float> m_lightLevel;

    [SerializeField]
    private Reference<bool> m_isInputDown;

    [SerializeField]
    private Reference<bool> m_manuelDarknesscontrol;

    [SerializeField, BoxGroup("Settings")]
    private float m_darknessSpeed = 0.25f;

    [SerializeField, BoxGroup("Settings")]
    private float m_lightSpeed = 1.0f;

    [SerializeField, BoxGroup("Settings")]
    private AnimationCurve m_lightCurve = AnimationCurve.Linear(0,0,1,1);


    
    [ShowNonSerializedField]
    private bool m_isDarknessChanging;


    private void OnEnable()
    {
        m_isInputDown.OnValueChanged += OnInputChange;
        m_darknessMat.SetFloat("_Apply", 1);
        m_lightLevel.Value = 1;
    }

    private void OnDisable()
    {
        m_isInputDown.OnValueChanged -= OnInputChange;
        m_darknessMat.SetFloat("_Apply", 1);
        m_lightLevel.Value = 1;
    }


    private void Update()
    {
        m_darknessMat.SetFloat("_Apply", m_lightLevel);
    }


    private void OnInputChange(bool value)
    {
        if (m_manuelDarknesscontrol)
            return;

        StopAllCoroutines();
        if (value)
        {  if (!m_isDarknessChanging)
           {
             StartCoroutine(ChangeDarkness(0, m_darknessSpeed));
           }
           else
           {
               StartCoroutine(ChangeDarkness(0, 0));
           }
        }
        else
            StartCoroutine(ChangeDarkness(1, m_lightSpeed, m_lightCurve));
    }


    private IEnumerator ChangeDarkness(float end, float time)
    {
        yield return StartCoroutine(ChangeDarkness(end, time, AnimationCurve.Linear(0, 0, 1, 1)));
    }

    private IEnumerator ChangeDarkness(float end, float time, AnimationCurve curve)
    {
        
        float start = m_lightLevel;
        float elapsedTime = 0;

        time = Mathf.InverseLerp(end, start, m_lightLevel) * time;

        m_isDarknessChanging = true;

        while(elapsedTime < time)
        {
            m_lightLevel.Value = Mathf.Lerp(start, end, curve.Evaluate(elapsedTime / time));
            yield return new WaitForEndOfFrame();
            elapsedTime += Time.deltaTime;
        }

        m_isDarknessChanging = false;
        m_lightLevel.Value = end;
        
        
    }



}
