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

namespace Arugula.Animation
{
    [System.Serializable]
    public struct TransformPose
    {
        public Space space;
        public Vector3 position;
        public Quaternion rotation;
        public Vector3 scale;

        public TransformPose(Vector3 position, Quaternion rotation, Vector3 scale, Space space = Space.Self)
        {
            this.space = space;
            this.position = position;
            this.rotation = rotation;
            this.scale = scale;
        }

        public TransformPose(Transform transform, Space space = Space.Self)
        {
            this.position = space == Space.Self ? transform.localPosition : transform.position;
            this.rotation = space == Space.Self ? transform.localRotation : transform.rotation;
            this.scale = space == Space.Self ? transform.localScale : transform.lossyScale;
            this.space = space;
        }

        public void Apply(Transform t, Space space = Space.Self)
        {
            if(space == Space.Self)
            {
                t.localPosition = position;
                t.localRotation = rotation;
                t.localScale = scale;
            }
            else
            {
                t.position = position;
                t.rotation = rotation;
                t.localScale = scale;
            }
        }

        public static TransformPose Lerp(TransformPose a, TransformPose b, float p)
        {
            return new TransformPose(
                Vector3.Lerp(a.position, b.position, p),
                Quaternion.Slerp(a.rotation, b.rotation, p),
                Vector3.Lerp(a.scale, b.scale, p),
                b.space);
        }

        public static TransformPose LerpUnclamped(TransformPose a, TransformPose b, float p)
        {
            return new TransformPose(
                Vector3.LerpUnclamped(a.position, b.position, p),
                Quaternion.SlerpUnclamped(a.rotation, b.rotation, p),
                Vector3.LerpUnclamped(a.scale, b.scale, p),
                b.space);
        }
    }
}
