package com.haha.service.payment.payscore;

import com.haha.service.payment.payscore.PayScoreCreateRequest.PostPayment;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 支付分业务服务接口
 * 封装支付分相关的业务逻辑，协调订单服务和支付分策略
 */
public interface PayScoreService {

    /**
     * 创建支付分服务订单
     * 
     * @param orderId 本地订单ID
     * @param openId 用户微信openId
     * @return 支付分结果（含小程序调起支付分所需的package参数）
     */
    PayScoreResult createPayScoreOrder(Long orderId, String openId);

    /**
     * 创建支付分服务订单（带风险金配置）
     * 
     * @param orderId 本地订单ID
     * @param openId 用户微信openId
     * @param riskFundAmount 风险金额
     * @param riskFundName 风险金名称（DEPOSIT/ADVANCE/CASH_DEPOSIT）
     * @return 支付分结果
     */
    PayScoreResult createPayScoreOrder(Long orderId, String openId, 
            BigDecimal riskFundAmount, String riskFundName);

    /**
     * 完结支付分服务订单（触发自动扣款）
     * 
     * @param orderId 本地订单ID
     * @param totalAmount 实际扣款总金额
     * @param payments 后付费项目列表
     * @return 支付分结果
     */
    PayScoreResult completePayScoreOrder(Long orderId, BigDecimal totalAmount, 
            List<PostPayment> payments);

    /**
     * 完结支付分服务订单（带优惠）
     * 
     * @param orderId 本地订单ID
     * @param totalAmount 实际扣款总金额
     * @param payments 后付费项目列表
     * @param discounts 商户优惠列表
     * @return 支付分结果
     */
    PayScoreResult completePayScoreOrder(Long orderId, BigDecimal totalAmount, 
            List<PostPayment> payments, List<PayScoreCompleteRequest.PostDiscount> discounts);

    /**
     * 取消支付分服务订单
     * 
     * @param orderId 本地订单ID
     * @param reason 取消原因
     * @return 支付分结果
     */
    PayScoreResult cancelPayScoreOrder(Long orderId, String reason);

    /**
     * 查询支付分服务订单状态
     * 
     * @param outOrderNo 商户服务订单号
     * @return 支付分结果
     */
    PayScoreResult queryPayScoreOrder(String outOrderNo);

    /**
     * 处理支付分回调通知
     * 
     * @param params 回调参数（含请求头和请求体）
     * @return 回调处理结果
     */
    PayScoreCallbackResult handlePayScoreCallback(Map<String, Object> params);

    /**
     * 同步订单支付分状态
     * 从微信侧查询最新状态并更新本地订单
     * 
     * @param orderId 本地订单ID
     * @return 是否同步成功
     */
    boolean syncPayScoreStatus(Long orderId);
}
