package com.ruoyi.credit.service;

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

import org.springframework.web.multipart.MultipartFile;

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

/**
 * 合同管理服务接口
 * 
 * @author ruoyi
 * @date 2025-12-19
 */
public interface IContractService 
{
    /**
     * 创建服务合同(线上创建)
     * 
     * @param contractInfo 合同信息
     * @return 创建的合同对象
     */
    Contract createContract(Contract contractInfo);

    /**
     * 上传已签署的线下合同
     * 
     * @param contractFile 合同文件
     * @param contractInfo 合同基本信息
     * @return 上传的合同对象
     */
    Contract uploadSignedContract(MultipartFile contractFile, Contract contractInfo);

    /**
     * 确认合同
     * 
     * @param contractId 合同ID
     * @param partyType 确认方类型 (SECURITY_COMPANY/CLIENT_COMPANY)
     * @return 操作结果
     */
    boolean confirmContract(Long contractId, String partyType);

    /**
     * 更新合同状态
     * 
     * @param contractId 合同ID
     * @param status 新状态
     * @return 操作结果
     */
    boolean updateContractStatus(Long contractId, String status);

    /**
     * 更新合同信息
     * 
     * @param contract 合同信息
     * @return 操作结果
     */
    boolean updateContract(Contract contract);

    /**
     * 验证合同数据完整性
     * 
     * @param contractInfo 合同信息
     * @return 验证结果
     */
    Map<String, Object> validateContractData(Contract contractInfo);

    /**
     * 验证上传合同文件的完整性和格式
     * 
     * @param contractFile 合同文件
     * @return 验证结果
     */
    Map<String, Object> validateContractFile(MultipartFile contractFile);

    /**
     * 从上传的合同文件中提取关键信息
     * 
     * @param contractFile 合同文件
     * @return 提取的信息
     */
    Map<String, Object> extractContractInfo(MultipartFile contractFile);

    /**
     * 关联线下合同与平台记录
     * 
     * @param contractId 合同ID
     * @param uploadedFileId 上传文件ID
     * @return 操作结果
     */
    boolean linkOfflineContract(Long contractId, Long uploadedFileId);

    /**
     * 生成合同编号
     * 
     * @return 合同编号
     */
    String generateContractNumber();

    /**
     * 查询合同详情
     * 
     * @param contractId 合同ID
     * @return 合同信息
     */
    Contract selectContractByContractId(Long contractId);

    /**
     * 查询合同列表
     * 
     * @param contract 查询条件
     * @return 合同列表
     */
    List<Contract> selectContractList(Contract contract);

    /**
     * 根据合同编号查询合同
     * 
     * @param contractNumber 合同编号
     * @return 合同信息
     */
    Contract selectContractByContractNumber(String contractNumber);

    /**
     * 根据状态查询合同列表
     * 
     * @param contractStatus 合同状态
     * @return 合同列表
     */
    List<Contract> selectContractByStatus(String contractStatus);

    /**
     * 查询即将到期的合同
     * 
     * @param days 提前天数
     * @return 合同列表
     */
    List<Contract> selectExpiringContracts(int days);

    /**
     * 删除合同
     * 
     * @param contractId 合同ID
     * @return 操作结果
     */
    int deleteContractByContractId(Long contractId);

    /**
     * 批量删除合同
     * 
     * @param contractIds 合同ID数组
     * @return 操作结果
     */
    int deleteContractByContractIds(Long[] contractIds);

    /**
     * 校验合同编号唯一性
     * 
     * @param contractNumber 合同编号
     * @return 校验结果
     */
    boolean checkContractNumberUnique(String contractNumber);

    /**
     * 记录合同状态变更审计日志
     * 
     * @param contractId 合同ID
     * @param oldStatus 原状态
     * @param newStatus 新状态
     * @param changeReason 变更原因
     */
    void recordStatusChangeAudit(Long contractId, String oldStatus, String newStatus, String changeReason);

    /**
     * 创建服务合同详细信息（绑定服务周期时调用）
     * 
     * @param contractId 基础合同ID
     * @param serviceContractInfo 服务合同详细信息
     * @return 创建的服务合同对象
     */
    ServiceContract createServiceContract(Long contractId, ServiceContract serviceContractInfo);

    /**
     * 查询服务合同详情
     * 
     * @param contractId 合同ID
     * @return 服务合同信息
     */
    ServiceContract selectServiceContractByContractId(Long contractId);

    /**
     * 查询服务合同列表
     * 
     * @param serviceContract 查询条件
     * @return 服务合同列表
     */
    List<ServiceContract> selectServiceContractList(ServiceContract serviceContract);

    /**
     * 更新服务合同信息
     * 
     * @param serviceContract 服务合同信息
     * @return 操作结果
     */
    boolean updateServiceContract(ServiceContract serviceContract);

    /**
     * 批量删除服务合同
     * 
     * @param contractIds 合同ID数组
     * @return 操作结果
     */
    int deleteServiceContractByContractIds(Long[] contractIds);
}