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

[ExecuteInEditMode]
public class Gimbal : MonoBehaviour
{
    [Header("Rotation")]
    public Vector3 eulerAngles;

    [Header("Limits")]
    [Header("Pitch")]
    public bool usePitchLimits = true;
    public float minPitch = -45;
    public float maxPitch = 45;
    [Header("Yaw")]
    public bool useYawLimits = false;
    public float minYaw = -45;
    public float maxYaw = 45;
    [Header("Roll")]
    public bool useRollLimits = true;
    public float minRoll = -20;
    public float maxRoll = 20;

    public Quaternion localRotation => GetLocalRotation();
    public Quaternion rotation => GetWorldRotation();

    public float pitch { get => eulerAngles.x; set => eulerAngles.x = value; }
    public float yaw { get => eulerAngles.y; set => eulerAngles.y = value; }
    public float roll { get => eulerAngles.z; set => eulerAngles.z = value; }

    Quaternion GetLocalRotation()
    {
        if (usePitchLimits)
            pitch = Mathf.Clamp(pitch, minPitch, maxPitch);
        if (useYawLimits)
            yaw = Mathf.Clamp(yaw, minYaw, maxYaw);
        else if (Mathf.Abs(yaw) > 180)
            yaw = Mathf.DeltaAngle(0, yaw);
        if (useRollLimits)
            roll = Mathf.Clamp(roll, minRoll, maxRoll);

        return Quaternion.Euler(eulerAngles);
    }

    Quaternion GetWorldRotation()
    {
        return transform.rotation * GetLocalRotation();
    }

    private void OnDrawGizmosSelected()
    {
        var q = rotation;

        Gizmos.color = Color.blue;
        Gizmos.DrawRay(transform.position, q * Vector3.forward);
        Gizmos.color = Color.red;
        Gizmos.DrawRay(transform.position, q * Vector3.right);
        Gizmos.color = Color.green;
        Gizmos.DrawRay(transform.position, q * Vector3.up);
    }
}
