package com.nbport.zgwl.contractlaunch.service;

import com.nbport.zgwl.common.PageResult;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchApproveDto;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchArchiveDto;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchDto;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchQueryDto;
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchSealDto;

import java.util.Map;

public interface ContractLaunchService {

    /** 分页查询合同列表 */
    PageResult<ContractLaunchDto> queryPage(ContractLaunchQueryDto queryDto);

    /** 查询合同详情（含合同方/文件/履行计划/日志） */
    ContractLaunchDto getDetail(Long id);

    /** 创建合同草稿 */
    ContractLaunchDto createDraft(ContractLaunchDto contract);

    /** 编辑合同草稿 */
    ContractLaunchDto updateDraft(ContractLaunchDto contract);

    /** 复制合同并生成新的草稿 */
    ContractLaunchDto copyDraft(Long id);

    /** 基于现有合同发起变更/附加合同草稿 */
    ContractLaunchDto createChangeDraft(Long id);

    /** 提交法务审批（调用结算平台 pushContract 接口） */
    ContractLaunchDto submitToLaw(Long id);

    /** 模拟审批通过（测试按钮，TODO：替换为真实法务回调） */
    ContractLaunchDto mockApprove(Long id, ContractLaunchApproveDto approveDto);

    /** 模拟审批驳回（测试按钮，TODO：替换为真实法务回调） */
    ContractLaunchDto mockReject(Long id, ContractLaunchApproveDto approveDto);

    /** 接收法务审批回调（处理审批结果，更新合同状态） */
    ContractLaunchDto handleLawApproveCallback(Map<String, Object> callbackPayload);

    /** 回写签章信息（签署发起时调用，记录 sealContractId） */
    ContractLaunchDto saveSealInfo(Long id, ContractLaunchSealDto sealDto);

    /** 签署完成回调（回写签署文件路径，状态变更为待采集） */
    ContractLaunchDto markSealCompleted(Long id, ContractLaunchSealDto sealDto);

    /** 模拟合同采集（调用数据采集 collectContract 接口，TODO：替换为真实调用） */
    ContractLaunchDto mockCollect(Long id);

    /** 合同归档（状态变更为已完成，TODO：同时推送归档到法务） */
    ContractLaunchDto archive(Long id, ContractLaunchArchiveDto archiveDto);

    /** 合同终止 */
    ContractLaunchDto terminate(Long id, String terminateReason);

    /** 删除草稿（仅 draft/rejected 状态允许） */
    void deleteDraft(Long id);
}
