using BBWY.Common.Http;
using Newtonsoft.Json;
using QuanTan.SDK.Extensions;
using QuanTan.SDK.Model;
using System;
using System.Net.Http;

namespace QuanTan.SDK.Client
{
    public class BaseClient
    {
        protected RestApiService restApiService;

        protected readonly string host = "https://qt.qiyue666.com/";

        private NLog.ILogger logger;

        public BaseClient(RestApiService restApiService, NLog.ILogger logger)
        {
            this.restApiService = restApiService;
            this.logger = logger;
        }

        public QuanTanResponse<T> SendRequest<T>(string apiPath, object param, string appId, string appSecret)
        {
            var callTime = DateTime.Now.ToString("yyyyMMddHHmmss");
            var randomNum = new Random(Guid.NewGuid().GetHashCode()).Next(100000, 999999).ToString();
            if (param == null)
                param = new object[] { };
            var paramStr = JsonConvert.SerializeObject(param);

            var jmStr = JsonConvert.SerializeObject(new QuanTanSignParam()
            {
                //appId = appId,
                appId = appId,
                appSecret = appSecret,//
                callTime = callTime,
                _params = paramStr,
                randomNum = randomNum
            });
            var md5Str = jmStr.Md5Encrypt();
            var qtToken = $"{appId}-{callTime}-{md5Str}-{randomNum}";
            var requestParam = new QuanTanRequestParam()
            {
                Params = paramStr,
                token = qtToken
            };
            RestApiResult restApiResult = null;
            try
            {
                restApiResult = restApiService.SendRequest(host, apiPath, requestParam, null, HttpMethod.Post);
                if (restApiResult.StatusCode != System.Net.HttpStatusCode.OK)
                    throw new Exception(restApiResult.Content);
                return JsonConvert.DeserializeObject<QuanTanResponse<T>>(restApiResult.Content);
            }
            catch (Exception ex)
            {
                if (logger != null)
                {
                    try
                    {
                        logger.Error(ex, $"Request {JsonConvert.SerializeObject(requestParam)}\r\nResponse {(restApiResult == null ? string.Empty : JsonConvert.SerializeObject(restApiResult))}");
                    }
                    catch { }
                }

                return new QuanTanResponse<T>() { Status = 0, Message = ex.Message };
            }
        }
    }
}