package com.zt.plat.module.contractorder.service.contract;

import cn.hutool.json.JSONObject;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.module.contractorder.api.dto.contract.ContractRespDTO;
import com.zt.plat.module.contractorder.api.vo.contract.*;
import com.zt.plat.module.contractorder.dal.dataobject.contract.ContractMainDO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpContractSaveReqVO;
import jakarta.validation.Valid;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.ResponseEntity;

import java.util.List;

/**
 * 后台合同编制 Service 接口
 *
 * @author ZT
 */
public interface ContractService {

    /**
     * 获得合同分页列表
     *
     * @param pageReqVO 分页条件
     * @return 分页列表
     */
    PageResult<ContractMainDO> getContractPage(@Valid ContractPageReqVO pageReqVO);
    /**
     * 获得合同分页列表--无权限
     *
     * @param pageReqVO 分页条件
     * @return 分页列表
     */
    PageResult<ContractMainDO> getPageNoPermission(@Valid ContractPageReqVO pageReqVO);


    /**
     * 新增合同
     *
     * @param reqVO 合同信息
     * @return 合同ID
     */
    Long createContract(@Valid ContractSaveReqVO reqVO);

    /**
     * 获得合同详情
     *
     * @param id 合同ID
     * @return 合同信息
     */
    ContractRespVO get(Long id);

    /**
     * 修改合同
     *
     * @param reqVO 合同信息
     * @return 修改结果
     */
    Boolean update(@Valid ContractSaveReqVO reqVO);

    /**
     * 合同提交审批
     *
     * @param id 合同ID
     * @return 提交审批结果
     */
    Boolean submitApproval(Long id);

    /**
     * 合同审批
     *
     * @param reqVO 审批信息
     * @return 审批结果
     */
    Boolean approval(@Valid ApprovalReqVO reqVO);

    /**
     * 查询不计价规则列表
     *
     * @param queryReqVO 查询参数
     * @return 不计价规则列表
     */
    PageResult<NotRespVO> getNots(NotsQueryReqVO queryReqVO);

    /**
     * 查询参数降级规则列表
     *
     * @param queryReqVO 查询参数
     * @return 参数降级规则列表
     */
    PageResult<DemoteRespVO> getDemotes(DemotesQueryReqVO queryReqVO);

    /**
     * 查询结算公式列表
     *
     * @param queryReqVO 查询参数
     * @return 结算公式列表
     */
    PageResult<FormulaRespVO> getFormulas(FormulasQueryReqVO queryReqVO);

    /**
     * 通过合同编号获取对应的合同信息
     *
     * @param contractPaperNumber 合同编号
     * @return 结算条款数据
     */
    ContractRespDTO getFormulasByPaperNumber(String contractPaperNumber);


    /**
     * 通过合同编号获取对应的合同信息
     *
     * @param contractSysNumber 合同编号
     * @return 结算条款数据
     */
    ContractRespDTO getFormulasBySysNumber(String contractSysNumber);
    /**
     * 提交ERP
     *
     * @param id 合同ID
     * @return 提交结果
     */
    JSONObject submitErp(Long id);

    /**
     * 删除合同
     *
     * @param ids 合同ID集合
     * @return 删除结果
     */
    List<JSONObject> delete(List<Long> ids);

    /**
     * 根据系统合同编号获得合同详情
     *
     * @param systemContractNumber 系统合同编号
     * @return 合同信息
     */
    ContractRespVO getBySystemContractNumber(String systemContractNumber);

    /**
     * 获得上游未关联合同列表
     *
     * @param id 合同ID
     * @return 上游未关联的合同列表
     */
    List<ContractRespVO> getListUpNotRelation(Long id);

    /**
     * 获得下游未关联合同列表
     *
     * @param id 合同ID
     * @return 下游未关联的合同列表
     */
    List<ContractRespVO> getListDownNotRelation(Long id);

    /**
     * 获得上游关联的合同数据
     *
     * @param id 合同ID
     * @return 关联的上游合同数据
     */
    ContractRespVO getUpRelation(Long id);

    /**
     * 获得下游关联的合同数据
     *
     * @param id 合同ID
     * @return 关联的下游合同数据
     */
    ContractRespVO getDownRelation(Long id);

    /**
     * 关联合同
     *
     * @param reqVo 上下游合同ID
     * @return 关联结果
     */
    Boolean relation(RelationReqVo reqVo);

    /**
     * 根据合同ID获得关联合同
     *
     * @param id 合同ID
     * @return 上下游合同ID
     */
    RelationRespVO getRelation(Long id);

    /**
     * 下载文件
     *
     * @param ids 合同ID集合
     * @return 压缩文件流
     */
    ResponseEntity<ByteArrayResource> download(List<Long> ids);

    /**
     * 归档
     *
     * @param ids 合同ID集合
     * @return 归档结果
     */
    Boolean archive(List<Long> ids);

    /**
     * 作废
     *
     * @param ids 合同ID集合
     * @return 作废结果
     */
    Boolean cancel(List<Long> ids);

    /**
     * 完结
     *
     * @param ids 合同ID集合
     * @return 完结结果
     */
    Boolean complete(List<Long> ids);

    /**
     * 合同映射数据提交到erp
     *
     * @param erpContractVO 合同映射数据
     * @return 提交结果
     */
    JSONObject sendToErp(ErpContractSaveReqVO erpContractVO);

    /**
     * 生成合同映射数据
     *
     * @param contractMainDO 合同主信息
     * @return 合同映射信息
     */
    ErpContractSaveReqVO getErpContract(ContractMainDO contractMainDO);

    /**
     * 生成系统合同编号
     *
     * 单据号生成规则说明
     * 单据名称（拼音）-类型-公司编码-年月日-六位编号
     * 如请款单: QKD-ZGQK-3000-20250915-00001
     *
     * @param category 合同类别
     *
     * @return 系统合同编号
     */
    String generateSystemContractNumber(String category);

    /**
     * 根据合同编号获得交易信息
     *
     * @param contractPaperNumber 合同编号
     * @return 交易信息
     */
    TransactionInfoRespVO transactionInfoByPaperNumber(String contractPaperNumber);
    /**
     * 关联合同
     *
     * @param relationContractVO 关联合同信息
     */
    void relationContract(RelationContractVO relationContractVO);
}
