using UnityEngine;
using ET;
using static GFGGame.LauncherConfig;
using System;
using YooAsset;
using System.Collections;
using FairyGUI;
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 && LauncherConfig.ChannelId == (int)ChannelID.Test))
            {
                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(StudioDataManager.Instance.luckyBoxFilingChapterId, new object[] { typeof(ActivityThemeLuckyBoxView).FullName, this.viewData });
                        ViewManager.Show(MainStoryDataManager.currentChapterCfgId);
                        ////新玩家选择套装
                        //if (RoleInfoManager.Instance.NewRoleSuitStatus == false)
                        //{
                            //ViewManager.Show();
                        //}
                    }
                }
                GMController.AddShowGMViewEventListener();
            });
        }
        public static async void AfterShowMainUI(object param = null)
        {
            if (GameGlobal.AfterDataInited) return;
            await ActivitySProxy.ReqSevenDayLoginInfos();
            await ActivityGlobalSProxy.GetActivityInfo();
            await ShopSProxy.ReqShopInfo();
            await ActivitySProxy.ReqGetNewPlayerBonusStatus();
            await ActivitySProxy.GetNewPlayerOnceStatus();
            await ActivitySProxy.GetTipsStatus();
            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();
            MainStorySProxy.GetStoryBonusDate().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();
            TimeTracingDataManager.Instance.InitRewardDic();
            TimeTracingSProxy.ReqGetLevelRewardStatus().Coroutine();
            TimeTracingSProxy.ReqGetSuitRewardStatus().Coroutine();
            TimeTracingSProxy.ReqGetDataRecord().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();
            ActivitySProxy.ReqGetActivitySignInfos().Coroutine();
            //RoleInfoSProxy.ReqNewRoleGetSuitStatus().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.AutoZGTHDCTips = true;
            GameGlobal.AutoZGTHTips = true;
            GameGlobal.AutoPearRebateTips = 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();
            MainDataManager.Instance.Clear();
            NewYearRedEnvelopeDataManager.Instance.Clear();
            GameGlobal.zoneScene.GetComponent()?.Disconnect();
            GameGlobal.zoneScene.GetComponent()?.ServerInfoList?.Clear();
            GameGlobal.zoneScene.GetComponent()?.Clear();
            if (logout)
            {
                    QDManager.Logout(fromSdkLogoutCallback);
            }
            ViewManager.Hide();
            if(!ViewManager.isViewOpen(typeof(LoginView).FullName))
            {
                ViewManager.Show(null, true);
                GameController.CheckUpdateVersion(true);
            }
        }
        //断线重连后需要处理的事情
        public static async void OnReconnected()
        {
            //重连成功请求邮件和公告等离线后会变更的数据
            NoticeSProxy.ReqSystemNoticeList().Coroutine();
            MailSProxy.ReqMailCount().Coroutine();
            FriendSProxy.ReqAllFriendInfos().Coroutine();
            PoemGallerySProxy.ReqGalleryTheme().Coroutine();
            TaskSProxy.GetTaskInfos();
            ArenaDataManager.Instance.ReqArenaInfo();
            if (LeagueDataManager.Instance.Type == LeagueJoinType.Join) {
                await LeagueSproxy.ReqGetLeagueInfo();
                LeagueSproxy.GetTeapartyMatchingInfos(RoleDataManager.roleId).Coroutine();
                LeagueSproxy.GetTeapartyInfos().Coroutine();
                LeagueSproxy.ReqJoinAnswer().Coroutine();
            }
        }
        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();
                        }
                    });
        }
        public static void CheckUpdateVersion(bool force = false)
        {
            if (ET.TimeHelper.ClientNowSeconds() - GameGlobal.pauseTime > 180 || LauncherConfig.netType == LauncherConfig.EnumNetType.LOCAL || force)
            {
                Timers.inst.StartCoroutine(CheckVersion(VersionController.DefaultPackage, force));
            }
        }
        private static IEnumerator CheckVersion(string packageName, bool force)
        {
            var package = YooAssets.GetPackage(packageName);
            if (string.IsNullOrEmpty(GameGlobal.promotedVersion))
            {
                GameGlobal.promotedVersion = package.GetPackageVersion();
            }
            var operation = package.UpdatePackageVersionAsync();
            yield return operation;
            if (operation.Status == EOperationStatus.Succeed)
            {
                LogUtil.LogDev($"版本对比: {GameGlobal.promotedVersion} {operation.PackageVersion}");
                if (!string.IsNullOrEmpty(operation.PackageVersion) 
                    && !string.IsNullOrEmpty(operation.PackageVersion) 
                    && !operation.PackageVersion.Equals(GameGlobal.promotedVersion))
                {
                    GameGlobal.promotedVersion = operation.PackageVersion;
                    if(force)
                    {
                        AlertSystem.Show("游戏已有更新,请重启游戏获取最佳游戏体验。")
                        .SetRightButton(true, "重启游戏", (obj) =>
                        {
                            Application.Quit();
                        });
                    }
                    else
                    {
                        AlertSystem.Show("游戏已有更新,您可以立即重启游戏获取最佳游戏体验,也可以稍后重启更新。")
                            .SetLeftButton(true, "稍后更新")
                            .SetRightButton(true, "重启游戏", (obj) =>
                            {
                                Application.Quit();
                            });
                    }
                }
            }
        }
    }
}