using UnityEngine;

namespace MPStudio
{
    public class CrossProductVisualizer : MonoBehaviour
    {
        public Transform vectorAStart; // 向量A的起点
        public Transform vectorAEnd; // 向量A的终点
        public Transform vectorBStart; // 向量B的起点
        public Transform vectorBEnd; // 向量B的终点

        public Color vectorAColor = Color.red;
        public Color vectorBColor = Color.blue;
        public Color crossProductColor = Color.green;

        public float arrowHeadLength = 0.25f;
        public float arrowHeadAngle = 20.0f;

        void Update()
        {
            // 计算向量A和B
            Vector3 A = vectorAEnd.position - vectorAStart.position;
            Vector3 B = vectorBEnd.position - vectorBStart.position;

            // 计算叉乘结果
            Vector3 crossProduct = Vector3.Cross(A, B);

            // 在控制台打印向量和叉乘结果
            Debug.Log($"Vector A: {A}, Vector B: {B}, Cross Product: {crossProduct}");
        }

        void OnDrawGizmos()
        {
            if (vectorAStart == null || vectorAEnd == null ||
                vectorBStart == null || vectorBEnd == null) return;

            // 计算向量A和B
            Vector3 A = vectorAEnd.position - vectorAStart.position;
            Vector3 B = vectorBEnd.position - vectorBStart.position;

            // 计算叉乘结果
            Vector3 crossProduct = Vector3.Cross(A, B);

            // 绘制向量A
            Gizmos.color = vectorAColor;
            DrawArrow(vectorAStart.position, A);

            // 绘制向量B
            Gizmos.color = vectorBColor;
            DrawArrow(vectorBStart.position, B);

            // 绘制叉乘结果向量（从向量A的起点开始）
            Gizmos.color = crossProductColor;
            DrawArrow(vectorAStart.position, crossProduct);

            // 在场景视图中显示标签
            UnityEditor.Handles.Label(vectorAEnd.position, "A");
            UnityEditor.Handles.Label(vectorBEnd.position, "B");
            UnityEditor.Handles.Label(vectorAStart.position + crossProduct, "A × B");
        }

        // 绘制带箭头的向量
        void DrawArrow(Vector3 start, Vector3 direction)
        {
            if (direction.magnitude < 0.001f) return;

            Gizmos.DrawRay(start, direction);

            // 计算箭头方向
            Vector3 right = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 + arrowHeadAngle, 0) *
                            Vector3.forward;
            Vector3 left = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 - arrowHeadAngle, 0) *
                           Vector3.forward;

            // 绘制箭头
            Gizmos.DrawRay(start + direction, right * arrowHeadLength);
            Gizmos.DrawRay(start + direction, left * arrowHeadLength);
        }
    }
}