using System;
using Common.Utility.CombatEvent;
using Common.Utility.CombatTimer;
using Core.Audio;
using Core.Event.Event;
using Core.State;
using Core.Utility;
using Excel2Json;
using Fort23.Core;
using GameLogic.Combat.CombatGuide;
using GameLogic.Combat.CombatState;
using GameLogic.Combat.CombatTool.CombatReport;
using GameLogic.Combat.CombatType;
using GameLogic.Combat.Hero;
using GameLogic.Combat.Hero.HeroGPU;
using GameLogic.CombatScenesTool;
using UnityEngine;
using Utility.CustomizeTimeLogic.FxLogic.TimeLineEvent;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
namespace GameLogic.Combat.CombatTool
{
    public class CombatController : ITimeLineAudio, IDisposable
    {
        public static string idle = "idle";
        public static string update = "update";
        public static string fight = "fight";
        public static CombatController currActiveCombat;
        public CombatHeroController CombatHeroController;
        public CombatCameraControllder CombatCameraControllder;
        public CombatTypeBasic CombatTypeBasic;
        protected StateControl stateControl;
        public CombatSenceController CombatSenceController;
        public CombatDataController CombatDataController;
        public GameTimeLineParticleFactory GameTimeLineParticleFactory;
        public MagicWeaponCombatSence MagicWeaponCombatSence;
        // public RandomEventController RandomEventController;
        public bool isUpdate;
        /// 
        /// 涨停游戏英雄AI行为
        /// 
        public bool isStopAi;
        public float speed = 1;
        private bool _isFullUIShow;
        public bool IsGameOver;
        public bool IsFightState;
        public System.Action combatFinish;
        public float combatTime;
        public CombatHeroEntity playerHeroEntity;
        public bool isWin;
        public CombatStateBasic CurrState
        {
            get { return stateControl.CurrIState as CombatStateBasic; }
        }
        public async CTask InitCombat(StartCombatInfo startCombatInfo)
        {
            combatTime = 0;
            isWin = false;
            IsGameOver = false;
            CombatReportManager.Instance.Clear();
            // CombatGuideManager.Instance.Init();
            TimeLineSingletonEventManager.Instance.AddTimeLineBasic(this);
            GameTimeLineParticleFactory = new GameTimeLineParticleFactory();
            TimeLineFxParticleTool.Instance.Init(GameTimeLineParticleFactory);
            // RandomEventController = new RandomEventController();
            currActiveCombat = this;
            if (stateControl == null)
            {
                stateControl = new StateControl();
                stateControl.AddState("idle", new CombatIdleState(this));
                stateControl.AddState("update", new CombatUpdateState(this));
                stateControl.AddState("fight", new CombatFightState(this));
                stateControl.AddState("combatfinish", new CombatFinishState(this));
                
                MagicWeaponCombatSence = new MagicWeaponCombatSence();
                MagicWeaponCombatSence.Init();
                if (CombatSenceController == null)
                {
                    CombatSenceController = new CombatSenceController();
                    await CombatSenceController.InitScenes();
                }
                if (CombatDataController == null)
                {
                    CombatDataController = new CombatDataController();
                    await CombatDataController.Init();
                }
            }
            Camera camera = Camera.main;
            CombatCameraControllder = new CombatCameraControllder();
            CombatCameraControllder.Init(this, camera);
            CombatHeroController = new CombatHeroController();
            await CombatHeroController.Init(this);
            switch (startCombatInfo.CombatType)
            {
                case CombatType.CombatType.TestCombat:
                    CombatTypeBasic = new TestCombatType();
                    break;
                case CombatType.CombatType.LevelBattle:
                    CombatTypeBasic = new LevelBattleCombatType();
                    break;
            }
            CombatTypeBasic.Init(this, startCombatInfo);
            await CombatTypeBasic.StartGame();
            ChangeState("update");
            isUpdate = true;
            EventManager.Instance.AddEventListener(CustomEventType.RefreshFull, RefreshFull);
            CombatEventManager.Instance.Dispatch(CombatEventType.GameStart, null);
        }
        private void RefreshFull(IEventData eventData)
        {
            RefreshFullEventData data = (RefreshFullEventData)eventData;
            _isFullUIShow = data.isFullShow;
        }
        public void ChangeState(string name)
        {
            stateControl.ChangeState(name);
        }
        public void Update(float t)
        {
            CombatGestureController.Instance.Update();
            if (!isUpdate || _isFullUIShow)
            {
                return;
            }
            t *= speed;
            combatTime += t;
            stateControl.Update(t);
            CombatTypeBasic?.Update(t);
            MagicWeaponCombatSence?.Update(t);
            CombatSenceController?.Update(t);
            CombatTimerManager.Instance.ComabtUpdate(t);
            CombatGuideManager.Instance.Update();
            LateUpdate(t);
        }
        private void TriggerCombat()
        {
        }
        public void LateUpdate(float t)
        {
            CombatHeroController.LateUpdate(t);
            CombatReportManager.Instance.Update();
        }
        public async CTask PlayAudio(string audioName, bool isLoop)
        {
            return await AudioManager.Instance.PlayAudio(audioName, isLoop);
        }
        public void GameOver(bool isWin)
        {
            this.isWin = isWin;
            IsGameOver = true;
            ChangeState("combatfinish");
            combatFinish?.Invoke(isWin);
        }
        public void DisposeOneCombatInfo()
        {
            CombatReportManager.Instance.Clear();
            MagicWeaponCombatSence.CloseSecene();
            CombatEventManager.Instance.Dispose();
        }
        public void Dispose()
        {
            TimeLineSingletonEventManager.Instance.RemoveTimeLineBasic(this);
            CombatTypeBasic?.Dispose();
            CombatHeroController?.Dispose();
            CombatCameraControllder?.Dispose();
            CombatSenceController?.Dispose();
            GameTimeLineParticleFactory?.Dispose();
            EventManager.Instance.RemoveAllEventListener(CustomEventType.RefreshFull);
        }
    }
}