using Alipay.EasySDK.Kernel;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using ZeroD.Util;

namespace LifePayment.Domain
{
    public class AlipayInterfaceManager : AlipayApiClient, IAlipayInterfaceManager
    {

        private Config _config;

        public AlipayInterfaceManager(IOptionsMonitor<Config> optionsMonitor, ILogger<AlipayInterfaceManager> logger) : base(optionsMonitor, logger)
        {
            _config = optionsMonitor.CurrentValue;
        }

        /// <summary>
        /// 支付宝用户协议签约接口
        /// 支持用户在支付宝页面完成支付宝协议的签约,目前支持支付宝钱包H5页面签约、扫码签约等方式。
        /// 此接口并非直接调用的接口,需拼接跳转链接唤起,具体方式见下文“无线端唤起签约说明”
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<UserAgreementPageSignResponse> UserAgreementPageSign(UserAgreementPageSignInput input)
        {
            return await base.PageRequest<UserAgreementPageSignInput, UserAgreementPageSignResponse>(input, AlipayApiConstant.UserAgreementPageSign, _config.NotifyUrl + "/api/AliPayNotify/NotifyOrderChanged ", "GET");
        }

        /// <summary>
        /// 支付宝用户协议查询接口 
        /// 人资协议授权签约查询
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<UserAgreementQueryResponse> UserAgreementQuery(UserAgreementQueryInput input)
        {
            return await base.Request<UserAgreementQueryInput, UserAgreementQueryResponse>(input, AlipayApiConstant.UserAgreementQuery);
        }

        /// <summary>
        /// 支付宝用户协议解约接口
        /// 人资协议解约
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<AlipayBaseOutput> UserAgreementUnsign(UserAgreementUnsignInput input)
        {
            return await base.Request<UserAgreementUnsignInput, AlipayBaseOutput>(input, AlipayApiConstant.UserAgreementUnsign);
        }

        /// <summary>
        /// 资金记账本开通
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<FundAccountbookCreateResponse> FundAccountbookCreate(FundAccountbookCreateInput input)
        {
            return await base.Request<FundAccountbookCreateInput, FundAccountbookCreateResponse>(input, AlipayApiConstant.FundAccountBookCreate);
        }

        /// <summary>
        /// 查询资金记账本的可用金额等信息
        /// 基于用户授权协议,平台可通过后台服务接口,为平台上的用户提供资金记账本相关信息查询服务
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<FundAccountBookQueryResponse> FundAccountBookQuery(FundAccountBookQueryInput input)
        {
            return await base.Request<FundAccountBookQueryInput, FundAccountBookQueryResponse>(input, AlipayApiConstant.FundAccountBookQuery);
        }


        /// <summary>
        /// 单笔转账接口是基于支付宝的资金处理能力,为了满足支付宝商家的转账需求,针对有部分开发能力的商家,提供通过API接口完成企业自身支付宝账户到支付宝账户、企业自身支付宝账户到银行卡的转账功能。 
        /// 适用于:C2C现金红包的红包领取、B2C现金红包的红包发放、B2C单笔转账到支付宝账户、B2C单笔转账到银行卡等。
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<FundTransUniTransferResponse> FundTransUniTransfer(FundTransUniTransferInput input)
        {
            return await base.Request<FundTransUniTransferInput, FundTransUniTransferResponse>(input, AlipayApiConstant.FundTransUniTransfer);
        }

        /// <summary>
        /// 转账业务单据查询接口
        /// 商户可通过该接口查询转账业务单据的状态,主要应用于统一转账接口(alipay.fund.trans.uni.transfer)、无线转账接口(alipay.fund.trans.app.pay)、单笔转账到支付宝账户接口(alipay.fund.trans.toaccount.transfer)
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<FundTransCommonQueryResponse> FundTransCommonoQuery(FundTransCommonQueryInput input)
        {
            return await base.Request<FundTransCommonQueryInput, FundTransCommonQueryResponse>(input, AlipayApiConstant.FundTransCommonQuery);
        }

