package com.yc.ship.module.ota.service.distributorproduct;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yc.ship.framework.common.pojo.CommonResult;
import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
import com.yc.ship.module.ota.api.dto.DistributorProductRespDTO;
import com.yc.ship.module.ota.controller.admin.distributorproduct.vo.DistributorProductPageReqVO;
import com.yc.ship.module.ota.controller.admin.distributorproduct.vo.DistributorProductRespVO;
import com.yc.ship.module.ota.controller.admin.distributorproduct.vo.DistributorProductSaveReqVO;
import com.yc.ship.module.ota.controller.admin.distributorproduct.vo.DistributorProjectSaveReqVO;
import com.yc.ship.module.ota.controller.admin.distributorproduct.vo.product.InitializeDistributorProductReqVO;
import com.yc.ship.module.ota.controller.admin.distributorproduct.vo.product.ProductGroupRespVO;
import com.yc.ship.module.ota.controller.admin.distributorproduct.vo.product.ProductPageReqVO;
import com.yc.ship.module.ota.controller.admin.distributorproduct.vo.product.ProductRespVO;
import com.yc.ship.module.ota.dal.dataobject.distributorproduct.DistributorAgencyPriceDO;
import com.yc.ship.module.ota.dal.dataobject.distributorproduct.DistributorProductDO;

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

/**
 * 平台产品与分销商关系 Service 接口
 *
 * @author 管理员
 */
public interface DistributorProductService {

    /**
     * 创建平台产品与分销商关系
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    String createDistributorProduct(@Valid DistributorProductSaveReqVO createReqVO);

    /**
     * 更新平台产品与分销商关系
     *
     * @param updateReqVO 更新信息
     */
    void updateDistributorProduct(@Valid DistributorProductSaveReqVO updateReqVO);

    /**
     * 删除平台产品与分销商关系
     *
     * @param id 编号
     */
    void deleteDistributorProduct(String id);

    /**
     * 获得平台产品与分销商关系
     *
     * @param id 编号
     * @return 平台产品与分销商关系
     */
    DistributorProductDO getDistributorProduct(String id);

    /**
     * 获得平台产品与分销商关系分页
     *
     * @param pageReqVO 分页查询
     * @return 平台产品与分销商关系分页
     */
    IPage<DistributorProductRespVO> getDistributorProductPage(DistributorProductPageReqVO pageReqVO);


    void updateStatus(String id, Integer status);

    void updateStatusOtc(String id, Integer status);

    void updateStatusList(DistributorProductSaveReqVO updateReqVO);

    void updateStatus2List(DistributorProductSaveReqVO updateReqVO);

    void updateStoreProductList(DistributorProductSaveReqVO updateReqVO);

    void updateStatusInitList(List<DistributorProductSaveReqVO> updateReqVO);

    IPage<ProductRespVO> getProductPage(ProductPageReqVO pageReqVO);

    IPage<DistributorProductRespVO> pageDistributorProduct(ProductPageReqVO pageReqVO);

    List<DistributorProductRespVO> distributorProductTree(ProductPageReqVO pageReqVO);

    List<ProductRespVO> productTree(ProductPageReqVO pageReqVO);

    void initializeProductDistributorInfo(DistributorProductPageReqVO reqVO);

    void initializeDistributorProductInfo(InitializeDistributorProductReqVO reqVO);

    CommonResult<List<DistributorProductRespDTO>> getProductListByDistributorId(Long distributorId);


    CommonResult<Long> getProductById(Long distributorProductId);

    CommonResult<DistributorProductRespDTO> getDistributorProductById(Long distributorProductId);

    CommonResult<DistributorProductRespDTO> getDistributorProductByProductAndDistributor(Long productId, Long distributorId);

    CommonResult<List<DistributorProductRespDTO>> getProductListPageByDistributorId(Long distributorId, int pageIndex, int pageSize);

    List<ProductGroupRespVO> selectProjectType(Long productId);

    List<DistributorAgencyPriceDO> selectAgencyPrice(DistributorAgencyPriceDO vo);

    void updateProjectType(@Valid DistributorProjectSaveReqVO createReqVO);

    void updateAgencyPrice(@Valid DistributorAgencyPriceDO createReqVO);

    @TenantIgnore
    CommonResult<DistributorProductRespDTO> getDistributorCalendarProductById(Long distributorProductId, String useDate);

    DistributorProductDO getDistributorCalendarProduct(DistributorProductDO distributorProduct, String useDate);

    @TenantIgnore
    CommonResult<DistributorProductRespDTO> getAgencyCalendarRangeProductById(Long distributorProductId, String startDate, String endDate);

    @TenantIgnore
    List<DistributorProductRespDTO.DistributorProjectDTO> getProductByDistributor(Long distributorId, Long ProductId,String distributorProductId);

    CommonResult<String> syncTicketSave(List<DistributorProductSaveReqVO> distributorProductList);

    void relationOtaInfo(DistributorProductSaveReqVO updateReqVO);

    CommonResult<?> syncTicketQuery(List<DistributorProductSaveReqVO> distributorProductList);

    CommonResult<?> syncTicketCalendarSave(List<DistributorProductSaveReqVO> distributorProductList);

    CommonResult<?> syncProductOperate(List<DistributorProductSaveReqVO> distributorProductList);
}
