package com.ruoyi.credit.service;

import java.util.List;
import java.util.Map;

import com.ruoyi.credit.domain.DigitalCredit;
import com.ruoyi.credit.domain.ServiceContract;

/**
 * 数字债权服务接口
 * 
 * @author ruoyi
 * @date 2025-12-19
 */
public interface ICreditService 
{
    /**
     * 生成数字债权凭证
     * 
     * @param contractId 合同ID
     * @return 生成的债权凭证
     */
    DigitalCredit generateCredit(Long contractId);

    /**
     * 生成数字债权凭证（支持自定义债权数据）
     * 
     * @param digitalCredit 债权数据
     * @return 生成的债权凭证
     */
    DigitalCredit generateCredit(DigitalCredit digitalCredit);

    /**
     * 验证债权凭证有效性（支持不同验证类型）
     * 
     * @param creditId 债权ID
     * @param validationType 验证类型
     * @param description 验证描述
     * @param validationParams 验证参数
     * @return 验证结果
     */
    Map<String, Object> validateCredit(Long creditId, String validationType, String description, String validationParams);

    /**
     * 获取债权验证历史
     * 
     * @param creditId 债权ID
     * @return 验证历史列表
     */
    List<Map<String, Object>> getValidationHistory(Long creditId);

    /**
     * 验证债权凭证有效性（简化版本）
     * 
     * @param creditId 债权ID
     * @return 验证结果
     */
    Map<String, Object> validateCredit(Long creditId);

    /**
     * 更新债权状态
     * 
     * @param creditId 债权ID
     * @param status 新状态
     * @return 操作结果
     */
    boolean updateCreditStatus(Long creditId, String status);

    /**
     * 计算债权金额
     * 
     * @param contractId 合同ID
     * @return 债权金额
     */
    java.math.BigDecimal calculateCreditAmount(Long contractId);

    /**
     * 生成数字签名
     * 
     * @param creditData 债权数据
     * @return 数字签名
     */
    String generateDigitalSignature(DigitalCredit creditData);

    /**
     * 查询债权详情
     * 
     * @param creditId 债权ID
     * @return 债权信息
     */
    DigitalCredit selectDigitalCreditByCreditId(Long creditId);

    /**
     * 查询债权列表
     * 
     * @param digitalCredit 查询条件
     * @return 债权列表
     */
    List<DigitalCredit> selectDigitalCreditList(DigitalCredit digitalCredit);

    /**
     * 根据债权编号查询债权
     * 
     * @param creditNumber 债权编号
     * @return 债权信息
     */
    DigitalCredit selectDigitalCreditByCreditNumber(String creditNumber);

    /**
     * 根据合同ID查询债权
     * 
     * @param contractId 合同ID
     * @return 债权信息
     */
    DigitalCredit selectDigitalCreditByContractId(Long contractId);

    /**
     * 根据状态查询债权列表
     * 
     * @param creditStatus 债权状态
     * @return 债权列表
     */
    List<DigitalCredit> selectDigitalCreditByStatus(String creditStatus);

    /**
     * 查询即将到期的债权
     * 
     * @param days 提前天数
     * @return 债权列表
     */
    List<DigitalCredit> selectExpiringCredits(int days);

    /**
     * 删除债权
     * 
     * @param creditId 债权ID
     * @return 操作结果
     */
    int deleteDigitalCreditByCreditId(Long creditId);

    /**
     * 批量删除债权
     * 
     * @param creditIds 债权ID数组
     * @return 操作结果
     */
    int deleteDigitalCreditByCreditIds(Long[] creditIds);

    /**
     * 校验债权编号唯一性
     * 
     * @param creditNumber 债权编号
     * @return 校验结果
     */
    boolean checkCreditNumberUnique(String creditNumber);

    /**
     * 从合同自动转换生成债权
     * 
     * @param contract 服务合同
     * @return 生成的债权凭证
     */
    DigitalCredit convertContractToCredit(ServiceContract contract);

    /**
     * 验证债权完整性
     * 
     * @param creditId 债权ID
     * @return 验证结果
     */
    boolean validateCreditIntegrity(Long creditId);

    /**
     * 根据债权ID重新生成债权凭证
     * 用于在债权被删除后重新生成
     * 
     * @param creditId 债权ID
     * @return 重新生成的债权凭证
     */
    DigitalCredit regenerateCreditById(Long creditId);
}