﻿using System.Collections.Generic;
using System.Threading.Tasks;
using Unity.Ugc.Model;
using Newtonsoft.Json;

namespace Unity.Ugc
{
    public partial class UgcSDK
    {
        /// <summary>
        /// 获取当前所有已发布的mod
        /// </summary>
        /// <param name="page">起始页码</param>
        /// <param name="perPage">每页显示条数</param>
        /// <returns>已发布的mod列表</returns>
        public static async Task<PublishedModList> ListPublishedMods(int page = 1, int perPage = 10)
        {
            // ？？是否改用search api
            string url = $"{UgcServerAddress}/mods/published/";
            var queryParams = new Dictionary<string, object>
            {
                { "page", page },
                { "per_page", perPage}
            };
            return await UgcClient.Get<PublishedModList>(url, queryParams: queryParams);
        }
        
        
        /// <summary>
        /// 通过id获取已发布的mod
        /// </summary>
        /// <param name="modId">mod的ID</param>
        /// <returns>已发布的mod</returns>
        public static async Task<PublishedMod> GetPublishedMod(string modId)
        {
            string url = $"{UgcServerAddress}/mods/published/{modId}/";
            return await UgcClient.Get<PublishedMod>(url);
        }

        /// <summary>
        /// 获取当前用户自己的mod
        /// </summary>
        /// <param name="page">起始页码</param>
        /// <param name="perPage">每页显示条数</param>
        /// <returns>自己的mod列表</returns>
        public static async Task<ModList> ListOwnedMods(int page = 1, int perPage = 10)
        {
            string url = $"{UgcServerAddress}/mods/owned/";
            var queryParams = new Dictionary<string, object>
            {
                { "page", page },
                { "per_page", perPage}
            };
            return await UgcClient.Get<ModList>(url, queryParams: queryParams);
        }

        // /// <summary>
        // /// 根据id获取一个所拥有的mod
        // /// </summary>
        // /// <param name="modId">mod的id</param>
        // /// <param name="basicConfig">自定义请求参数</param>
        // /// <returns>该id对于的mod</returns>
        // public async UniTask<Mod> GetOwnedMod([NotNull] string modId,
        //     [CanBeNull] RequestConfig basicConfig = null)
        // {
        //     var config = basicConfig ?? new RequestConfig();
        //     config.Url = $"/owned/{modId}";
        //
        //     var result = await _httpClient.Get(config);
        //     return result?.Text.FromJson<Mod>();
        // }

        /// <summary>
        /// 创建mod
        /// </summary>
        /// <param name="request">创建mod的参数</param>
        /// <returns>创建的mod</returns>
        public static async Task<Mod> CreateMod(CreateModRequest request)
        {
            string url = $"{UgcServerAddress}/mods/basic/";
            var requestData = JsonConvert.SerializeObject(request);
            return await UgcClient.Post<Mod>(url, requestData);
        }

        /// <summary>
        /// 更新mod信息
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <param name="request">更新mod的参数</param>
        /// <returns>更新后的mod</returns>
        public static async Task<Mod> UpdateMod(string modId, UpdateModRequest request)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/";
            var requestData = JsonConvert.SerializeObject(request);
            return await UgcClient.Put<Mod>(url, requestData);
        }

