using Cysharp.Threading.Tasks;
using SHFrame;
using SHFrame.FSM;
using YooAsset;

namespace HotMain.SHGame.Procedure
{
    /// <summary>
    /// 更新资源清单
    /// </summary>
    public class ProcedureUpdatePackageManifest : ProcedureBase
    {
        protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
        {
            base.OnEnter(procedureOwner);
            UpdateManifest(procedureOwner).Forget();
        }
        
        private async UniTask UpdateManifest(IFsm<IProcedureManager> procedureOwner)
        {
            bool result = await UpdatePackageManifest(ProcedureInitializePackage.RawFilePackageName);
            if (!result) return;

            result = await UpdatePackageManifest(ProcedureInitializePackage.DefaultPackageName);
            if (!result) return;

            //切换到更新资源版本
            ChangeState<ProcedureUpdatePackageVersion>(procedureOwner);
        }
        

        /// <summary>
        /// 更新资源清单
        /// </summary>
        /// <returns></returns>
        private async UniTask<bool> UpdatePackageManifest(string packageName)
        {
            ResourcePackage package = YooAssets.GetPackage(packageName);

            //2.获取资源版本
            UpdatePackageVersionOperation updateVerOperation = package.UpdatePackageVersionAsync(false);
            await updateVerOperation.ToUniTask();

            // TODO 如果初始化失败弹出提示界面
            if (updateVerOperation.Status != EOperationStatus.Succeed)
            {
                //初始化失败了 弹出提示
                Log.Error($"{package.PackageName} 获取远程资源版本信息失败: {updateVerOperation.Error}");
                return false;
            }

            string packageVersion = updateVerOperation.PackageVersion;
            Log.Debug($"Init {package.PackageName} version  : {packageVersion}");

            //3.更新补丁清单
            UpdatePackageManifestOperation updateManifestOperation = package.UpdatePackageManifestAsync(packageVersion);
            await updateManifestOperation.ToUniTask();

            if (updateManifestOperation.Status != EOperationStatus.Succeed)
            {
                //更新失败了 弹出提示
                Log.Error($"{package.PackageName} 更新资源版本清单失败: {updateManifestOperation.Error}");
                return false;
            }
            
            return true;
        }
        
    }
}