package com.yc.ship.module.product.service.voyage;

import com.yc.ship.framework.common.pojo.PageResult;
import com.yc.ship.module.product.controller.admin.voyage.vo.*;
import com.yc.ship.module.product.controller.app.voyage.vo.AppVoyageDayRespVO;
import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
import org.apache.ibatis.annotations.Param;

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

/**
 * 航次管理 Service 接口
 *
 * @author lfy
 */
public interface VoyageService {

    /**
     * 创建航次管理
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createVoyage(@Valid VoyageSaveReqVO createReqVO);

    /**
     * 更新航次管理
     *
     * @param updateReqVO 更新信息
     */
    void updateVoyage(@Valid VoyageSaveReqVO updateReqVO);

    /**
     * 删除航次管理
     *
     * @param id 编号
     */
    void deleteVoyage(Long id);

    /**
     * 获得航次管理
     *
     * @param id 编号
     * @return 航次管理
     */
    VoyageDO getVoyage(Long id);

    /**
     * 获得航次管理分页
     *
     * @param pageReqVO 分页查询
     * @return 航次管理分页
     */
    PageResult<VoyageDO> getVoyagePage(VoyagePageReqVO pageReqVO);

    List<VoyageDO> getListSimple(VoyageReqVO reqVO);

    List<VoyageDO> getList(List<Long> ids);

    Map<Long, VoyageDO> getListMap(List<Long> ids);

    /**
     *  根据游轮ID获取航次列表
     * @param shipId
     * @return
     */
    List<VoyageDO> getOnShelfListByShipId(Long shipId);

    /**
     * 批量创建航次
     * @param createReqVO
     */
    void createVoyageBatch(VoyageSaveBatchReqVO createReqVO);

    /**
     * 获取航次列表-日历
     * @param reqVO
     * @return
     */
    List<VoyageDO> getListCalendar(VoyageCalendarReqVO reqVO);

    /**
     * 根据游轮ID获取航次列表
     * @param shipId
     * @return
     */
    List<VoyageDO> getListByShipId(Long shipId);

    /**
     * 根据游轮ID和日期获取航次列表
     * @param shipId
     * @param date
     * @return
     */
    List<AppVoyageDayRespVO> getVoyageListByShipIdAndDate(Long shipId, String date);

    void updateLockVoyage(String id);

    /**
     * 统计航次的预定人数
     * @param voyageIds
     * @return
     */
    List<Map<String, Object>> countBatchByVoyageIds(@Param("voyageId") List<Long> voyageIds);
}