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

public class CameraScript : MonoBehaviour
{
    public static CameraScript I;
    public GameObject cameraHolder;
    [SerializeField] private float lerpValue = 0.3f;
    [SerializeField] private float lookSensitivity = 0.3f;
    [SerializeField] private float scrollValue = 0.3f;
    [SerializeField] private float closestDist = 1;
    [SerializeField] private float furthestDist = 10;
    [SerializeField] private float maxAngle = 85;
    private Transform playerTransform;
    private Vector3 lerpVal;
    [SerializeField] private Vector3 offset;

    private void Awake()
    {
        I = this;
    }
    // Start is called before the first frame update
    void Start()
    {
        playerTransform = Move.Instance.playerModel.transform;
    }

    // Update is called once per frame
    void Update()
    {
        Cursor.lockState = CursorLockMode.Locked;

        // If moving up, make sure angle is below max angle, if moving down make sure its above.
        if (Input.GetAxisRaw("Mouse Y") > 0)
            if (WrapAngle(cameraHolder.transform.eulerAngles.x) + Input.GetAxisRaw("Mouse Y") * lookSensitivity / 2 < maxAngle)
                cameraHolder.transform.eulerAngles += new Vector3(Input.GetAxisRaw("Mouse Y") * lookSensitivity / 2, 0, 0);
            else
                cameraHolder.transform.eulerAngles = new Vector3(maxAngle, cameraHolder.transform.eulerAngles.y, cameraHolder.transform.eulerAngles.z);
        if (Input.GetAxisRaw("Mouse Y") < 0)
            if (WrapAngle(cameraHolder.transform.eulerAngles.x) + Input.GetAxisRaw("Mouse Y") * lookSensitivity / 2 > -maxAngle)
                cameraHolder.transform.eulerAngles += new Vector3(Input.GetAxisRaw("Mouse Y") * lookSensitivity / 2, 0, 0);
            else
                cameraHolder.transform.eulerAngles = new Vector3(-maxAngle, cameraHolder.transform.eulerAngles.y, cameraHolder.transform.eulerAngles.z);
        // Separate the vertical locking with horizontal looking.
        cameraHolder.transform.eulerAngles += new Vector3(0, Input.GetAxisRaw("Mouse X") * lookSensitivity, 0);

        cameraHolder.transform.eulerAngles = new Vector3(cameraHolder.transform.eulerAngles.x, cameraHolder.transform.eulerAngles.y, 0);
        cameraHolder.transform.position = Vector3.Lerp(cameraHolder.transform.position, playerTransform.position + offset, lerpValue);

        // If going up / going down
        if (Input.mouseScrollDelta.y > 0)
        { 
            // If the distance is greater than the closest distance allowed
            if (Vector3.Distance(transform.position, cameraHolder.transform.position) > closestDist)
                transform.position = Vector3.Slerp(transform.position, transform.position + Input.mouseScrollDelta.y * (cameraHolder.transform.position - transform.position).normalized, scrollValue);
            else
                transform.position = Vector3.Slerp(transform.position, transform.position + 1 * (transform.position - cameraHolder.transform.position).normalized, scrollValue);
        }
        if (Input.mouseScrollDelta.y < 0)
        {
            // If the distance is lower than the furthest distance allowed
            if (Vector3.Distance(transform.position, cameraHolder.transform.position) < furthestDist)
                transform.position = Vector3.Slerp(transform.position, transform.position + Input.mouseScrollDelta.y * (cameraHolder.transform.position - transform.position).normalized, scrollValue);
            else
                transform.position = Vector3.Slerp(transform.position, transform.position + 1 * (cameraHolder.transform.position - transform.position).normalized, scrollValue);
        }
        transform.LookAt(cameraHolder.transform);
    }

    private static float WrapAngle(float angle)
    {
        angle %= 360;
        return angle > 180 ? angle - 360 : angle;
    }

    private static float UnwrapAngle(float angle)
    {
        if (angle >= 0)
            return angle;

        angle = -angle % 360;

        return 360 - angle;
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawLine(cameraHolder.transform.position, transform.position);
    }
}