using UnityEngine;

namespace SmartBowSDK
{
    /// <summary>
    /// 射箭检测器
    /// </summary>
    public class ShootChecker : MonoBehaviour
    {
        public SmartBowHelper smartBowHelper;
        /// <summary>
        /// 游戏里箭的速度
        /// </summary>
        public float gameArrowSpeed = 0;
        /// <summary>
        /// 游戏里箭的重量
        /// </summary>
        public float gameArrowWeight = 20;
        /// <summary>
        /// 现实里箭的重量
        /// </summary>
        public float solidArrowWeight = 75;
        /// <summary>
        /// 上一次的射击数据ID
        /// </summary>
        private int _lastShootID = -1;

        /// <summary>
        /// 当收到红外数据时
        /// </summary>
        /// <param name="bytes"></param>
        public void OnInfraredDataReceived(byte[] bytes)
        {
            //序号
            int id = bytes[1];
            if (id == _lastShootID) return; //因为硬件为了避免丢包，会连续发几条相同射击通知过来
            _lastShootID = id;
            //时区1耗时
            float time1 = bytes[2] * 0.1f;
            //时区2耗时
            float time2 = bytes[3] * 0.1f;
            //时区耗时总和
            float totalTime = time1 + time2;
            //校验和
            int sumCheck = (bytes[0] + bytes[1] + bytes[2] + bytes[3]) & 0xff;
            //校验和比较结果
            bool sumCheckRes = sumCheck == bytes[4];
            //实体箭速度
            float solidArrowSpeed = 0.05f / (totalTime / 1000f);
            //通过动能定理求箭的速度（实体箭质量*实体箭速度^2=游戏中箭的质量*游戏中箭的速度^2）
            gameArrowSpeed = Mathf.Sqrt(solidArrowSpeed * solidArrowSpeed * solidArrowWeight / gameArrowWeight);
            //打印
            string logInfo = $"序号{id}，时区1：{time1}毫秒，时区2：{time2}毫秒，校验：{sumCheckRes}，实体箭速度：{solidArrowSpeed}m/s，游戏箭速度：{gameArrowSpeed}m/s";
            SmartBowLogger.Log(this, logInfo);
            //收到正确的射箭数据，就回复硬件，否则n毫秒后硬件会认为丢包而进行重传
            if (sumCheckRes) smartBowHelper.bluetoothAim.ReplyInfraredShoot();
            //通知九轴算法，因为射箭抖动会使算法计算的姿态角产生误差
            smartBowHelper.aimHandler.NotifyAxisOnShot();
            smartBowHelper.InvokeOnShooting(gameArrowSpeed);
        }
    }
}
