using Thousandto.Cfg.Data;
using Thousandto.Code.Center;
using Thousandto.Core.Asset;
using Thousandto.Core.PostEffect;
using Thousandto.Plugins.Common.UniScene;
using System.Collections.Generic;
using UnityEngine;

namespace Thousandto.Code.Logic
{
    //摄像机控制接口,
    public class CameraControlUtil
    {
        //载入地图配置的摄像机控制参数
        public void LoadCameraSetting(DeclareMapsetting mapSetting, CameraControl control)
        {
            if (control == null)
                return;
            if (mapSetting == null)
                return;
#if USE_PC_MODEL
            int curFov = mapSetting.CameraFovPc;
#else
            int curFov = mapSetting.CameraFov;
#endif
            CameraControlDefine.SetCameraParms(mapSetting.CamDefaultYaw, mapSetting.CamMinYaw, mapSetting.CamMaxYaw, mapSetting.CamDefaultDis / 100f, mapSetting.CamFarDis / 100f, 
                mapSetting.CamDefaultPitch, mapSetting.CamFarPitch, mapSetting.CamDefaultOffsety / 100f, mapSetting.CamFarOffsety / 100f, curFov);
        }

        //设置摄像机跟随主角
        public void FollowToLocalPlayer()
        {
            FollowToCharacter(GameCenter.GameSceneSystem.GetLocalPlayer(), false);
        }

        //设置摄像机跟随某角色
        public void FollowToCharacter(Character target, bool playAnim)
        {
            if (target == null)
                return;
            if (GameCenter.GameSceneSystem.ActivedScene == null)
                return;
            var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl;
            if (control == null)
                return;
            var targetTrans = target.ModelTransform;
            float offsetY = CameraControlDefine.LockOffsetY;
            float targetDis = control.CurDis;
            if(targetDis > CameraControlDefine.MaxDis)
            {
                targetDis = CameraControlDefine.MaxDis;
            }
            if (targetDis < CameraControlDefine.CurMinDis)
            {
                targetDis = CameraControlDefine.CurMinDis;
            }
            CameraControlDefine.DisAddValue = 0f;
            CameraControlDefine.PitchAddValue = 0f;
            if (target.Skin != null && target.Skin.SkinPartIsValid(FSkinPartCode.Mount))
            {
                var cfg = DeclareHuaxingHorse.Get(target.Skin.GetSkinPartCfgID(FSkinPartCode.Mount));
                if (cfg != null)
                {
                    offsetY = cfg.SceneCameraYAdd / 100f;
                    CameraControlDefine.DisAddValue = cfg.SceneCameraDisadd / 100f;
                    targetDis += CameraControlDefine.DisAddValue;
                    CameraControlDefine.PitchAddValue = cfg.SceneCameraPitchadd;
                }
            }
            var halfMaxDis = (CameraControlDefine.CurMaxDis - CameraControlDefine.CurMinDis) / 2f;
            if (targetDis < halfMaxDis)
            {
                playAnim = false;
            }
            if (control.TargetTrans != targetTrans)
            {
                control.SetTarget(targetTrans);
                control.CurOffsetY = offsetY;
            }
            else
            {
                if(playAnim)
                {
                    control.PlayAnim(CameraControlDefine.LockPitch, control.CurYaw, targetDis, control.CurOffsetX, offsetY, CameraControlDefine.CurFov, 0.3f);
                }
                else
                {
                    control.CurDis = targetDis;
                    control.CurOffsetY = offsetY;
                }
            }
            PostEffectManager.Instance.SetShadowTargetTransform(target.ModelTransform);
        }

        //切换摄像机的锁定状态
        public void ChangeCamearLockState(bool isLock)
        {
            if (GameCenter.GameSceneSystem.ActivedScene == null)
                return;
            var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl;
            if (control == null)
                return;
            control.ChangeLockState(isLock);
        }

        //获取摄像机的锁定状态
        public bool GetCamearLockState()
        {
            if (GameCenter.GameSceneSystem.ActivedScene == null)
                return false;
            var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl;
            if (control == null)
                return false;
            return control.IsLock;
        }

        //设置摄像机特写目标
        public bool SetFetrueCharacter(Character target, float offsetX = 0f, float aniTime = 1f)
        {
            if (GameCenter.GameSceneSystem.ActivedScene == null)
                return false;
            var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl;
            if (control == null)
                return false;

            var dir = target.GetFacingDirection();
            dir.y = 0;
            dir = -dir.normalized;
            // [0, PI]
            var yaw = Mathf.Acos(Vector3.Dot(dir, Vector3.forward));
            if (dir.x < 0)
            {
                yaw = -yaw; //[-PI, 0]
            }
            yaw = yaw / Mathf.PI * 180f;
            control.PlayAnim(0f, yaw + 20f, 2f, offsetX, 1f, CameraControlDefine.CurFov, aniTime);

            return true;
        }

