using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Unity.Ugc.Common;
using Unity.Ugc.File;
using Unity.Ugc.Model;

namespace Unity.Ugc
{
    public partial class UgcSDK
    {
        private static UgcSettings _ugcSettings;
        
        private const string UgcServerAddress = "https://a.unity.cn/api/v1";
        private const string LoginServerAddress = "https://p.unity.cn";

        private const string CdnDomain = "https://a.unity3dcloud.cn/";
        
        /// <summary>
        /// 初始化UgcSDK
        /// </summary>
        public static void Init()
        {
            _ugcSettings = UgcSettings.Instance;
            if (_ugcSettings == null)
            {
                throw new Exception("ugc settings has not been initialized ( UOS -> UGC -> Settings )");
            }
            
            if (_ugcSettings.uosAppId == "" || _ugcSettings.uosAppSecret == "")
            {
                throw new Exception("please configure uos app id or secret first ( UOS -> UGC -> Settings )");
            }
            
            UgcClient.Initialize(_ugcSettings.uosAppId, _ugcSettings.uosAppSecret);
        }

        /// <summary>
        /// 登录账号
        /// </summary>
        /// <param name="provider">第三方token提供方</param>
        /// <param name="providerApp">第三方账号系统中的app标识</param>
        /// <param name="playerId">玩家id</param>
        /// <param name="playerToken">玩家第三方账号的token</param>
        public static async Task Login(string provider, string providerApp, string playerId, string playerToken)
        {
            ExternalLoginRequest request = new ExternalLoginRequest()
            {
                ExternalAppId = providerApp,
                ExternalUserID = playerId,
                ExternalAccessToken = playerToken,
                IdProvider = provider
            };

            var resp = await Login(request);
            if (resp != null)
            {
                UgcClient.UpdateAuthorizationToken(resp.AccessToken);
                UgcClient.UpdateRefreshToken(resp.RefreshToken);
            }
            else
            {
                throw new UgcException((int)ErrorCode.Unknown, "ugc login failed.");
            }
        }
        
        /// <summary>
        /// 退出登录状态
        /// </summary>
        public static void Logout()
        {
            UgcClient.UpdateAuthorizationToken("");
            UgcClient.UpdateRefreshToken("");
        }

        /// <summary>
        /// 上传Mod文件
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <param name="file">mod文件</param>
        /// <returns>上传失败的文件</returns>
        public static async Task<List<LocalFile>> UploadMod(string modId, LocalFile file)
        {
            var syncDict = new Dictionary<string, LocalFile>()
            {
                { file.Path, file }
            };
            
            return await FileManager.SyncFiles(modId, syncDict);
        }
        
        /// <summary>
        /// 上传Mod简介相关资源
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <param name="file">简介相关媒体文件</param>
        /// <returns>文件的下载链接</returns>
        public static async Task<string> UploadResource(string modId, LocalFile file)
        {
            var key = await FileManager.UploadFile(modId, file);
            return $"{CdnDomain}{key}";
        }
    }
}