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

import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.*;
import cn.iocoder.yudao.module.contract.dal.dataobject.suppliercontract.SupplierContractDO;
import cn.iocoder.yudao.module.contract.dal.dataobject.suppliercontract.SupplierContractHistoryDO;

import javax.validation.Valid;

/**
 * 采购合同信息 Service 接口
 *
 * @author dp
 */
public interface SupplierContractService {

    /**
     * 获取供应商合同编号
     * 供应商合同编号是标识供应商合同的唯一代码
     *
     * @return 供应商合同编号
     */
    String getSupplierContractCode();

    /**
     * 创建采购合同信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createSupplierContract(@Valid SupplierContractSaveReqVO createReqVO);

    /**
     * 更新采购合同信息
     *
     * @param updateReqVO 更新信息
     */
    void updateSupplierContract(@Valid SupplierContractSaveReqVO updateReqVO);

    /**
     * 删除采购合同信息
     *
     * @param id 编号
     */
    void deleteSupplierContract(Long id);

    /**
     * 获得采购合同信息
     *
     * @param id 编号
     * @return 采购合同信息
     */
    SupplierContractDO getSupplierContract(Long id);

    /**
     * 获得采购合同信息分页
     *
     * @param pageReqVO 分页查询
     * @return 采购合同信息分页
     */
    PageResult<SupplierContractRespVO> getSupplierContractPage(SupplierContractPageReqVO pageReqVO);

    /**
     * 开启采购合同
     *
     * @param id 采购合同id
     * @return 影响行数
     */
    Integer openSupplierContract(Long id);


    /**
     * 关闭采购合同
     *
     * @param closeReqVO 关闭请求对象，包含关闭所需的必要信息
     *                   如合同ID、关闭原因等
     * @return 返回操作结果，通常是一个标识操作成功与否的整数
     * 比如：1表示成功，0表示失败
     */
    Integer closeSupplierContract(SupplierContractCloseReqVO closeReqVO);

    /**
     * 终止采购合同
     *
     * @param terminatedReqVO 终止请求对象，包含了终止合同所需的各种信息，如合同ID、终止原因等
     * @return 返回处理结果，通常是处理状态（如成功或失败）的标识，或者处理后的结果数据
     */
    Integer terminateSupplierContract(SupplierContractTerminatedReqVO terminatedReqVO);

    /**
     * 修改合同状态
     *
     * @param statusReqVO 供应商合同状态请求对象，包含要更新的状态信息
     * @return 更新操作的状态码，表示成功与否
     */
    Integer editSupplierStatus(SupplierContractStatusReqVO statusReqVO);


    SupplierContractDO getSupplierContractByCode(String supplierContractCode);

    // ==================== 子表（采购合同历史信息） ====================

    /**
     * 获得采购合同历史信息分页
     *
     * @param pageReqVO 分页查询
     * @param code 合同编号，年月日+uuid
     * @return 采购合同历史信息分页
     */
    PageResult<SupplierContractHistoryDO> getSupplierContractHistoryPage(PageParam pageReqVO, String code);

    /**
     * 创建采购合同历史信息
     *
     * @param supplierContractHistory 创建信息
     * @return 编号
     */
    Long createSupplierContractHistory(@Valid SupplierContractHistoryDO supplierContractHistory);

    // /**
    //  * 更新采购合同历史信息
    //  *
    //  * @param supplierContractHistory 更新信息
    //  */
    // void updateSupplierContractHistory(@Valid SupplierContractHistoryDO supplierContractHistory);
    //
    // /**
    //  * 删除采购合同历史信息
    //  *
    //  * @param id 编号
    //  */
    // void deleteSupplierContractHistory(Long id);

    /**
     * 物理删除采购合同信息
     *
     * @param id 编号
     * @return 影响行数
     */
    Integer deleteSupplierContractOriginal(Long id);


    /**
     * 变更采购合同信息
     *
     * @param updateReqVO 更新信息
     */
    void alterSupplierContract(SupplierContractSaveReqVO updateReqVO);


	/**
	 * 获得采购合同历史信息
	 *
	 * @param id 编号
     * @return 采购合同历史信息
	 */
    SupplierContractHistoryDO getSupplierContractHistory(Long id);

}