package com.ruoyi.credit.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import com.ruoyi.credit.domain.ServicePeriodLoan;

/**
 * 服务周期贷款管理服务接口
 * 
 * @author ruoyi
 * @date 2025-12-24
 */
public interface IServicePeriodLoanService
{
    // ==================== 基础CRUD操作 ====================

    /**
     * 查询服务周期贷款关联
     * 
     * @param linkId 服务周期贷款关联主键
     * @return 服务周期贷款关联
     */
    public ServicePeriodLoan selectServicePeriodLoanByLinkId(Long linkId);

    /**
     * 查询服务周期贷款关联列表
     * 
     * @param servicePeriodLoan 服务周期贷款关联
     * @return 服务周期贷款关联集合
     */
    public List<ServicePeriodLoan> selectServicePeriodLoanList(ServicePeriodLoan servicePeriodLoan);

    /**
     * 根据服务周期ID查询贷款关联列表
     * 
     * @param servicePeriodId 服务周期ID
     * @return 服务周期贷款关联集合
     */
    public List<ServicePeriodLoan> selectServicePeriodLoansByPeriodId(Long servicePeriodId);

    /**
     * 新增服务周期贷款关联
     * 
     * @param servicePeriodLoan 服务周期贷款关联
     * @return 结果
     */
    public int insertServicePeriodLoan(ServicePeriodLoan servicePeriodLoan);

    /**
     * 修改服务周期贷款关联
     * 
     * @param servicePeriodLoan 服务周期贷款关联
     * @return 结果
     */
    public int updateServicePeriodLoan(ServicePeriodLoan servicePeriodLoan);

    /**
     * 批量删除服务周期贷款关联
     * 
     * @param linkIds 需要删除的服务周期贷款关联主键集合
     * @return 结果
     */
    public int deleteServicePeriodLoanByLinkIds(Long[] linkIds);

    /**
     * 删除服务周期贷款关联信息
     * 
     * @param linkId 服务周期贷款关联主键
     * @return 结果
     */
    public int deleteServicePeriodLoanByLinkId(Long linkId);

    // ==================== 贷款申请管理 ====================

    /**
     * 根据服务周期出勤记录申请贷款
     * 
     * @param servicePeriodId 服务周期ID
     * @param loanRequest 贷款申请信息
     * @return 贷款申请结果
     */
    public Map<String, Object> applyLoanBasedOnAttendance(Long servicePeriodId, Map<String, Object> loanRequest);

    /**
     * 计算基于出勤数据的贷款金额
     * 
     * @param servicePeriodId 服务周期ID
     * @return 计算结果
     */
    public Map<String, Object> calculateLoanAmountBasedOnAttendance(Long servicePeriodId);

    /**
     * 验证贷款金额计算
     * 
     * @param servicePeriodId 服务周期ID
     * @param requestedAmount 申请金额
     * @return 验证结果
     */
    public Map<String, Object> validateLoanAmountCalculation(Long servicePeriodId, BigDecimal requestedAmount);

    // ==================== 银行融资条件匹配 ====================

    /**
     * 根据合同期限条件选择银行融资参数
     * 
     * @param servicePeriodId 服务周期ID
     * @param contractTermMonths 合同期限(月)
     * @return 匹配的银行融资条件
     */
    public Map<String, Object> selectBankFinancingByContractTerm(Long servicePeriodId, Integer contractTermMonths);

    /**
     * 匹配合同期限与银行融资条件
     * 
     * @param contractTermMonths 合同期限(月)
     * @param bankTermMonths 银行融资期限(月)
     * @return 匹配度评估
     */
    public String matchContractTermWithBankTerm(Integer contractTermMonths, Integer bankTermMonths);

    /**
     * 获取推荐的银行融资方案
     * 
     * @param servicePeriodId 服务周期ID
     * @param loanAmount 贷款金额
     * @param termMonths 期限要求
     * @return 推荐的融资方案列表
     */
    public List<Map<String, Object>> getRecommendedFinancingOptions(Long servicePeriodId, BigDecimal loanAmount, Integer termMonths);

    // ==================== 贷款审批管理 ====================

    /**
     * 提交贷款审批
     * 
     * @param linkId 贷款关联ID
     * @param approvalRequest 审批请求信息
     * @return 审批结果
     */
    public Map<String, Object> submitLoanApproval(Long linkId, Map<String, Object> approvalRequest);

