using OpenCVForUnity.CoreModule;
using System;
using System.Collections.Generic;
using UnityEngine;

public class HandsHold : PoseBase
{
    public override Vector2 GetBasicVectorDirection(List<Point> startPoint, List<Point> endPoint)
    {
        //必要点位 "RShoulder", "LShoulder", "RElbow", "LElbow"
        //计算肩膀到手肘矢量,右手
        Vector2 rightHandVector = GetAverageVector(startPoint, endPoint, "RElbow");
        Vector2 leftHandVector = GetAverageVector(startPoint, endPoint, "LElbow");
        //平均矢量
        Vector2 averageVector = (rightHandVector + leftHandVector) / 2;

        //如果左右手肘矢量差小于两者平均值的0.3倍,且左右手矢量夹角小于30度,返回左右手矢量平均值
        if ((rightHandVector - leftHandVector).magnitude < averageVector.magnitude * 0.3f
            && Vector2.Angle(rightHandVector, leftHandVector) < 30)
        {
            return averageVector;
        }

        return Vector2.zero;
    }
    protected override bool IsMovePoint(string tagName)
    {
        return  "RWrist".Equals(tagName) ||
                "LWrist".Equals(tagName);
    }

    public override void ValidationMovement(Vector2 distance, TimeSpan totalTimeSpan, int level)
    {
        if (totalTimeSpan.TotalMilliseconds / 1000 < 0.05f)
        {
            LogPrint.Error("TimeSpan too short");
            return;
        }
        var angle = Vector2.SignedAngle(Vector2.down, distance);
        LogPrint.Log($"Angle:{angle}", PrintLevel.Normal);
        if (MathF.Abs(angle) < 50 && distance.magnitude > 5f)
            EventManager.Instance.Dispatch(YogaEventType.Action_Success); //方向不能偏移超过10°
        else
        {
            EventManager.Instance.Dispatch(YogaEventType.Action_Fail);
            return;
        }

        if (level < 1)
            return;

        LogPrint.Log($"distance  x:{distance.x}, y:{distance.y}, magnitude:{distance.magnitude}");
        if (distance.magnitude > 80f || distance.magnitude < 20f)
            EventManager.Instance.Dispatch(YogaEventType.Action_MoveDistanceNotAccurate);
        else
            EventManager.Instance.Dispatch(YogaEventType.Action_MoveDistanceExactly);

        if (level < 2)
            return;

        var speed = distance.magnitude / totalTimeSpan.TotalSeconds;
        LogPrint.Log($"speed:{speed}", PrintLevel.Normal);
        if (speed > 0.5f)
            EventManager.Instance.Dispatch(YogaEventType.Action_SpeedTooFast); //速度语音提示
        else if (speed < 0.1f)
            EventManager.Instance.Dispatch(YogaEventType.Action_SpeedTooSlow); //速度语音提示
    }

    public override void ExcellenceEstimate(List<(TimeSpan, Vector2)> frameData, Vector2 distance, TimeSpan totalTimeSpan)
    {
        throw new NotImplementedException();
    }
}