        //执行场景编辑器中的改变摄像机事件
        public bool DoTriggerChangeCamera(List<string> changeParams)
        {
            //if (changeParams.Count <= 0)
            //    return false;
            //if (GameCenter.GameSceneSystem.ActivedScene == null)
            //    return false;
            //var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl;
            //if (control == null)
            //    return false;
            //float yaw = control.CurYaw;
            //float pitch = control.CurPitch;
            //float dis = control.CurDis;
            //float yawMin = CameraControlDefine.MinYaw;
            //float yawMax = CameraControlDefine.MaxYaw;
            //float pitchMin = CameraControlDefine.MinPitch;
            //float pitchMax = CameraControlDefine.MaxPitch;
            //float disMin = CameraControlDefine.MinDis;
            //float disMax = CameraControlDefine.MaxDis;

            //bool playAnim = true;
            //bool is2d = false;
            //bool doLimitYaw = false;
            //bool doLimit = false;
            //for (int i = 0; i < changeParams.Count; ++i)
            //{
            //    if (changeParams[i] == "2d")
            //    {
            //        is2d = true;
            //    }
            //    else if (changeParams[i] == "3d")
            //    {
            //        is2d = false;
            //    }
            //    else
            //    {
            //        if (control.IsLock != is2d)
            //            continue;

            //        var commandParams = changeParams[i].Split('_');
            //        if (commandParams != null && commandParams.Length <= 0)
            //            continue;
            //        switch (commandParams[0])
            //        {
            //            case "y":
            //                if (commandParams.Length >= 2)
            //                {
            //                    float value = 0f;
            //                    if (float.TryParse(commandParams[1], out value))
            //                    {
            //                        yaw = value;
            //                    }
            //                }
            //                break;
            //            case "p":
            //                if (commandParams.Length >= 2)
            //                {
            //                    float value = 0f;
            //                    if (float.TryParse(commandParams[1], out value))
            //                    {
            //                        pitch = value;
            //                    }
            //                }
            //                break;
            //            case "d":
            //                if (commandParams.Length >= 2)
            //                {
            //                    float value = 0f;
            //                    if (float.TryParse(commandParams[1], out value))
            //                    {
            //                        dis = value;
            //                    }
            //                }
            //                break;
            //            case "ly":
            //                if(commandParams.Length >= 3)
            //                {
            //                    float value1 = 0f;
            //                    float value2 = 0f;
            //                    if(float.TryParse(commandParams[1], out value1) && float.TryParse(commandParams[2], out value2))
            //                    {
            //                        doLimitYaw = true;
            //                        doLimit = true;
            //                        yawMin = value1;
            //                        yawMax = value2;
            //                    }
            //                }
            //                break;
            //            case "lp":
            //                if (commandParams.Length >= 3)
            //                {
            //                    float value1 = 0f;
            //                    float value2 = 0f;
            //                    if (float.TryParse(commandParams[1], out value1) && float.TryParse(commandParams[2], out value2))
            //                    {
            //                        doLimit = true;
            //                        pitchMin = value1;
            //                        pitchMax = value2;
            //                    }
            //                }
            //                break;
            //            case "ld":
            //                if (commandParams.Length >= 3)
            //                {
            //                    float value1 = 0f;
            //                    float value2 = 0f;
            //                    if (float.TryParse(commandParams[1], out value1) && float.TryParse(commandParams[2], out value2))
            //                    {
            //                        doLimit = true;
            //                        disMin = value1;
            //                        disMax = value2;
            //                    }
            //                }
            //                break;
            //        }
            //    }
            //}

            //if(playAnim)
            //{
            //    control.PlayAnim(pitch, yaw, dis, control.CurOffsetX, control.CurOffsetY, 0.5f);
            //}
            
            //if(doLimit)
            //{
            //    CameraControlDefine.MinYaw = yawMin;
            //    CameraControlDefine.MaxYaw = yawMax;
            //    CameraControlDefine.MinPitch = pitchMin;
            //    CameraControlDefine.MaxPitch = pitchMax;
            //    CameraControlDefine.MinDis = disMin;
            //    CameraControlDefine.MaxDis = disMax;

            //    if(doLimitYaw)
            //    {
            //        CameraControlDefine.IsLimitYaw = true;
            //    }
            //}
            return true;
        }

        //设置摄像机特写高度
        public void SetCameraFeatureHeight(float height)
        {
            if (GameCenter.GameSceneSystem.ActivedScene == null)
                return;
            var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl;
            if (control == null)
                return;
            control.FeatureHeight = height;
        }
    }
}