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

public class CameraFollow : Manager<CameraFollow>
{
    public GameObject FollowObject;
    public GameObject FollowObjectGameOver;
    
    public float DampingRotationFac;
    public float DampingPositionFac;

    public float DampingRotationFacGameOver;
    public float DampingPositionFacGameOver;

    private Vector3 targetLocation;
    private Quaternion targetRotation;

    public AnimationCurve EasingPositionCurve;
    public AnimationCurve EasingRotationCurve;

    public AnimationCurve EasingPositionCurveGameOver;
    public AnimationCurve EasingRotationCurveGameOver;

    public void OnGameStateChanged(GameState newState, GameState oldState)
    {
        if(newState == GameState.Play)
        {
            updateTarget();
            updateCameraLerp(1.0f, 1.0f);
        }

        if(newState == GameState.GameOver)
        {

        }
    }

    protected void Start()
    {
        GameStateManager.Instance.OnGameStateChangedEvent.AddListener(OnGameStateChanged);
    }

    protected void OnDestroy()
    {
        GameStateManager.Instance.OnGameStateChangedEvent.RemoveListener(OnGameStateChanged);
    }

    private void updateCameraLerp(float lerpRot, float lerpPos)
    {
        this.transform.rotation = Quaternion.Lerp(this.transform.rotation, targetRotation, lerpRot);
        this.transform.position = Vector3.Lerp(this.transform.position, targetLocation, lerpPos);
    }

    private void updateTarget()
    {
        GameObject activeFollowTarget = GameStateManager.Instance.GameState == GameState.Play ? FollowObject : FollowObjectGameOver;
            
        Quaternion lookRotation = Quaternion.identity;
        lookRotation.SetLookRotation(Vector3.Scale(activeFollowTarget.transform.forward, new Vector3(1.0f, 0.0f, 1.0f)).normalized, Vector3.up);
        targetLocation = activeFollowTarget.transform.position;
        targetRotation = lookRotation;
    }

    protected void OnGameOverAnimationFinished()
    {
        Debug.Log("OnGameOverAnimationFinished OKAY GO GO GO ");
    }

    protected void FixedUpdate()
    {
        updateTarget();

        float activeDampingRotationFactor = GameStateManager.Instance.GameState == GameState.Play ? DampingRotationFac : DampingRotationFacGameOver;
        float activeDampingPositionFactor = GameStateManager.Instance.GameState == GameState.Play ? DampingPositionFac : DampingPositionFacGameOver;

        float tRot = Mathf.Clamp(Mathf.Abs(Quaternion.Angle(this.transform.rotation, targetRotation)) * activeDampingRotationFactor, 0.0f, 1.0f);
        float tPos = Mathf.Clamp((this.transform.position - targetLocation).magnitude * activeDampingPositionFactor, 0.0f, 1.0f);

        AnimationCurve activeRotationCurve = GameStateManager.Instance.GameState == GameState.Play ? EasingRotationCurve : EasingRotationCurveGameOver;
        AnimationCurve activePositionCurve = GameStateManager.Instance.GameState == GameState.Play ? EasingPositionCurve : EasingPositionCurveGameOver;

        tRot = activeRotationCurve.Evaluate(tRot);
        tPos = activePositionCurve.Evaluate(tPos);

        updateCameraLerp(tRot, tPos);
    }
}
