package com.ruoyi.payment.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import com.ruoyi.payment.domain.PaymentRecord;

/**
 * 支付处理服务接口
 * 
 * 处理支付流程、收款确认、智能合约触发等核心功能
 * 
 * @author ruoyi
 */
public interface IPaymentService {
    
    /**
     * 处理支付请求
     * 
     * @param contractId 合同ID
     * @param payerId 支付方ID
     * @param payeeId 收款方ID
     * @param paymentAmount 支付金额
     * @param paymentMethod 支付方式
     * @param transactionId 交易流水号
     * @return 支付记录
     */
    PaymentRecord processPayment(Long contractId, Long payerId, Long payeeId, 
                               BigDecimal paymentAmount, String paymentMethod, String transactionId);
    
    /**
     * 确认收款
     * 
     * @param paymentId 支付记录ID
     * @return 确认结果
     */
    boolean confirmPayment(Long paymentId);
    
    /**
     * 确认收款并触发智能合约
     * 
     * @param paymentId 支付记录ID
     * @param contractAddress 智能合约地址
     * @return 智能合约执行结果
     */
    String confirmPaymentAndTriggerContract(Long paymentId, String contractAddress);
    
    /**
     * 查询支付状态
     * 
     * @param paymentId 支付记录ID
     * @return 支付状态
     */
    String getPaymentStatus(Long paymentId);
    
    /**
     * 根据合同ID查询支付记录
     * 
     * @param contractId 合同ID
     * @return 支付记录列表
     */
    List<PaymentRecord> getPaymentsByContractId(Long contractId);
    
    /**
     * 根据交易流水号查询支付记录
     * 
     * @param transactionId 交易流水号
     * @return 支付记录
     */
    PaymentRecord getPaymentByTransactionId(String transactionId);
    
    /**
     * 更新支付状态
     * 
     * @param paymentId 支付记录ID
     * @param status 新状态
     * @return 更新结果
     */
    boolean updatePaymentStatus(Long paymentId, String status);
    
    /**
     * 处理支付异常
     * 
     * @param paymentId 支付记录ID
     * @param errorMessage 错误信息
     * @return 处理结果
     */
    boolean handlePaymentException(Long paymentId, String errorMessage);
    
    /**
     * 验证支付数据
     * 
     * @param contractId 合同ID
     * @param paymentAmount 支付金额
     * @param payerId 支付方ID
     * @return 验证结果
     */
    boolean validatePaymentData(Long contractId, BigDecimal paymentAmount, Long payerId);
    
    /**
     * 生成支付编号
     * 
     * @return 支付编号
     */
    String generatePaymentNumber();
    
    /**
     * 获取支付统计信息
     * 
     * @param contractId 合同ID (可选)
     * @return 统计信息
     */
    Map<String, Object> getPaymentStatistics(Long contractId);
    
    /**
     * 检查支付是否完成
     * 
     * @param contractId 合同ID
     * @return 是否完成支付
     */
    boolean isPaymentCompleted(Long contractId);
    
    /**
     * 计算合同应收金额
     * 
     * @param contractId 合同ID
     * @return 应收金额
     */
    BigDecimal calculateContractReceivableAmount(Long contractId);
    
    /**
     * 计算合同已收金额
     * 
     * @param contractId 合同ID
     * @return 已收金额
     */
    BigDecimal calculateContractReceivedAmount(Long contractId);
}