using UnityEngine;

namespace UnityEditor.U2D.Animation
{
    internal enum SkeletonAction
    {
        None = 0,
        Select = 1 << 0,
        RotateBone = 1 << 2,
        MoveBone = 1 << 3,
        FreeMoveBone = 1 << 4,
        MoveEndPosition = 1 << 5,
        MoveJoint = 1 << 6,
        ChangeLength = 1 << 7,
        CreateBone = 1 << 8,
        SplitBone = 1 << 9,
        Remove = 1 << 10,
    }

    internal enum SkeletonMode
    {
        Disabled = SkeletonAction.None,
        Selection = SkeletonAction.Select,
        EditPose = Selection | SkeletonAction.RotateBone | SkeletonAction.MoveBone,
        EditJoints = Selection | SkeletonAction.FreeMoveBone | SkeletonAction.MoveEndPosition | SkeletonAction.MoveJoint | SkeletonAction.Remove,
        CreateBone = Selection | SkeletonAction.MoveJoint | SkeletonAction.Remove | SkeletonAction.CreateBone,
        SplitBone = Selection | SkeletonAction.MoveEndPosition | SkeletonAction.MoveJoint | SkeletonAction.Remove | SkeletonAction.SplitBone,
    }

    internal interface ISkeletonView
    {
        int InvalidID { get; set; }
        SkeletonMode mode { get; set; }
        int defaultControlID { get; set; }
        int hoveredBoneID { get; }
        int hoveredJointID { get; }
        int hoveredBodyID { get; }
        int hoveredTailID { get; }
        int hotBoneID { get; }
        void BeginLayout();
        void EndLayout();
        bool CanLayout();
        Vector3 GetMouseWorldPosition(Vector3 planeNormal, Vector3 planePosition);
        void LayoutBone(int id, Vector3 position, Vector3 endPosition, Vector3 forward, Vector3 up, Vector3 right, bool isChainEnd);
        bool DoSelectBone(out int id, out bool additive);
        bool DoRotateBone(Vector3 pivot, Vector3 normal, out float deltaAngle);
        bool DoMoveBone(out Vector3 deltaPosition);
        bool DoFreeMoveBone(out Vector3 deltaPosition);
        bool DoMoveJoint(out Vector3 deltaPosition);
        bool DoMoveEndPosition(out Vector3 endPosition);
        bool DoChangeLength(out Vector3 endPosition);
        bool DoCreateBoneStart(out Vector3 position);
        bool DoCreateBone(out Vector3 position);
        bool DoSplitBone(out int id, out Vector3 position);
        bool DoRemoveBone();
        bool DoCancelMultistepAction(bool force);
        bool IsActionActive(SkeletonAction action);
        bool IsActionHot(SkeletonAction action);
        bool IsActionTriggering(SkeletonAction action);
        bool IsActionFinishing(SkeletonAction action);
        bool IsRepainting();
        void DrawBone(Vector3 position, Vector3 right, Vector3 forward, float length, Color color, bool isChained, bool isSelected, bool isJointHovered, bool isTailHovered, bool isHot);
        void DrawBoneParentLink(Vector3 parentPosition, Vector3 position, Vector3 forward, Color color);
        void DrawBoneOutline(Vector3 position, Vector3 right, Vector3 forward, float length, Color color, float outlineScale);
        void DrawCursors(bool canBeActive);
    }
}