using DG.Tweening;
using ET.EventType;
using UnityEngine;

namespace ET.Client
{
    public static class CameraMgr
    {
        public static void Init()
        {
            var camera = GlobalViewMgr.Instance.BattleCamera;
            camera.transform.SetPositionAndRotation(new Vector3(70, 50, 0), Quaternion.Euler(35, 0, 0));
            camera.fieldOfView = 60;
        }

        //相机跟随主角
        public static void FollowMe(Vector3 pos)
        {
            /*var camera = Camera.main;
            pos.x += 7;
            pos.y = 15;
            pos.z -= 25;
            camera.transform.position = pos;*/
        }

        private static bool bShaking = false;
        public static void ShakeMe(float shakeTime, Vector3 shakeStength)
        {
            if (bShaking) return;
            bShaking = true;

            Transform trans = GlobalViewMgr.Instance.BattleCamera.transform;
            var savePos = trans.localPosition;
            Tweener tweener = trans.DOShakePosition(shakeTime, shakeStength);
            tweener.OnComplete<Tweener>(() =>
            {
                trans.localPosition = savePos;
                bShaking = false;
            });
        }

        public static Vector3 CarmeraPos()
        {
            return Camera.main.transform.position;
        }

        public static void DragMe(Vector3 start, Vector3 end, float duration, System.Action endcb)
        {
            Transform trans = GlobalViewMgr.Instance.BattleCamera.transform;
            trans.position = start;
            var tweener = trans.DOMove(end, duration);
            tweener.OnComplete<Tweener>(() =>
            {
                endcb ?.Invoke();
            });
        }
    }

    [Event]
    public class CameraEventHandler : BEvent<CameraEvent>
    {
        protected override async ETTask OnEvent(CameraEvent args)
        {
            var endpos = new Vector3(args.X, args.Y, args.Z);
            float time = (float)args.TimeMS / 1000;
            Transform trans = GlobalViewMgr.Instance.BattleCamera.transform;

            if (args.MoveSpeedSec > 0.0001 && time < 0.01)
            {
                var dis = Vector3.Distance(trans.position, endpos);
                time = dis / args.MoveSpeedSec;
            }
            trans.DOMove(endpos, time);
            await ETTask.CompletedTask;
        }
    }

}