        /// <summary>
        /// 资金调拨到用户名下的发薪专项的页面付款接口
        /// 基于用户授权协议,平台通过页面接口形式唤起支付宝外部收银台。待用户核身确认后,支付宝服务端依据平台指令,将用户支付宝的可用资金划拨到用户名下的发薪专项不可用资金中,并将处理结果以异步消息方式通知到平台
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<AlipayFundTransPagePayResponse> FundTransPagePay(FundTransPagePayInput input)
        {
            return await base.PageRequest<FundTransPagePayInput, AlipayFundTransPagePayResponse>(input, AlipayApiConstant.FundTransPagePay, _config.NotifyUrl + "/AliPayNotify/NotifyOrderChanged");
        }

        ///// <summary>
        ///// 基于付款方的委托授权,用于批量向指定支付宝账户/银行卡转账
        ///// 平台基于付款方的委托授权,将用户的专款资金批量转账到指定的支付宝账户
        ///// </summary>
        ///// <param name="input"></param>
        ///// <returns></returns>
        //public Task<FundBatchUniTransferResponse> FundBatchUniTransfer(FundBatchUniTransferInput input)
        //{
        //    return base.Request<FundBatchUniTransferInput, FundBatchUniTransferResponse>(input, AlipayApiConstant.FundBatchUniTransfer);
        //}


        ///// <summary>
        ///// 基于付款方的委托授权,
        ///// 场景一:当商户收到批次异步通知的后,可通过该接口查询批次下的明细信息;
        /////场景二:商户未收到批次异步通知时,商户通过此接口可以主动查询批次和批次下明细单据的状态
        ///// </summary>
        ///// <param name="input"></param>
        ///// <returns></returns>
        //public Task<FundBatchDetailQueryResponse> FundBatchDetailQuery(FundBatchDetailQueryInput input)
        //{
        //    return base.Request<FundBatchDetailQueryInput, FundBatchDetailQueryResponse>(input, AlipayApiConstant.FundBatchDetailQuery);
        //}


        ///// <summary>
        ///// 用于查询支付宝账户余额
        ///// </summary>
        ///// <param name="input"></param>
        ///// <returns></returns>
        //public Task<FundAccountQueryResponse> FundAccountQuery(FundAccountQueryInput input)
        //{
        //    return base.Request<FundAccountQueryInput, FundAccountQueryResponse>(input, AlipayApiConstant.FundAccountQuery);
        //}

        /// <summary>
        /// 申请电子回单
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<DataBillErceiptApplyResponse> DataBillErceiptApply(DataBillErceiptApplyInput input)
        {
            return await base.Request<DataBillErceiptApplyInput, DataBillErceiptApplyResponse>(input, AlipayApiConstant.DataBillErceiptApply);
        }

        /// <summary>
        /// 查询电子回单状态
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<DataBillEreceiptQueryResponse> DataBillEreceiptQuery(DataBillEreceiptQueryInput input)
        {
            return await base.Request<DataBillEreceiptQueryInput, DataBillEreceiptQueryResponse>(input, AlipayApiConstant.DataBillEreceiptQuery);
        }

        /// <summary>
        /// 账单下载
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<DataDataserviceBillDownloadUrlQueryResponse> DataDataserviceBillDownloadUrlQuery(DataDataserviceBillDownloadUrlQueryInput input)
        {
            return await base.Request<DataDataserviceBillDownloadUrlQueryInput, DataDataserviceBillDownloadUrlQueryResponse>(input, AlipayApiConstant.DataDataserviceBillDownloadUrlQuery);
        }

        private static string GetPrivateKey(string appId)
        {
            IDictionary<string, string> json = JsonConvert.DeserializeObject<IDictionary<string, string>>(
                File.ReadAllText(DirFileHelper.GetSolutionBasePath() + "/privateKey.json"));
            return json[appId];
        }
    }

}