    /**
     * 处理贷款审批结果
     * 
     * @param linkId 贷款关联ID
     * @param approved 是否批准
     * @param approvalComments 审批意见
     * @return 处理结果
     */
    public Map<String, Object> processLoanApprovalResult(Long linkId, boolean approved, String approvalComments);

    /**
     * 查询待审批的贷款列表
     * 
     * @return 待审批贷款列表
     */
    public List<ServicePeriodLoan> selectPendingApprovalLoans();

    // ==================== 报表导出功能 ====================

    /**
     * 生成服务周期贷款报表
     * 
     * @param servicePeriodId 服务周期ID
     * @param reportType 报表类型
     * @return 报表数据
     */
    public Map<String, Object> generateServicePeriodLoanReport(Long servicePeriodId, String reportType);

    /**
     * 导出服务周期贷款与出勤关联报表
     * 
     * @param servicePeriodId 服务周期ID
     * @param format 导出格式(EXCEL/PDF/CSV)
     * @return 导出结果
     */
    public Map<String, Object> exportLoanAttendanceReport(Long servicePeriodId, String format);

    /**
     * 获取贷款与出勤关联信息
     * 
     * @param servicePeriodId 服务周期ID
     * @return 关联信息
     */
    public Map<String, Object> getLoanAttendanceAssociation(Long servicePeriodId);

    // ==================== 数据变更审计 ====================

    /**
     * 记录服务周期数据变更审计
     * 
     * @param servicePeriodId 服务周期ID
     * @param changeType 变更类型
     * @param oldValue 原值
     * @param newValue 新值
     * @param changeReason 变更原因
     * @return 审计记录结果
     */
    public Map<String, Object> recordServicePeriodDataChange(Long servicePeriodId, String changeType, 
                                                            Object oldValue, Object newValue, String changeReason);

    /**
     * 查询服务周期数据变更历史
     * 
     * @param servicePeriodId 服务周期ID
     * @return 变更历史列表
     */
    public List<Map<String, Object>> getServicePeriodChangeHistory(Long servicePeriodId);

    /**
     * 发送数据变更通知
     * 
     * @param servicePeriodId 服务周期ID
     * @param changeType 变更类型
     * @param changeDetails 变更详情
     * @return 通知发送结果
     */
    public Map<String, Object> sendDataChangeNotification(Long servicePeriodId, String changeType, Map<String, Object> changeDetails);

    // ==================== 统计分析功能 ====================

    /**
     * 统计服务周期贷款总额
     * 
     * @param servicePeriodId 服务周期ID
     * @return 贷款总额
     */
    public BigDecimal sumLoanAmountByPeriodId(Long servicePeriodId);

    /**
     * 查询即将到期的贷款
     * 
     * @param days 提前天数
     * @return 即将到期的贷款列表
     */
    public List<ServicePeriodLoan> selectExpiringLoans(Integer days);

    /**
     * 生成贷款统计分析报告
     * 
     * @param servicePeriodId 服务周期ID
     * @return 统计分析结果
     */
    public Map<String, Object> generateLoanStatisticsReport(Long servicePeriodId);

    // ==================== 贷款编号生成 ====================

    /**
     * 生成贷款编号
     * 
     * @param servicePeriodId 服务周期ID
     * @return 贷款编号
     */
    public String generateLoanNumber(Long servicePeriodId);

    // ==================== 银行选择逻辑优化 ====================

    /**
     * 创建包含银行选择的贷款申请
     * 
     * @param servicePeriodLoan 贷款申请信息（包含银行选择和提交说明）
     * @return 创建结果
     */
    public Map<String, Object> createLoanWithBankSelection(ServicePeriodLoan servicePeriodLoan);

    /**
     * 一键提交贷款到银行
     * 
     * @param linkId 贷款关联ID
     * @return 提交结果
     */
    public Map<String, Object> quickSubmitToBank(Long linkId);

    /**
     * 修改服务周期贷款关联（支持银行选择历史记录）
     * 
     * @param servicePeriodLoan 服务周期贷款关联
     * @return 结果
     */
    public int updateServicePeriodLoanWithHistory(ServicePeriodLoan servicePeriodLoan);
}