using UnityEngine;
using UnityEngine.InputSystem;

public class CameraController : MonoBehaviour
{
    [SerializeField] private Transform cameraHolder;
    [SerializeField] private Transform spineBone;

    #region DATA
    [SerializeField] private float minCameraRotation;
    [SerializeField] private float maxCameraRotation;
    private float mouseSensitivity = 5f;
    private float xRotation;
    private float yRotation;
    private float baseYRotation;
    private Quaternion spineInitialRotation;
    #endregion

    #region INPUT
    private PlayerControls playerControls;
    private Vector2 lookInput;
    #endregion

    #region PROPERTIES
    public Transform CameraHolder => cameraHolder;
    public float MouseSensitivity { get => mouseSensitivity; set => mouseSensitivity = value; }
    #endregion

    private void Awake()
    {
        playerControls = new PlayerControls();
    }

    private void OnEnable()
    {
        playerControls.Enable();
        playerControls.Player.Look.performed += OnLook;
        playerControls.Player.Look.canceled += OnLook;
    }

    private void OnDisable()
    {
        playerControls.Player.Look.performed -= OnLook;
        playerControls.Player.Look.canceled -= OnLook;
        playerControls.Disable();
    }

    private void Start()
    {
        spineInitialRotation = spineBone.localRotation;
        baseYRotation = transform.eulerAngles.y;
    }

    private void Update()
    {
        this.transform.localRotation = Quaternion.Euler(0f, baseYRotation + yRotation, 0f);
    }

    private void LateUpdate()
    {
        ApplyRotation();
    }

    public void OnLook(InputAction.CallbackContext cxt)
    {
        lookInput = cxt.ReadValue<Vector2>();
    }

    public void ApplyRotation()
    {
        float mouseX = lookInput.x * mouseSensitivity * Time.deltaTime;
        float mouseY = lookInput.y * mouseSensitivity * Time.deltaTime;

        yRotation += mouseX;
        xRotation -= mouseY;

        xRotation = Mathf.Clamp(xRotation, minCameraRotation, maxCameraRotation);
        cameraHolder.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
        spineBone.localRotation = Quaternion.Euler(0f, 0f, -xRotation);
    }
}