package cn.iocoder.yudao.module.asset.service.contract;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.asset.controller.admin.contract.vo.*;
import cn.iocoder.yudao.module.asset.dal.dataobject.contract.ContractDO;

import jakarta.validation.Valid;
import java.util.List;

/**
 * 车辆租赁合同 Service 接口
 *
 * @author 芋道源码
 */
public interface ContractService {

    /**
     * 创建合同
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createContract(@Valid ContractSaveReqVO createReqVO);

    /**
     * 更新合同
     *
     * @param updateReqVO 更新信息
     */
    void updateContract(@Valid ContractSaveReqVO updateReqVO);

    /**
     * 删除合同
     *
     * @param id 编号
     */
    void deleteContract(Long id);

    /**
     * 获得合同
     *
     * @param id 编号
     * @return 合同
     */
    ContractDO getContract(Long id);

    /**
     * 获得合同分页
     *
     * @param pageReqVO 分页查询
     * @return 合同分页
     */
    PageResult<ContractDO> getContractPage(ContractPageReqVO pageReqVO);

    /**
     * 提交合同审批
     *
     * @param id 合同ID
     * @return 流程实例ID
     */
    String submitContractApproval(Long id);

    /**
     * 更新合同审批状态
     *
     * @param id 合同ID
     * @param status 审批状态
     */
    void updateContractApprovalStatus(Long id, Integer status);

    /**
     * 撤回合同审批
     *
     * @param id 合同ID
     */
    void withdrawContractApproval(Long id);

    /**
     * 终止合同
     *
     * @param id 合同ID
     * @param reason 终止原因
     */
    void terminateContract(Long id, String reason);

    /**
     * 续签合同
     *
     * @param id 原合同ID
     * @param newContractReqVO 新合同信息
     * @return 新合同ID
     */
    Long renewContract(Long id, ContractSaveReqVO newContractReqVO);

    /**
     * 获取合同详情（包含关联数据）
     *
     * @param id 合同ID
     * @return 合同详情
     */
    ContractDetailRespVO getContractDetail(Long id);

    /**
     * 获得合同精简列表（用于下拉选择）
     *
     * @return 合同列表
     */
    List<ContractDO> getContractSimpleList();

    /**
     * 变更为三方合同
     *
     * @param id 原合同ID
     * @param newContractReqVO 新合同信息
     * @return 新合同ID
     */
    Long convertToThirdParty(Long id, @Valid ContractSaveReqVO newContractReqVO);

    /**
     * 试用合同转正式
     *
     * @param id 原合同ID
     * @param newContractReqVO 新合同信息
     * @return 新合同ID
     */
    Long convertToFormal(Long id, @Valid ContractSaveReqVO newContractReqVO);

    /**
     * 往现有合同追加车辆
     *
     * @param id 合同ID
     * @param vehicles 车辆列表
     */
    void addVehiclesToContract(Long id, List<ContractSaveReqVO.ContractVehicleSaveVO> vehicles);

    /**
     * 上传盖章合同附件
     *
     * @param id 合同ID
     * @param fileUrl 文件URL
     * @param fileName 文件名
     */
    void uploadSealedContract(Long id, String fileUrl, String fileName);

}
