using System.Numerics;

namespace NavisworksTransport.Utils.CoordinateSystem
{
    /// <summary>
    /// 真实物体在当前宿主语义下解释后的参考姿态。
    /// 这不是 fragment 原始几何框架，而是已经结合 Fragment默认Up 解释后的结果。
    /// </summary>
    public sealed class RealObjectReferencePose
    {
        public RealObjectReferencePose(
            Quaternion rotation,
            Vector3 rawAxisX,
            Vector3 rawAxisY,
            Vector3 rawAxisZ,
            Vector3 axisX,
            Vector3 axisY,
            Vector3 axisZ,
            LocalAxisDirection hostWorldXAxisLocalAxis,
            LocalAxisDirection hostWorldYAxisLocalAxis,
            LocalAxisDirection hostWorldZAxisLocalAxis,
            LocalAxisDirection hostSemanticXAxisLocalAxis,
            LocalAxisDirection hostSemanticYAxisLocalAxis,
            LocalAxisDirection hostSemanticZAxisLocalAxis,
            LocalAxisDirection hostUpLocalAxis,
            int fragmentCount,
            string fragmentDefaultUpAxis,
            string hostUpAxis)
        {
            Rotation = rotation;
            RawAxisX = rawAxisX;
            RawAxisY = rawAxisY;
            RawAxisZ = rawAxisZ;
            AxisX = axisX;
            AxisY = axisY;
            AxisZ = axisZ;
            HostWorldXAxisLocalAxis = hostWorldXAxisLocalAxis;
            HostWorldYAxisLocalAxis = hostWorldYAxisLocalAxis;
            HostWorldZAxisLocalAxis = hostWorldZAxisLocalAxis;
            HostSemanticXAxisLocalAxis = hostSemanticXAxisLocalAxis;
            HostSemanticYAxisLocalAxis = hostSemanticYAxisLocalAxis;
            HostSemanticZAxisLocalAxis = hostSemanticZAxisLocalAxis;
            HostUpLocalAxis = hostUpLocalAxis;
            FragmentCount = fragmentCount;
            FragmentDefaultUpAxis = fragmentDefaultUpAxis;
            HostUpAxis = hostUpAxis;
        }

        public Quaternion Rotation { get; }
        public Vector3 RawAxisX { get; }
        public Vector3 RawAxisY { get; }
        public Vector3 RawAxisZ { get; }
        public Vector3 AxisX { get; }
        public Vector3 AxisY { get; }
        public Vector3 AxisZ { get; }
        public LocalAxisDirection HostWorldXAxisLocalAxis { get; }
        public LocalAxisDirection HostWorldYAxisLocalAxis { get; }
        public LocalAxisDirection HostWorldZAxisLocalAxis { get; }
        public LocalAxisDirection HostSemanticXAxisLocalAxis { get; }
        public LocalAxisDirection HostSemanticYAxisLocalAxis { get; }
        public LocalAxisDirection HostSemanticZAxisLocalAxis { get; }
        public LocalAxisDirection HostUpLocalAxis { get; }
        public int FragmentCount { get; }
        public string FragmentDefaultUpAxis { get; }
        public string HostUpAxis { get; }
    }
}
