using System.Collections.Generic;
using System.Threading.Tasks;
using Alipay.AopSdk.Core.Util;
using GxPress.Common.AliPay;
using GxPress.Common.WechatPay;
using GxPress.Service.Interface.Order;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace GxPress.Api.WebControllers
{
    [Route("api/web/alipay")]
    [ApiController]
    [Authorize]
    public class AlipayController : Controller
    {
        private readonly IOrderService orderService;
        private IHttpContextAccessor _contextAccessor;
        private HttpContext _context { get { return _contextAccessor.HttpContext; } }

        public AlipayController(IOrderService orderService, IHttpContextAccessor contextAccessor)
        {
            this.orderService = orderService;
            _contextAccessor = contextAccessor;
        }

        [HttpGet()]
        [AllowAnonymous]
        public string GetNativePayUrl()
        {
            var alipay = new PcPay();
            return alipay.PayRequest("637263608658642543_7", "汪峰讲故事", "0.01", "汪峰讲故事", "");
        }
        /// <summary>
        /// 回调地址
        /// </summary>
        [HttpPost("notify")]
        [AllowAnonymous]
        public async Task Callback()
        {
            Dictionary<string, string> sArray = GetRequestPost();
            if (sArray.Count != 0)
            {
                try
                {
                    //校验数据的正确性
                    bool flag = AlipaySignature.RSACheckV1(sArray, Config.AlipayPublicKey, Config.CharSet, Config.SignType, false);
                    if (flag)
                    {
                        //Console.WriteLine($"同步验证通过,订单号:{sArray["out_trade_no"]}");
                        if (await orderService.InsertAliPayOrderAsync(sArray))
                        {
                            // var res = new WxPayData();
                            // res.SetValue("out_trade_no", sArray["out_trade_no"]);
                            // res.SetValue("attach", sArray["out_trade_no"]);
                            // res.SetValue("total_fee", sArray["total_amount"]);
                            // res.SetValue("transaction_id", sArray["trade_no"]);
                            _context.Response.StatusCode = 200;
                        }
                        else
                        {
                            _context.Response.StatusCode = 500;
                        }
                    }
                    else
                    {
                        // Console.WriteLine($"同步验证失败,订单号:{sArray["out_trade_no"]}");
                        _context.Response.StatusCode = 500;
                    }
                }
                catch (System.Exception)
                {
                    _context.Response.StatusCode = 500;
                }
            }
            else
            {
                _context.Response.StatusCode = 500;
            }
        }
        private Dictionary<string, string> GetRequestPost()
        {
            Dictionary<string, string> sArray = new Dictionary<string, string>();

            ICollection<string> requestItem = Request.Form.Keys;
            foreach (var item in requestItem)
            {
                sArray.Add(item, Request.Form[item]);

            }
            return sArray;

        }
        private Dictionary<string, string> GetRequestGet()
        {
            Dictionary<string, string> sArray = new Dictionary<string, string>();

            ICollection<string> requestItem = Request.Query.Keys;
            foreach (var item in requestItem)
            {
                sArray.Add(item, Request.Query[item]);
            }
            return sArray;

        }
    }
}