using Alipay.EasySDK.Payment.Common.Models;
using LifePayment.Domain.Shared;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Services;
using ZeroD.Util;

namespace LifePayment.Application.Contracts;

public interface ILifePayService : IApplicationService
{

    /// <summary>
    /// 获取电费面值
    /// </summary>
    /// <returns></returns>
    Task<ElectricParValueResponse> GetElectricParValue();

    /// <summary>
    /// 获取电费充值区域
    /// </summary>
    /// <returns></returns>
    Task<ElectricSupportAreaResponse> GetElectricSupportArea();

    /// <summary>
    /// 获取话费面值
    /// </summary>
    /// <returns></returns>
    Task<PhoneParValueResponse> GetPhoneParValue();

    /// <summary>
    /// 获取燃气面值
    /// </summary>
    /// <returns></returns>
    Task<GasParValueResponse> GetGasParValue();

    /// <summary>
    /// 获取燃气支持商户
    /// </summary>
    /// <returns></returns>
    Task<GasOrgTypeValueResponse> GetGasOrgType();

    /// <summary>
    /// 支付成功回调处理
    /// </summary>
    /// <param name="orderNo"></param>
    /// <param name="outOrderNo"></param>
    /// <returns></returns>
    Task LifePaySuccessHandler(string orderNo, string outOrderNo);

    /// <summary>
    /// 退款成功回调处理
    /// </summary>
    /// <param name="orderNo"></param>
    /// <param name="refundStatus"></param>
    /// <returns></returns>
    Task LifePayRefundsHandler(string orderNo, LifePayRefundStatusEnum refundStatus);

    

