package com.sundot.airport.item.mapper;

import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
import com.sundot.airport.item.domain.ItemLargeScreenHomePageSeizureReportSqlDto;
import com.sundot.airport.item.domain.home.SeizureReportDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 查获上报 Mapper接口
 */
@Mapper
public interface SeizureReportMapper {

    /**
     * 查询本人查获数量
     *
     * @param userId    用户ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 查获数量
     */
    public BigDecimal selectSelfSeizureCount(@Param("userId") Long userId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询班组查获总数
     *
     * @param deptId    部门ID (班组ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 查获总数
     */
    public BigDecimal selectTeamAverage(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询科室查获总数
     *
     * @param deptId    部门ID (科室ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 查获总数
     */
    public BigDecimal selectDepartmentAverage(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询大队查获总数
     *
     * @param deptId    部门ID (科室ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 查获总数
     */
    public BigDecimal selectBrigadeAverage(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询全站查获总数
     *
     * @param deptId    部门ID (站点ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 查获总数
     */
    public BigDecimal selectStationAverage(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询待处理数据数量（分配给当前用户且待审批的查获审批任务数量）
     *
     * @param userId    用户ID
     * @param deptId    部门ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 待处理数据数量
     */
    public Integer selectPendingCount(@Param("userId") Long userId, @Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询排名信息
     *
     * @param userId    用户ID
     * @param deptId    部门ID
     * @param level     排名级别 (team, department, station)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 排名信息列表
     */
    public List<SeizureReportDTO.RankingInfo> selectRankingInfo(@Param("userId") Long userId, @Param("deptId") Long deptId, @Param("level") String level, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询个人排名
     *
     * @param userId    用户ID
     * @param deptId    部门ID
     * @param level     排名级别 (team, department, station)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 个人排名
     */
    public Integer selectSelfRanking(@Param("userId") Long userId, @Param("deptId") Long deptId, @Param("level") String level, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询班组部门ID（根据用户ID）
     *
     * @param userId 用户ID
     * @return 科室ID
     */
    public Long selectSectionDeptIdByUserId(@Param("userId") Long userId);

    /**
     * 查询科室部门ID（根据班组ID）
     *
     * @param teamId 班组ID
     * @return 科室ID
     */
    public Long selectSectionDeptIdByTeamId(@Param("teamId") Long teamId);

    /**
     * 查询大队部门ID（根据科室ID）
     *
     * @param departmentId 科室ID
     * @return 大队ID
     */
    public Long selectBrigadeDeptIdByDepartmentId(@Param("departmentId") Long departmentId);

    /**
     * 查询站点部门ID（根据部门ID）
     *
     * @param deptId 部门ID
     * @return 站点ID
     */
    public Long selectStationDeptIdByDeptId(@Param("deptId") Long deptId);

    /**
     * 查询全站查获总数
     *
     * @param deptId    站点ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 全站查获总数
     */
    public BigDecimal selectTotalStationSeizure(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询科室排名
     *
     * @param deptId    站点ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 科室排名列表
     */
    public List<SeizureReportDTO.DepartmentRankingItem> selectDepartmentRankings(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询大队排名
     *
     * @param deptId    站点ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 科室排名列表
     */
    public List<SeizureReportDTO.BrigadeRankingItem> selectBrigadeRankings(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询科室排名（根据大队 ID）
     *
     * @param brigadeId 大队 ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 班组排名列表
     */
    public List<SeizureReportDTO.DepartmentRankingItem> selectDepartmentRankingsByBrigadeId(@Param("brigadeId") Long brigadeId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询班组排名（根据科室 ID）
     *
     * @param departmentId 科室 ID
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 班组排名列表
     */
    public List<SeizureReportDTO.TeamRankingItem> selectTeamRankingsByDepartmentId(@Param("departmentId") Long departmentId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询用户排名（根据班组 ID）
     *
     * @param teamId    班组 ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 用户排名列表
     */
    public List<SeizureReportDTO.UserRankingItem> selectUserRankingsByTeamId(@Param("teamId") Long teamId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询排名前三的班组（不包含排名，排名在Java代码中计算）
     *
     * @param deptId    科室ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 排名前三的班组列表
     */
    public List<SeizureReportDTO.TopThreeTeamItem> selectTopThreeTeams(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询排名前三的科室（不包含排名，排名在Java代码中计算）
     *
     * @param deptId    科室ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 排名前三的科室列表
     */
    public List<SeizureReportDTO.TopThreeDepartmentItem> selectTopThreeDepartment(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询前三名的班组排名
     *
     * @param deptId    站点ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 前五名班组排名列表
     */
    public List<SeizureReportDTO.TeamRankingItem> selectTopThreeTeamRankings(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate, @Param("order") String order);

    /**
     * 查询前三名的科室排名
     *
     * @param deptId    站点ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 前五名班组排名列表
     */
    public List<SeizureReportDTO.DepartmentRankingItem> selectTopThreeDepartmentRankings(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate, @Param("order") String order);

    /**
     * 查询班组长查获总数
     *
     * @param deptId    部门ID (班组ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 班组查获总数
     */
    public BigDecimal selectTeamSeizure(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询科室查获总数
     *
     * @param deptId    部门ID (科室ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 科室查获总数
     */
    public BigDecimal selectDepartmentSeizure(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询大队查获总数
     *
     * @param deptId    部门ID (科室ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 科室查获总数
     */
    public BigDecimal selectBrigadeSeizure(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询科室下的班组总数
     *
     * @param deptId 部门ID (科室ID)
     * @return 班组总数
     */
    public Integer selectTeamCountByDepartmentId(@Param("deptId") Long deptId);

    /**
     * 查询科室下的班组总数
     *
     * @param deptId 部门ID (科室ID)
     * @return 班组总数
     */
    public Integer selectTeamCountByBrigadeId(@Param("deptId") Long deptId);

    /**
     * 查询全站下的班组总数
     *
     * @param deptId 部门ID (站点ID)
     * @return 班组总数
     */
    public Integer selectTeamCountByStationId(@Param("deptId") Long deptId);

    /**
     * 查询科室下所有班组的排名
     *
     * @param deptId    部门ID (科室ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 班组排名列表
     */
    public List<SeizureReportDTO.TeamRankingItem> selectAllTeamRankingsInDepartment(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询大队下所有班组的排名
     *
     * @param deptId    部门ID (科室ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 班组排名列表
     */
    public List<SeizureReportDTO.TeamRankingItem> selectAllTeamRankingsInBrigade(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询全站下所有班组的排名
     *
     * @param deptId    部门ID (站点ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 班组排名列表
     */
    public List<SeizureReportDTO.TeamRankingItem> selectAllTeamRankingsInStation(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询班组下用户总数
     *
     * @param deptId 部门ID (班组ID)
     * @return 用户总数
     */
    public Integer selectUserCountByTeamId(@Param("deptId") Long deptId);

    /**
     * 查询科室下用户总数
     *
     * @param deptId 部门ID (科室ID)
     * @return 用户总数
     */
    public Integer selectUserCountByDepartmentId(@Param("deptId") Long deptId);

    /**
     * 查询科室下用户总数
     *
     * @param deptId 部门ID (科室ID)
     * @return 用户总数
     */
    public Integer selectUserCountByBrigadeId(@Param("deptId") Long deptId);

    /**
     * 查询全站下用户总数
     *
     * @param deptId 部门ID (站点ID)
     * @return 用户总数
     */
    public Integer selectUserCountByStationId(@Param("deptId") Long deptId);

    /**
     * 查询全站下科室总数
     *
     * @param deptId 部门ID (站点ID)
     * @return 科室总数
     */
    public Integer selectDepartmentCountByStationId(@Param("deptId") Long deptId);

    /**
     * 查询全站下大队总数
     *
     * @param deptId 部门ID (站点ID)
     * @return 科室总数
     */
    public Integer selectBrigadeCountByStationId(@Param("deptId") Long deptId);

    /**
     * 查询全大队下科室总数
     *
     * @param deptId 部门ID (站点ID)
     * @return 科室总数
     */
    public Integer selectDepartmentCountByBrigadeId(@Param("deptId") Long deptId);

    /**
     * 查询全站下所有科室的排名
     *
     * @param deptId    部门ID (站点ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 科室排名列表
     */
    public List<SeizureReportDTO.DepartmentRankingItem> selectAllDepartmentRankingsInStation(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询全站下所有大队的排名
     *
     * @param deptId    部门ID (站点ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 大队排名列表
     */
    public List<SeizureReportDTO.BrigadeRankingItem> selectAllBrigadeRankingsInStation(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询全大队下所有科室的排名
     *
     * @param deptId    部门ID (站点ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 科室排名列表
     */
    public List<SeizureReportDTO.DepartmentRankingItem> selectAllDepartmentRankingsInBrigade(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询全站范围内查获数量的最大值
     *
     * @param deptId    部门ID (站点ID)
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 最大查获数量
     */
    public BigDecimal selectMaxSeizureCountInStation(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询草稿箱中数据数量
     *
     * @param userId    用户ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 草稿箱中数据数量
     */
    public Integer selectDraftItemCount(@Param("userId") Long userId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询查获总数
     *
     * @param list      用户ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 查获总数
     */
    public BigDecimal selectAverage(@Param("list") List<Long> list, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 首页-查获上报
     *
     * @return 首页-巡检单
     */
    public List<ItemLargeScreenHomePageSeizureReportSqlDto> homePageSeizureReport(BaseLargeScreenQueryParamDto dto);

    List<ItemLargeScreenHomePageSeizureReportSqlDto> homePageSeizureReportBrigadeId(BaseLargeScreenQueryParamDto dto);

    List<ItemLargeScreenHomePageSeizureReportSqlDto> homePageSeizureReportDepartmentId(BaseLargeScreenQueryParamDto dto);
}