package com.nbport.zgwl.contractlaunch.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchDto;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchFileDto;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchLogDto;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchPartyDto;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchPlanDto;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchQueryDto;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ContractLaunchMapper {

    /** 获取主表序列（Oracle 主键生成） */
    Long selectMainSeqNextVal();

    /** 获取合同方表序列 */
    Long selectPartySeqNextVal();

    /** 获取文件表序列 */
    Long selectFileSeqNextVal();

    /** 获取履行计划表序列 */
    Long selectPlanSeqNextVal();

    /** 获取日志表序列 */
    Long selectLogSeqNextVal();

    /** 分页查询合同列表 */
    IPage<ContractLaunchDto> selectContractPage(Page<ContractLaunchDto> page, @Param("query") ContractLaunchQueryDto queryDto);

    /** 根据主键查询合同 */
    ContractLaunchDto selectContractById(@Param("id") Long id);

    /** 根据 contractSysId 查询合同（法务回调时用于定位） */
    ContractLaunchDto selectContractByContractSysId(@Param("contractSysId") String contractSysId);

    /** 新增合同 */
    int insertContract(ContractLaunchDto contract);

    /** 修改合同 */
    int updateContract(ContractLaunchDto contract);

    /** 逻辑删除合同 */
    int deleteContract(@Param("id") Long id, @Param("updateBy") String updateBy);

    /** 批量插入合同方 */
    int batchInsertParty(@Param("list") List<ContractLaunchPartyDto> list,
                         @Param("createBy") String createBy,
                         @Param("updateBy") String updateBy);

    /** 批量插入文件 */
    int batchInsertFile(@Param("list") List<ContractLaunchFileDto> list,
                        @Param("createBy") String createBy,
                        @Param("updateBy") String updateBy);

    /** 批量插入履行计划 */
    int batchInsertPlan(@Param("list") List<ContractLaunchPlanDto> list,
                        @Param("createBy") String createBy,
                        @Param("updateBy") String updateBy);

    /** 插入单条操作日志 */
    int insertLog(ContractLaunchLogDto logDto);

    /** 删除合同下的所有合同方（逻辑删除） */
    int deletePartyByContractId(@Param("contractId") Long contractId,
                                @Param("updateBy") String updateBy);

    /** 删除合同下的所有文件（逻辑删除） */
    int deleteFileByContractId(@Param("contractId") Long contractId,
                               @Param("updateBy") String updateBy);

    /** 按分类删除合同下的文件（如重新上传正文时只删正文，不删其他附件） */
    int deleteFileByContractIdAndCategory(@Param("contractId") Long contractId,
                                          @Param("fileCategory") String fileCategory,
                                          @Param("updateBy") String updateBy);

    /** 回写法务附件路径缓存 */
    int updateFileLegalUrl(@Param("id") Long id,
                           @Param("legalFileUrl") String legalFileUrl,
                           @Param("updateBy") String updateBy);

    /** 删除合同下的所有履行计划（逻辑删除） */
    int deletePlanByContractId(@Param("contractId") Long contractId,
                               @Param("updateBy") String updateBy);

    /** 批量查询合同方（按 contractIds） */
    List<ContractLaunchPartyDto> selectPartyByContractIds(@Param("contractIds") List<Long> contractIds);

    /** 批量查询文件（按 contractIds） */
    List<ContractLaunchFileDto> selectFileByContractIds(@Param("contractIds") List<Long> contractIds);

    /** 批量查询履行计划（按 contractIds） */
    List<ContractLaunchPlanDto> selectPlanByContractIds(@Param("contractIds") List<Long> contractIds);

    /** 批量查询操作日志（按 contractIds） */
    List<ContractLaunchLogDto> selectLogByContractIds(@Param("contractIds") List<Long> contractIds);
}