    /// <summary>
    /// 供应商回调处理
    /// </summary>
    /// <param name="orderNo"></param>
    /// <param name="acoolyOrderNo"></param>
    /// <param name="status"></param>
    /// <param name="acoolyStatus"></param>
    /// <param name="payAmount"></param>
    /// <returns></returns>
    Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount, string refundApplyRemark);

    /// <summary>
    /// 创建生活缴费话费订单
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<CreateLifePayOrderOutput> CreateLifePayPhoneOrder(CreateLifePayOrderInput<LifePhoneData> input);

    /// <summary>
    /// 创建生活缴费电费订单
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<CreateLifePayOrderOutput> CreateLifePayElectricOrder(CreateLifePayOrderInput<LifeElectricData> input);

    /// <summary>
    /// 创建生活缴费燃气订单
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<CreateLifePayOrderOutput> CreateLifePayGasOrder(CreateLifePayOrderInput<LifeGasData> input);

    /// <summary>
    /// 修改实际到账金额
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<int> UpdateLifePayOrderActualReceivedAmount(UpdateLifePayOrderInput input);

    /// <summary>
    /// 退款生活缴费订单
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    Task RefundLifePayOrder(RefundLifePayOrderInput input);

    /// <summary>
    /// 用户发起生活缴费退款
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task RefundUserLifePayOrder(RefundUserLifePayOrderInput input);

    /// <summary>
    /// 用户修改户号信息
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<int> AddUpdateUserAccount(AddUpdateUserAccountInput input);

    /// <summary>
    /// 删除用户户号
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    Task<int> DeleteUserAccount(Guid id);

    Task RejectRefundLifePayOrder(RefundLifePayOrderInput input);

    Task CreateEditPayChannels(CreateEditPayChannelsInput input);

    Task SetLifePayChannelsStatus(Guid id, LifePayChannelsStatsEnum status);

    /// <summary>
    /// 编辑折扣
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task CreateEditLifePayRate(List<LifePayRateInput> input);

    /// <summary>
    /// 编辑手续费费率
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task CreateEditLifePayPremium(List<LifePayPremiumInput> input);

    /// <summary>
    /// 须知配置
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task EditIntroInfo(LifePayIntroInfoInput input);

    /// <summary>
    /// 获取折扣
    /// </summary>
    /// <returns></returns>
    Task<List<LifePayRateListOutput>> GetRate();


    /// <summary>
    /// 获取渠道折扣
    /// </summary>
    /// <returns></returns>
    Task<ChannelRateOutput> GetChannelRate(ChannelsBaseInput input);

    /// <summary>
    /// 获取手续费费率
    /// </summary>
    /// <returns></returns>
    Task<List<LifePayPremiumListOutput>> GetPremium();

    /// <summary>
    /// 获取须知
    /// </summary>
    /// <returns></returns>
    Task<List<LifePayIntroInfoOutput>> GetIntroInfo(LifePayOrderTypeEnum type);

    /// <summary>
    /// 获取我的订单分页数据
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<PageOutput<UserLifePayOrderOutput>> GetUserLifePayOrderPage(QueryLifePayOrderListInput input);

    /// <summary>
    /// 获取我的订单详情
    /// </summary>
    /// <param name="orderNo"></param>
    /// <returns></returns>
    Task<UserLifePayOrderOutput> GetUserLifePayOrderDetail(string orderNo);

    /// <summary>
    /// 获取用户分页数据
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<PageOutput<UserListOutput>> GetUserPage(QueryUserPageInput input);


    /// <summary>
    /// 获取用户户号分页数据
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<PageOutput<UserAccountOutput>> GetAccountPage(QueryUserAccountListInput input);

    /// <summary>
    /// 获取订单分页数据
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<PageOutput<LifePayOrderListOutput>> GetLifePayOrderPage(QueryLifePayOrderListInput input);

    Task<PageOutput<LifePayOrderListOutput>> GetLifePayRefundOrderPage(QueryLifePayRefundOrderListInput input);

    /// <summary>
    /// 获取订单详情
    /// </summary>
    /// <param name="orderNo"></param>
    /// <returns></returns>
    Task<LifePayOrderOutput> GetLifePayOrderDetail(string orderNo);


    Task<LifePayRefundOrderOutput> GetLifePayRefundOrderDetail(string orderNo);


    /// <summary>
    /// 根据订单号获取支付状态
    /// </summary>
    /// <param name="orderNo"></param>
    /// <returns></returns>
    Task<LifePayStatusEnum> GetPayStatusByOrderNo(string orderNo);

    /// <summary>
    /// 获取渠道分页
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<PageOutput<CreateEditPayChannelsInput>> GetLifePayChannlesPage(PageInput input);

    Task<List<CreateEditPayChannelsInput>> GetLifePayChannlesAllList();

    Task<CreateEditPayChannelsInput> GetLifePayChannlesDto(Guid id);


    Task<CreateEditPayChannelsInput> GetLifePayChannlesDtoByNum(string channlesNum);

    Task<UserLifePayOrderRefundOutput> GetUserLifePayOrderRefund(Guid id);

    /// <summary>
    /// 获取我的户号列表
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<PageOutput<UserAccountOutput>> GetUserAccountList(QueryUserAccountListInput input);

    /// <summary>
    /// 获取我的全部户号列表
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<List<UserAccountOutput>> GetUserAccountAllList(QueryUserAccountAllListInput input);

    /// <summary>
    /// 获取我的户号详情
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    Task<UserAccountOutput> GetUserAccountDetail(Guid id);

    Task<List<LifePayOrderListTemplate>> GetLifePayOrderPageExport(QueryLifePayOrderListInput input);


    Task<List<LifePayRefundOrderListTemplate>> GetLifePayRefudOrderPageExport(QueryLifePayRefundOrderListInput input);

    Task<string> GetBillErceiptExport(string orderNo);

    /// <summary>
    /// 查询支付宝支付订单信息
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<AlipayTradeQueryResponse> QueryAlipayTrade(OrderInQuiryInput input);

    /// <summary>
    /// 查询支付宝退款订单信息
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<AlipayTradeFastpayRefundQueryResponse> QueryAlipayTradeRefund(OrderInQuiryInput input);

    /// <summary>
    /// 查询微信退款订单信息
    /// </summary>
    /// <param name="outTradeNo"></param>
    /// <returns></returns>
    Task<WxPayDomesticRefundsQueryReponse> WxPayDomesticRefundsQuery(string outTradeNo);

    /// <summary>
    /// 查询微信订单信息
    /// </summary>
    /// <param name="outTradeNo"></param>
    /// <returns></returns>
    Task<WxPayTradeQueryReponse> WxPayTradeQuery(string outTradeNo);

    

    /// <summary>
    /// 设置生活缴费支付类型
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<string> SetLifePayOrderPayType(SetLifePayOrderPayTypeInput input, string ip);

    /// <summary>
    /// 生活缴费的JSAPI调用
    /// </summary>
    /// <param name="input"></param>
    /// <param name="ip"></param>
    /// <returns></returns>
    Task<ModelPaymentMiniPay> GetPayOrderForJsAPI(GetPayOrderForJsAPIInput input, string ip);

    /// <summary>
    /// 获取支付二维码
    /// </summary>
    /// <param name="payType"></param>
    /// <param name="outTradeNo"></param>
    /// <param name="description"></param>
    /// <param name="amount"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    Task<string> GetPayQRCode(LifePayTypeEnum payType, string outTradeNo, string description, decimal amount, string ip, string h5Type);


    Task<bool> CheckChannelsStatus(string channlesId);



}