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

import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.contract.controller.admin.customercontract.vo.CustomerContractCloseReqVO;
import cn.iocoder.yudao.module.contract.controller.admin.customercontract.vo.CustomerContractListVO;
import cn.iocoder.yudao.module.contract.controller.admin.customercontract.vo.CustomerContractPageReqVO;
import cn.iocoder.yudao.module.contract.controller.admin.customercontract.vo.CustomerContractRespVO;
import cn.iocoder.yudao.module.contract.controller.admin.customercontract.vo.CustomerContractSaveReqVO;
import cn.iocoder.yudao.module.contract.controller.admin.customercontract.vo.CustomerContractStatusReqVO;
import cn.iocoder.yudao.module.contract.controller.admin.customercontract.vo.CustomerContractTerminatedReqVO;
import cn.iocoder.yudao.module.contract.dal.dataobject.customercontract.CustomerContractDO;
import cn.iocoder.yudao.module.contract.dal.dataobject.customercontract.CustomerContractHistoryDO;

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

/**
 * 销售合同信息 Service 接口
 *
 * @author dp
 */
public interface CustomerContractService {

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

    /**
     * 创建销售合同信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createCustomerContract(@Valid CustomerContractSaveReqVO createReqVO);

    /**
     * 更新销售合同信息
     *
     * @param updateReqVO 更新信息
     */
    void updateCustomerContract(@Valid CustomerContractSaveReqVO updateReqVO);

    /**
     * 删除销售合同信息
     *
     * @param id 编号
     */
    void deleteCustomerContract(Long id);

    /**
     * 获得销售合同信息
     *
     * @param id 编号
     * @return 销售合同信息
     */
    CustomerContractDO getCustomerContract(Long id);

    /**
     * 获得销售合同信息分页
     *
     * @param pageReqVO 分页查询
     * @return 销售合同信息分页
     */
    PageResult<CustomerContractRespVO> getCustomerContractPage(CustomerContractPageReqVO pageReqVO);

    /**
     * 获得销售合同信息列表
     *
     * @param listVO 列表查询
     * @return 销售合同信息列表
     */
    List<CustomerContractDO> getCustomerContractList(CustomerContractListVO listVO);

    /**
     * 开启销售合同
     *
     * @param id 销售合同id
     * @return 影响行数
     */
    Integer openCustomerContract(Long id);


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

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

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


    CustomerContractDO getCustomerContractByCode(String customerContractCode);

    // ==================== 子表（销售合同历史信息） ====================

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

    /**
     * 创建销售合同历史信息
     *
     * @param customerContractHistory 创建信息
     * @return 编号
     */
    Long createCustomerContractHistory(@Valid CustomerContractHistoryDO customerContractHistory);

    // /**
    //  * 更新销售合同历史信息
    //  *
    //  * @param customerContractHistory 更新信息
    //  */
    // void updateCustomerContractHistory(@Valid CustomerContractHistoryDO customerContractHistory);
    //
    // /**
    //  * 删除销售合同历史信息
    //  *
    //  * @param id 编号
    //  */
    // void deleteCustomerContractHistory(Long id);

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


    /**
     * 变更销售合同信息
     *
     * @param updateReqVO 更新信息
     */
    void alterCustomerContract(CustomerContractSaveReqVO updateReqVO);


    /**
     * 获得销售合同历史信息
     *
     * @param id 编号
     * @return 销售合同历史信息
     */
    CustomerContractHistoryDO getCustomerContractHistory(Long id);

}