﻿using System;
using System.Net;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Unity.Ugc.Common;
using Unity.Ugc.Model;
using UnityEngine;
using UnityEngine.Networking;
using TokenResponse = Unity.Ugc.Model.TokenResponse;

namespace Unity.Ugc
{
    public partial class UgcSDK
    {
        private static async Task<TokenResponse> Login(ExternalLoginRequest request)
        {
            string url = $"{LoginServerAddress}/v1/login/token";
            var settings = new JsonSerializerSettings();
            settings.DefaultValueHandling = DefaultValueHandling.Ignore;

            var requestData = JsonConvert.SerializeObject(request, settings);
            Debug.Log(requestData);
            var uwr = await UgcClient.PostRaw(url, requestData, nonceAuth: true);
            return ProcessPassportResponse<TokenResponse>(uwr);
        }
        
        protected internal static async Task<RefreshTokenResponse> Refresh(RefreshAccessTokenRequest request)
        {
            string url = $"{LoginServerAddress}/v1/login/refresh-token";
            var requestData = JsonConvert.SerializeObject(request);
            var uwr = await UgcClient.PostRaw(url, requestData, noAuth: true);
            return ProcessPassportResponse<RefreshTokenResponse>(uwr);
        }

        private static T ProcessPassportResponse<T>(UnityWebRequest uwr) 
            where T : class, new()
        {
            try
            {
                if (uwr.error == null)
                {
                    if (uwr.responseCode == (long)HttpStatusCode.NoContent)
                    {
                        return null;
                    }
                    
                    var settings = new JsonSerializerSettings();
                    return JsonConvert.DeserializeObject<T>(uwr.downloadHandler.text, settings);
                }
                
                Debug.Log("Trace ID : " + uwr.GetResponseHeader("Grpc-Metadata-X-Trace-Id"));
                if (uwr.result == UnityWebRequest.Result.ConnectionError || uwr.downloadHandler.text == "")
                {
                    throw new UgcException((int)ErrorCode.SDKNetworkError, uwr.error);
                }
                
                var customError = JsonConvert.DeserializeObject<PassportCustomError>(uwr.downloadHandler.text);
                throw new UgcException(customError.DetailCode, customError.Message);
            }
            catch (Exception e)
            {
                switch (e)
                {
                    case UgcException:
                        throw;
                }

                throw new UgcException((int)ErrorCode.Unknown, e.Message);
            }
        }
    }
}