package com.sckw.contract.api;

import com.sckw.contract.api.model.dto.req.ContractAuditPara;
import com.sckw.contract.api.model.dto.res.*;
import com.sckw.contract.api.model.vo.*;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author czh
 * @desc 合同远程接口
 * @date 2023/7/19
 */
public interface RemoteContractService {

    /**
     * @param contractId 合同id集合
     * @return Map<Long, ContractCommonInfoResDto>
     * @desc: 查合同基本信息
     * @author: czh
     * @date: 2023/7/20
     */
    Map<Long, ContractCommonInfoResDto> queryContractBaseInfo(List<Long> contractId);

    /**
     * @param contractId 合同id  performedAmount履约量
     * @desc: 更新已履约量
     * @author: czh
     * @date: 2023/8/31
     */
    void updatePerformed(Long contractId, BigDecimal performedAmount);

    /**
     * @param entId 企业id
     * @return Map<Integer, Integer>
     * @desc: 根据企业id统计企业下的有效合同个数
     * @author: czh
     * @date: 2023/9/8
     */
    Map<Integer, Integer> queryContractValidCount(Long entId, List<Long> enterpriseIds);


    /**
     * @param contractNo
     * @param acceptId   承运企业id
     * @param consignId  托运企业id
     * @return
     */
    ContractLogisticsOrderResDto getContractByContractNo(String contractNo, Long acceptId, Long consignId);

    /**
     * 根据贸易合同id查询物流合同信息
     *
     * @param tradeOrderContractId 贸易合同id
     * @return 贸易合同和物流合同信息
     */
    ContractLogisticsAndTradeOrderResDto queryContractByContractId(Long tradeOrderContractId, Long tradeId);

    /**
     * 查询贸易合同
     *
     * @param tradeContractId
     * @return
     */
    TradeContractResDto queryTradeContract(Long tradeContractId, Long goodsId);

    /**
     * 查询最新的签约合同
     *
     * @param entId   买方企业
     * @param goodsId
     * @return
     */
    TradeContractGoodsDto queryTradeContractNew(Long entId, Long goodsId, LocalDateTime time);

    List<Long> queryNewSignGoods(Long entId, LocalDateTime time);

    /**
     * 查询签约的商品
     *
     * @param entId
     * @param time
     * @return
     */
    List<Long> querySignTradeContract(Long entId, LocalDateTime time);

    /**
     * 查询物流合同信息
     */
    List<ContractLogisticsOrderResDto> queryContractLogisticsOrder(LogisticsOrderDto logisticsOrderDto);

    /**
     * 查询贸易合同信息
     */
    List<ContractTradeOrderInfo> queryContractTradeOrder(ContractTradeOrderDto contractTradeOrderDto);

    /**
     * 查询合同关联的商品信息
     *
     * @param contractId
     * @return
     */
    List<Long> queryTradeContractInfo(Long contractId);

    KwcContractLogisticsDto queryContractByContractId(Long contractId);

    List<TradeContractUnitDto> queryContractUnitByContractId(Long contractId);
    List<TradeContractUnitDto> queryLogContractUnitByContractId(Long contractId);

    /**
     * 查询自动派车的物流合同信息List
     */
    List<LogisticsEntDtoVO> queryAutoContractLogOrder(Long entId, List<Long> goodsIds);

    /**
     * 查询手动派车的物流合同信息List
     */
    List<LogisticsEntDtoVO> queryContractLogOrder(Long entId, Long goodsId);

    /**
     * 根据合同id和商品id查询物流合同商品信息
     */
    LogisticsGoodsDto queryLogGoodsByContractId(Long contractId, Long goodsId);

    /**
     * 查询自动派车的物流合同信息
     */
    TradeContractUnitDto queryEntByContractId(Long contractId);


    /**
     * 查询物流企业评分
     */
    ContractLogisticsScoreVO findLogisticsScoreByEntId(Long supEntId, Long entId);

    /**
     * 根据企业查询自动派单有效的物流合同
     */
    KwcContractLogisticsDto findLogContractByEntId(Long entId);

    TradeContractGoodsDto queryContractGoodsByContractId(Long contractId, Long goodsId);

    List<TradeContractGoodsDto> queryContractGoodsByContractIds(Set<Long> contractIds, Set<Long> goodsIds);
    Long queryTradeCount(Long entId,Integer type);
    Long queryLogisticsCount(Long entId,Integer type);
    ContractCountVo contractCount();

    List<ContractVo> tradeList();

    List<ContractVo> logisticsList();

    ContractDetailRespVo auditTradeContract(ContractAuditPara contractAuditPara);

    ContractDetailRespVo signTradeContract(ContractAuditPara contractAuditPara);

    LogisticDetailRespVo signLogisticsContract(ContractAuditPara contractAuditPara);

    /**
     * 更新贸易合同商品已采购数量（累加履行量）
     *
     * @param contractId 贸易合同id
     * @param goodsId    商品id
     * @param orderAmount 本次下单数量
     */
    void updateTradeContractGoodsPerformed(Long contractId, Long goodsId, BigDecimal orderAmount);
}