        /// <summary>
        /// 删除mod
        /// </summary>
        /// <param name="modId">mod的id</param>
        public static async Task<EmptyClass> DeleteMod(string modId)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/";
            return await UgcClient.Delete<EmptyClass>(url);
        }

        /// <summary>
        /// 提交mod版本
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <param name="request">版本信息</param>
        /// <returns>提交完后的mod</returns>
        public static async Task<Mod> SubmitVersion(string modId, SubmitVersionRequest request)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/submit/";
            var requestData = JsonConvert.SerializeObject(request);
            return await UgcClient.Post<Mod>(url, requestData);
        }

        /*
        /// <summary>
        /// 获取mod的所有版本
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <param name="page">起始页码</param>
        /// <param name="perPage">每页显示条数</param>
        /// <returns>版本列表</returns>
        public static async Task<ModVersionList> ListModVersions(string modId, int page = 1, int perPage = 10)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/versions/";
            var queryParams = new Dictionary<string, object>
            {
                { "page", page },
                { "per_page", perPage}
            };
            return await UgcClient.Get<ModVersionList>(url, queryParams: queryParams);
        }

        /// <summary>
        /// 删除mod的一个版本
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <param name="versionId">版本的id</param>
        public static async Task<EmptyClass> DeleteModVersion(string modId, string versionId)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/versions/{versionId}/";
            return await UgcClient.Delete<EmptyClass>(url);
        }
        */

        /// <summary>
        /// 获取mod当前存放而未展示的所有文件信息
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <param name="page">起始页码</param>
        /// <param name="perPage">每页显示条数</param>
        /// <returns>指定mod目前的文件列表</returns>
        public static async Task<ModEntryList> ListEntries(string modId, int page = 1, int perPage = 10)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/entries/";
            var queryParams = new Dictionary<string, object>
            {
                { "page", page },
                { "per_page", perPage}
            };
            return await UgcClient.Get<ModEntryList>(url, queryParams: queryParams);
        }

        /// <summary>
        /// 获取某个版本的所有文件信息
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <param name="versionId">版本的id</param>
        /// <param name="page">起始页码</param>
        /// <param name="perPage">每页显示条数</param>
        /// <returns>指定版本的文件列表</returns>
        public static async Task<ModEntryList> ListVersionEntries(string modId, string versionId, int page = 1, int perPage = 10)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/versions/{versionId}/entries/";
            var queryParams = new Dictionary<string, object>
            {
                { "page", page },
                { "per_page", perPage}
            };
            return await UgcClient.Get<ModEntryList>(url, queryParams: queryParams);
        }

        /// <summary>
        /// 查询已发布的mod
        /// </summary>
        /// <param name="request">查询条件</param>
        /// <returns>指定条件下已发布的mod列表</returns>
        public static async Task<PublishedModList> SearchPublishedMods(SearchModRequest request)
        {
            string url = $"{UgcServerAddress}/mods/search/";
            var requestData = JsonConvert.SerializeObject(request);
            return await UgcClient.Post<PublishedModList>(url, requestData);
        }
        
        /*
         * Interactive
         */
        
        /// <summary>
        /// 订阅mod
        /// </summary>
        /// <param name="modId">mod的id</param>
        public static async Task<ModFlags> SubscribeMod(string modId)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/subscribe/";
            return await UgcClient.Get<ModFlags>(url);
        }
        
        /// <summary>
        /// 取消订阅mod
        /// </summary>
        /// <param name="modId">mod的id</param>
        public static async Task<ModFlags> UnsubscribeMod(string modId)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/unsubscribe/";
            return await UgcClient.Get<ModFlags>(url);
        }
        
        /// <summary>
        /// 点赞mod
        /// </summary>
        /// <param name="modId">mod的id</param>
        public static async Task<ModFlags> LikeMod(string modId)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/like/";
            return await UgcClient.Get<ModFlags>(url);
        }

        /// <summary>
        /// 取消点赞mod
        /// </summary>
        /// <param name="modId">mod的id</param>
        public static async Task<ModFlags> UnlikeMod(string modId)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/unlike/";
            return await UgcClient.Get<ModFlags>(url);
        }
        
        /// <summary>
        /// 获取mod的flags
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <returns>获取mod的flags</returns>
        public static async Task<ModFlags> GetModFlags(string modId)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/flags/";
            return await UgcClient.Get<ModFlags>(url);
        }
        
        /// <summary>
        /// 获取已订阅的mod
        /// </summary>
        /// <param name="page">起始页码</param>
        /// <param name="perPage">每页显示条数</param>
        /// <returns>已订阅的mod列表</returns>
        public static async Task<PublishedModList> ListSubscribedMods(int page = 1, int perPage = 10)
        {
            string url = $"{UgcServerAddress}/mods/subscribed/";
            var queryParams = new Dictionary<string, object>
            {
                { "page", page },
                { "per_page", perPage}
            };
            return await UgcClient.Get<PublishedModList>(url, queryParams: queryParams);
        }
        
        /// <summary>
        /// 获取指定mod的flag统计数据
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <returns>mod的flag统计数据</returns>
        public static async Task<ModFlagsCount> GetModFlagsCount(string modId)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/flags_count/";
            return await UgcClient.Get<ModFlagsCount>(url);
        }
        
        /// <summary>
        /// 举报指定的mod
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <param name="reason">举报理由</param>
        /// <returns>mod的flag统计数据</returns>
        public static async Task<ModFlags> ReportMod(string modId, string reason)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/report/";
            ReportDetails reportDetails = new ReportDetails()
            {
                ReportReason = reason
            };
            var data = JsonConvert.SerializeObject(reportDetails);
            return await UgcClient.Post<ModFlags>(url, data);
        }
        
        /*
        /// <summary>
        /// 取消举报指定的mod
        /// </summary>
        /// <param name="modId">mod的id</param>
        /// <returns>mod的flag统计数据</returns>
        public static async Task<ModFlags> UnreportMod(string modId)
        {
            string url = $"{UgcServerAddress}/mods/basic/{modId}/unreport/";
            return await UgcClient.Get<ModFlags>(url);
        }
        */
    }
}