using UnityEngine;
using ET;
using static GFGGame.LauncherConfig;
using System;
namespace GFGGame
{
    public class GameController
    {
        public static async void Start()
        {
            //初始化声音,不可以去掉
            MusicManager.Instance.Stop();
            SoundManager.Instance.Stop();
            VoiceManager.Instance.Stop();
            //GameObject对象池
            PrefabManager.Instance.Init();
            //字体
            await FontLoader.Instance.Init();
            //界面
            UGUIManager.Instance.Init();
            ViewManager.Init();
            //日志
            LogController.Instance.Init();
            //全局
            GameGlobal.Init();
            //sqlite
            SqliteController.Instance.Init(false, ResPathUtil.SQLITE_FILE_PATH);
            //渠道
            QDManager.Init();
            //全局点击效果
            ViewGlobal.CreatClickEffect();
            //获取游戏配置
            GetGameCfg();
        }
        /// 
        /// 获取游戏配置
        /// 
        public static void GetGameCfg()
        {
            var url = LauncherConfig.cfgUrl.Replace("{cfgName}", GameGlobal.cfgName);
            url = url + "?t=" + TimeHelper.ClientNow();
            LauncherView.Instance.SetDesc("正在解压数据...");
            HttpTool.Instance.Get(url, (string data) =>
            {
                //初始化游戏配置
                GameConfig.InitData(data);
                //缓存一部分配置文件
                FightScoreCfgArray.Instance.Init();
                StudioCfgArray.Instance.Init();
                DailySignCfgArray.Instance.Init();
                DailyLoginCfgArray.Instance.Init();
                DressUpMenuItemCfg2Array.Instance.Init();
                AdCfgArray.Instance.Init();
                ItemTypeCfgArray.Instance.Init();
                GuideCfgArray.Instance.Init();
                SuitCfgArray.Instance.Init();
                ShopCfgArray.Instance.Init();
                SuitFosterCfgArray.Instance.Init();
                VipCfgArray.Instance.Init();
                ActivityRechargeCfgArray.Instance.Init();
                ActivityLuckybonusCfgArray.Instance.Init();
                Activity7DaysTaskCfgArray.Instance.Init();
                Activity7DaysCfgArray.Instance.Init();
                SuitGuideMenuCfgArray.Instance.Init();
                ActivityRecharge2CfgArray.Instance.Init();
                SuitFosterListCfgArray.Instance.Init();
                TaskCfgArray.Instance.Init();
                LauncherView.Instance.Close();
                //显示登录
                LoginController.ShowLogin();
            });
        }
        public static bool CheckLoginCache(bool doLogin)
        {
            string account = PlayerPrefs.GetString(GameConst.ACCOUNT_LAST_LOGIN_KEY, null);
            string password = PlayerPrefs.GetString(GameConst.PASSWORD_LAST_LOGIN_KEY, null);
            bool lastLoginIsVisitor = LocalCache.GetBool(GameConst.LAST_LOGIN_IS_VISITOR_KEY, false);
            if (lastLoginIsVisitor)
            {
                long id = (long)PlayerPrefs.GetFloat(GameConst.VISITOR_ID_KEY, -1);
                if (id >= 0)
                {
                    if (doLogin)
                    {
                        //LoginProxy.LoginAsVisitor();
                    }
                    return true;
                }
            }
            else if (!string.IsNullOrEmpty(account))
            {
                if (!string.IsNullOrEmpty(password))
                {
                    if (doLogin)
                    {
                        LoginController.Login(account, password, true).Coroutine();
                    }
                    return true;
                }
                else if (LauncherConfig.netType == LauncherConfig.EnumNetType.LOCAL && PlayerPrefs.HasKey(GameConst.PASSWORD_LAST_LOGIN_KEY))
                {
                    if (doLogin)
                    {
                        LoginController.LoginTest(account).Coroutine();
                    }
                    return true;
                }
            }
            return false;
        }
        public static void CheckSpecialAccount(string account)
        {
            GameGlobal.antiAddiction = !(account.IndexOf("sygfg") == 0);
        }
        public static void ShowCreateRole()
        {
            ViewManager.Show();
        }
        public static async ETTask PreEnterGameAsync()
        {
            QDManager.OnEnterGame();
            RoleDataHandler.StartUpdate();
            //GFGUIPackage.AddPackage(ResPathUtil.GetUIPackagePath("CommonGame"));
            //GFGUIPackage.AddPackage(ResPathUtil.GetUIPackagePath("Main"));
            await ItemProxy.GetItemInfos();
            await RoleLimitSProxy.ReqUnitLimitInfos();
            await InstanceZonesSProxy.GetInstanceZonesInfos();
            await StorageSProxy.ReqGetClientValues();
            await RoleInfoSProxy.ReqPersonalInfo();
            //功能协议数据不要放这里获取,放在AfterEnterGame函数中
            GameGlobal.lastLoginTime = StorageDataManager.Instance.GetStorageValue(ConstStorageId.LAST_LOGIN_TIME);
            long lastTime = GameGlobal.myNumericComponent.GetAsInt(NumericType.OnlineTimeSecs);
            StorageSProxy.ReqSetClientValue(ConstStorageId.LAST_LOGIN_TIME, (int)lastTime).Coroutine();
            int skipGuide = StorageDataManager.Instance.GetStorageValue(ConstStorageId.STORAGE_SKIP_GUIDE);
            if (skipGuide <= 0 && LauncherConfig.netType == EnumNetType.LOCAL)
            {
                AlertUI.Show("是否跳过引导?如果您是第一次体验,建议不要跳过引导!")
                           .SetLeftButton(true, "不用", (obj) =>
                           {
                               EnterGame();
                               StorageSProxy.ReqSetClientValue(ConstStorageId.STORAGE_SKIP_GUIDE, 1).Coroutine();
                           })
                           .SetRightButton(true, "跳过", (obj) =>
                           {
                               GameGlobal.skipGuide = true;
                               EnterGame();
                               StorageSProxy.ReqSetClientValue(ConstStorageId.STORAGE_SKIP_GUIDE, 2).Coroutine();
                           });
            }
            else
            {
                if (skipGuide == 2) GameGlobal.skipGuide = true;
                EnterGame();
            }
        }
        private static void EnterGame()
        {
            LoadingView.Instance.SetProgress(100, () =>
            {
                ViewManager.Hide();
                GameGlobal.isEnterGame = true;
                if (MainStoryDataManager.CheckOpenMainUI() || GameGlobal.skipGuide)
                {
                    ViewManager.Show();
                }
                else
                {
                    MainStoryDataManager.currentChapterCfgId = 10001;
                    // GameGlobal.isFirstEntry == true 
                    if (!InstanceZonesDataManager.CheckLevelPass(100001001))
                    {
                        //UICGView.Instance.Show();
                        StoryController.ShowLevelView(100001001);
                    }
                    else
                    {
                        ViewManager.Show(MainStoryDataManager.currentChapterCfgId);
                        //ViewManager.Show(StudioDataManager.Instance.luckyBoxFilingChapterId, new object[] { typeof(ActivityThemeLuckyBoxView).FullName, this.viewData });
                        ViewManager.Show(MainStoryDataManager.currentChapterCfgId);
                    }
                }
                GMController.AddShowGMViewEventListener();
            });
        }
        public static async void AfterShowMainUI(object param = null)
        {
            if (GameGlobal.AfterDataInited) return;
            await ActivitySProxy.ReqSevenDayLoginInfos();
            await ActivityGlobalSProxy.GetActivityInfo();
            await ShopSProxy.ReqShopInfo();
            FieldDataManager.Instance.waitToShowFieldFightEndView = false;
            bool result = await FieldSProxy.ReqFieldInstanceInfos();
            if (result && FieldDataManager.Instance.fieldInfos.hasBonus)
            {
                bool result1 = await FieldSProxy.ReqFieldInstanceResult();
                if (result1)
                {
                    FieldDataManager.Instance.waitToShowFieldFightEndView = true;
                }
            }
            GameGlobal.AfterDataInited = true;
            EventAgent.DispatchEvent(ConstMessage.AFTER_DATA_INITED);
            ItemProxy.GetItemAttributeInfos().Coroutine();
            ItemProxy.ReqGetItemCollect().Coroutine();
            MainStorySProxy.GetStoryBonusInfos().Coroutine();
            CardSProxy.GetCardInfos().Coroutine();
            TaskSProxy.GetTaskInfos();
            BattlePassTaskSProxy.GetBattlePassInfo().Coroutine();     
            DailyTaskSProxy.ReqDailyTaskInfos().Coroutine();
            NoticeSProxy.ReqSystemNoticeList().Coroutine();
            MailSProxy.ReqMailCount().Coroutine();
            FriendSProxy.ReqAllFriendInfos().Coroutine();
            ActivityAfuGiftSProxy.GetAfuGiftInfo().Coroutine();
            ActivityTeaSProxy.ReqGetNPCVisitInfo().Coroutine();
            ActivitySProxy.ReqActivityZCJBInfo().Coroutine();
            MiniGameProxy.ReqGetChallengeReward().Coroutine();
            PoemPhotoSProxy.ReqAllPhotoInfos().Coroutine();
            TravelSProxy.ReqTravelInfo().Coroutine();
            TravelSProxy.ReqTravelGuideInfo().Coroutine();
            PoemGallerySProxy.ReqGalleryTheme().Coroutine();
            ArenaDataManager.Instance.ReqArenaInfo();
            SkillSProxy.ReqGetSkillList(SkillType.LeagueSkill).Coroutine();
            EnduringGiftBoxSProxy.ReqGetAllGiftBagRebateStatus().Coroutine();
            ChatSProxy.ReqQueryChatMsg(ChatType.League).Coroutine();
            ChatSProxy.ReqQueryChatMsg(ChatType.LeagueQuestion).Coroutine();
            LuckyBoxSProxy.ReqGetLuckyBoxInfo().Coroutine();
            LeagueSproxy.ReqGetLeagueInfo().Coroutine();
            SuitFosterProxy.SendGetSuitInfos().Coroutine();
            StudioSProxy.ReqStudioInfos().Coroutine();
            LuckyBoxSProxy.ReqGetLuckyBoxRotatingInfo().Coroutine();
            LeagueSproxy.GetTeapartyInfos().Coroutine();
            LeagueSproxy.GetTeapartyMatchingInfos(RoleDataManager.roleId).Coroutine();
            int storageAutoPlay = StorageDataManager.Instance.GetStorageValue(ConstStorageId.STORAGE_AUTO_PLAY);
            FightDataManager.Instance.autoPlay = storageAutoPlay <= 0 ? false : true;
            int fightSpeed = StorageDataManager.Instance.GetStorageValue(ConstStorageId.STORAGE_FIGHT_AUTO_PLAY_SPEED);
            FightDataManager.Instance.fightSpeed = fightSpeed <= 0 ? 1 : fightSpeed;
            int dialogSpeed = StorageDataManager.Instance.GetStorageValue(ConstStorageId.STORAGE_DIALOG_AUTO_PLAY_SPEED);
            FightDataManager.Instance.dialogSpeed = dialogSpeed <= 0 ? 1 : dialogSpeed;
            int filingChapterId = StorageDataManager.Instance.GetStorageValue(ConstStorageId.STUDIO_FILING_CHAPTERID);
            StudioDataManager.Instance.npcFilingChapterId = filingChapterId <= 0 ? StudioDataManager.Instance.FilingDatas[0].id : filingChapterId;
            StudioDataManager.Instance.filingChapterId = StudioDataManager.Instance.npcFilingChapterId;
            GameGlobal.skipCheckOpen = StorageDataManager.Instance.GetStorageValue(ConstStorageId.SKIP_CHECK_OPEN) <= 0 ? false : true;
        }
        public static void QuitToLoginView(bool logout, bool fromSdkLogoutCallback = false)
        {
            FieldDataManager.Instance.waitToShowFieldFightEndView = false;
            GameGlobal.AutoSevenDayLoginView = true;
            GameGlobal.AutoDailySignView = true;
            GameGlobal.AutoSpecialOfferGiftBoxView = true;
            GameGlobal.AutoAcitivtyTipsLoginView = true;
            GameGlobal.AutoMonthlyCardView = true;
            GameGlobal.AutoShowCompleted = false;
            GameGlobal.PreDataInited = false;
            GameGlobal.AfterDataInited = false;
            QDManager.OnQuitToLoginView();
            GameGlobal.isVisitor = false;
            GameGlobal.antiAddiction = true;
            GameGlobal.userId = 0;
            GameGlobal.userAge = 0;
            GameGlobal.skipGuide = false;
            GuideDataManager.currentGuideId = 0;
            MainDataManager.Instance.ViewType = 0;
            RoleDataHandler.StopUpdate();
            CardDataManager.Clear();
            ItemDataManager.Clear();
            ViewManager.Clear();
            DecomposeDataManager.Instance.Clear();
            PhotographDataManager.Instance.Clear();
            SkillDataManager.Instance.Clear();
            SuitFosterDataManager.Instance.Clear();
            StudioDataManager.Instance.Clear();
            StorageDataManager.Instance.Clear();
            ShopDataManager.Instance.Clear();
            DressUpMenuItemDataManager.Clear();
            GuideDataManager.Clear();
            GetSuitItemController.Clear();
            FriendDataManager.Instance.Clear();
            RedDotController.Instance.Clear();
            BagDataManager.Instance.Clear();
            PoemPhotoDataManager.Instance.Clear();
            PoemGalleryDataManager.Instance.Clear();
            RoleInfoManager.Instance.Clear();
            DailyTaskDataManager.Instance.Clear();
            TravelDataManager.Instance.Clear();
            ArenaDataManager.Instance.Clear();
            ChatDataManager.Instance.Clear();
            ActivityDataManager.Instance.Clear();
            ActivityGlobalDataManager.Instance.Clear();
            EnduringGiftBoxDataManager.Instance.Clear();
            LimitedTimeGiftBoxDataManager.Instance.Clear();
            BattlePassTaskDataManager.Instance.Clear();
            TaskDataManager.Instance.Clear();
            LeagueDataManager.Instance.Clear();
            ActivityAfuGiftDataManager.Instance.Clear();
            FightDataManager.Instance.Clear();
            GameGlobal.zoneScene.GetComponent()?.Disconnect();
            GameGlobal.zoneScene.GetComponent()?.ServerInfoList?.Clear();
            GameGlobal.zoneScene.GetComponent()?.Clear();
            if (logout)
            {
                if (PlayerPrefs.HasKey(GameConst.PASSWORD_LAST_LOGIN_KEY))
                {
                    PlayerPrefs.DeleteKey(GameConst.PASSWORD_LAST_LOGIN_KEY);
                }
                if (!fromSdkLogoutCallback)
                {
                    QDManager.Logout();
                }
            }
            ViewManager.Hide();
            ViewManager.Show(null, true);
        }
        //断线重连后需要处理的事情
        public static void OnReconnected()
        {
            //重连成功请求邮件和公告等离线后会变更的数据
            NoticeSProxy.ReqSystemNoticeList().Coroutine();
            MailSProxy.ReqMailCount().Coroutine();
            FriendSProxy.ReqAllFriendInfos().Coroutine();
            PoemGallerySProxy.ReqGalleryTheme().Coroutine();
            TaskSProxy.GetTaskInfos();
        }
        public static void GoBackToMainView()
        {
            MainDataManager.Instance.ViewType = 0;
            ViewManager.Show(null, true);
        }
        public static void ShowExitAlert(Action sureCallback = null)
        {
            AlertSystem.Show("我会想你的")
                    .SetLeftButton(true, "继续游戏")
                    .SetRightButton(true, "退出游戏", (object data) => 
                    { 
                        if(sureCallback != null)
                        {
                            sureCallback.Invoke();
                        }
                        else
                        {
                            Application.Quit();
                        }
                    });
        }
    }
}