using System;
using UnityEngine;

namespace MeidoPhotoStudio.Plugin
{
    using Input = InputManager;
    public class DragPointHead : DragPointMeido
    {
        private Quaternion headRotation;
        private Vector3 eyeRotationL;
        private Vector3 eyeRotationR;
        public event EventHandler Select;
        public bool IsIK { get; set; }

        protected override void ApplyDragType()
        {
            if (IsBone)
            {
                DragType current = CurrentDragType;
                bool active = current == DragType.MoveY || current == DragType.MoveXZ || current == DragType.Select;
                ApplyProperties(active, false, false);
            }
            else ApplyProperties(CurrentDragType != DragType.None, false, false);
        }

        protected override void UpdateDragType()
        {
            bool shift = Input.Shift;
            bool alt = Input.Alt;
            if (alt && Input.Control)
            {
                // eyes
                CurrentDragType = shift ? DragType.MoveY : DragType.MoveXZ;
            }
            else if (alt)
            {
                // head
                CurrentDragType = shift ? DragType.RotLocalY : DragType.RotLocalXZ;
            }
            else if (Input.GetKey(MpsKey.DragSelect))
            {
                CurrentDragType = DragType.Select;
            }
            else
            {
                CurrentDragType = DragType.None;
            }
        }

        protected override void OnMouseDown()
        {
            base.OnMouseDown();

            if (CurrentDragType == DragType.Select) Select?.Invoke(this, EventArgs.Empty);

            headRotation = MyObject.rotation;

            eyeRotationL = meido.Body.quaDefEyeL.eulerAngles;
            eyeRotationR = meido.Body.quaDefEyeR.eulerAngles;
        }

        protected override void OnDoubleClick()
        {
            if (CurrentDragType == DragType.MoveXZ || CurrentDragType == DragType.MoveY)
            {
                meido.Body.quaDefEyeL = meido.DefaultEyeRotL;
                meido.Body.quaDefEyeR = meido.DefaultEyeRotR;
            }
            else if (CurrentDragType == DragType.RotLocalY || CurrentDragType == DragType.RotLocalXZ)
            {
                meido.FreeLook = !meido.FreeLook;
            }
        }

        protected override void Drag()
        {
            if (IsIK || CurrentDragType == DragType.Select) return;

            if (!(CurrentDragType == DragType.MoveXZ || CurrentDragType == DragType.MoveY) && isPlaying)
            {
                meido.Stop = true;
            }

            Vector3 mouseDelta = MouseDelta();

            if (CurrentDragType == DragType.RotLocalXZ)
            {
                MyObject.rotation = headRotation;
                MyObject.Rotate(camera.transform.forward, -mouseDelta.x / 3f, Space.World);
                MyObject.Rotate(camera.transform.right, mouseDelta.y / 3f, Space.World);
            }

            if (CurrentDragType == DragType.RotLocalY)
            {
                MyObject.rotation = headRotation;
                MyObject.Rotate(Vector3.right * mouseDelta.x / 3f);
            }

            if (CurrentDragType == DragType.MoveXZ || CurrentDragType == DragType.MoveY)
            {
                int inv = CurrentDragType == DragType.MoveY ? -1 : 1;

                meido.Body.quaDefEyeL.eulerAngles = new Vector3(
                    eyeRotationL.x, eyeRotationL.y - (mouseDelta.x / 10f), eyeRotationL.z - (mouseDelta.y / 10f)
                );
                meido.Body.quaDefEyeR.eulerAngles = new Vector3(
                    eyeRotationR.x, eyeRotationR.y + (inv * mouseDelta.x / 10f), eyeRotationR.z + (mouseDelta.y / 10f)
                );
            }
        }
    }
}
