package com.ruoyi.credit.service;

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

import com.ruoyi.credit.domain.FinancingApplication;
import com.ruoyi.credit.domain.ServicePeriodLoan;

/**
 * 融资管理服务接口
 *
 * @author ruoyi
 * @date 2025-12-19
 */
public interface IFinancingService {

    /**
     * 从服务周期贷款自动创建融资申请
     * 
     * @param servicePeriodLoan 服务周期贷款信息
     * @return 创建结果
     */
    public Map<String, Object> createFinancingApplicationFromLoan(ServicePeriodLoan servicePeriodLoan);

    /**
     * 处理审批结果
     *
     * @param applicationId 申请ID
     * @param approved 是否批准
     * @param approvedAmount 批准金额
     * @param interestRate 利率
     * @param approvalComments 审批意见
     * @return 处理结果
     */
    public boolean processApproval(Long applicationId, boolean approved, BigDecimal approvedAmount,
            Double interestRate, String approvalComments);

    /**
     * 记录审批结果
     *
     * @param applicationId 申请ID
     * @param approvalResult 审批结果
     * @return 记录结果
     */
    public boolean recordApprovalResult(Long applicationId, Map<String, Object> approvalResult);

    /**
     * 计算利率
     *
     * @param creditId 债权ID
     * @param financialInstitutionId 金融机构ID
     * @param requestAmount 申请金额
     * @return 利率
     */
    public Double calculateInterestRate(Long creditId, Long financialInstitutionId, BigDecimal requestAmount);

    /**
     * 生成风险评估报告
     *
     * @param applicationId 申请ID
     * @return 风险评估报告
     */
    public Map<String, Object> generateRiskAssessment(Long applicationId);

    /**
     * 进行信用检查
     *
     * @param creditId 债权ID
     * @param financialInstitutionId 金融机构ID
     * @return 信用检查结果
     */
    public Map<String, Object> performCreditCheck(Long creditId, Long financialInstitutionId);

    /**
     * 查询融资申请
     *
     * @param applicationId 申请ID
     * @return 融资申请
     */
    public FinancingApplication selectFinancingApplicationById(Long applicationId);

    /**
     * 查询融资申请列表
     *
     * @param financingApplication 融资申请
     * @return 融资申请集合
     */
    public List<FinancingApplication> selectFinancingApplicationList(FinancingApplication financingApplication);

    /**
     * 根据债权ID查询融资申请
     *
     * @param creditId 债权ID
     * @return 融资申请集合
     */
    public List<FinancingApplication> selectFinancingApplicationByCreditId(Long creditId);

    /**
     * 查询待审批的申请
     *
     * @return 融资申请集合
     */
    public List<FinancingApplication> selectPendingApplications();

    /**
     * 更新申请状态
     *
     * @param applicationId 申请ID
     * @param status 状态
     * @return 更新结果
     */
    public boolean updateApplicationStatus(Long applicationId, String status);

    /**
     * 验证债权有效性
     *
     * @param creditId 债权ID
     * @return 验证结果
     */
    public boolean validateCreditValidity(Long creditId);

    /**
     * 放款操作
     *
     * @param loanId 贷款ID
     * @param creditId 债权ID
     * @param disbursementAccount 放款账户
     * @param disbursementNote 放款备注
     * @return 放款结果
     */
    public boolean disburseLoan(Long loanId, Long creditId, String disbursementAccount, String disbursementNote);

    /**
     * 获取融资统计信息
     *
     * @return 融资统计数据
     */
    public Map<String, Object> getFinancingStats();

    /**
     * 生成申请编号
     *
     * @return 申请编号
     */
    public String generateApplicationNumber();

    /**
     * 根据债权ID获取对应的关联ID
     *
     * @param creditId 债权ID
     * @return 关联ID，如果没有找到则返回null
     */
    public Long getLoanIdByCreditId(Long creditId);

    /**
     * 检查债权是否可以创建新的融资申请
     *
     * @param creditId 债权ID
     * @return 检查结果
     */
    public Map<String, Object> checkCreditEligibilityForNewApplication(Long creditId);
}
