package com.ruoyi.web.modules.screen.mapper;

import java.util.Date;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenAppointmentStatDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenHerdCowAgeSumDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenYearMonthBullCowDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenYearMonthCountDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenHerdGenderMonthDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenHerdGenderSumDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenMonthCountDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenStatPeriodDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenSubsidyTypeSumDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenTrainingMonthDto;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenTownMapMarkerVo;

/**
 * 大屏首页聚合查询。
 * <p>
 * 牦牛存栏/出栏产业指标取自 {@code biz_yak_herd_inventory}、{@code biz_yak_outbound_report} 填报表；
 * 资产出栏按月仍可用于年份下拉等；补贴按 {@code grant_date} 落在统计年内。
 */
public interface HomeScreenStatsMapper
{
    /** 入驻供应商数（与交易销售总览同源） */
    int countSupplierForScreen();

    int countDistributorForScreen();

    int countTradeMarketForScreen();

    /** 按月出栏头数；{@code asset_status=4}，按 {@code status_change_date} */
    List<HomeScreenMonthCountDto> selectOutboundCountByMonth(
            @Param("allowedPastureIds") List<Long> allowedPastureIds,
            @Param("yearStart") Date yearStart,
            @Param("yearEnd") Date yearEnd);

    /** 当年预约总量，按 provider_type 分组 */
    List<HomeScreenAppointmentStatDto> selectAppointmentAnnualByYear(@Param("statYear") int statYear);

    /** 当年预约按月+provider_type 分组 */
    List<HomeScreenAppointmentStatDto> selectAppointmentMonthlyByYear(@Param("statYear") int statYear);

    /** 自然年月区间内预约按月+provider_type 分组（{@code startYm}/{@code endYm} 为 yyyyMM） */
    List<HomeScreenAppointmentStatDto> selectAppointmentMonthlyByYearMonthRange(
            @Param("startYm") int startYm, @Param("endYm") int endYm);

    /** 惠农补贴按类型汇总金额（元） */
    List<HomeScreenSubsidyTypeSumDto> sumSubsidyAmountByTypeForYear(
            @Param("yearStart") Date yearStart,
            @Param("yearEnd") Date yearEnd);

    /** 统计年内是否有补贴发放记录 */
    int countSubsidyGrantInYear(@Param("yearStart") Date yearStart, @Param("yearEnd") Date yearEnd);

    int countVideoCoursesPublishedInYear(@Param("yearStart") Date yearStart, @Param("yearEnd") Date yearEnd);

    int countTrainingsPublishedInYear(@Param("yearStart") Date yearStart, @Param("yearEnd") Date yearEnd);

    /** 培训趋势：按培训举办时间所在月统计 */
    List<HomeScreenTrainingMonthDto> selectTrainingTrendByTrainingYear(@Param("statYear") int statYear);

    /** 自然年月区间内培训按月统计（{@code startYm}/{@code endYm} 为 yyyyMM） */
    List<HomeScreenTrainingMonthDto> selectTrainingTrendByTrainingYearMonthRange(
            @Param("startYm") int startYm, @Param("endYm") int endYm);

    int countPublishedTrainingsWithTrainingTimeInYear(@Param("statYear") int statYear);

    /** 自然年月区间内已发布且 training_time 落在区间内的培训条数 */
    int countPublishedTrainingsWithTrainingTimeInYearMonthRange(
            @Param("startYm") int startYm, @Param("endYm") int endYm);

    List<Integer> selectDistinctOutboundYears();

    List<Integer> selectDistinctAppointmentYears();

    List<Integer> selectDistinctSubsidyYears();

    List<Integer> selectDistinctStandardCreateYears();

    List<Integer> selectDistinctTechPublishYears();

    List<Integer> selectDistinctTrainingYears();

    /**
     * 地图标注：全县填报乡镇 + 存栏/出栏（各自最近填报年月）；年月参数为 null 时该侧 JOIN 不匹配。
     */
    List<HomeScreenTownMapMarkerVo> selectTownMapMarkers(
            @Param("herdStatYear") Integer herdStatYear,
            @Param("herdStatMonth") Integer herdStatMonth,
            @Param("outboundStatYear") Integer outboundStatYear,
            @Param("outboundStatMonth") Integer outboundStatMonth);

    /** 指定年份全县乡镇牦牛存栏填报合计（{@code biz_yak_herd_inventory.yak_total}） */
    int sumHerdInventoryYakTotalByStatYear(@Param("statYear") int statYear);

    /** 指定年份全县乡镇牦牛出栏填报合计（{@code biz_yak_outbound_report.yak_outbound_count}） */
    int sumOutboundReportYakCountByStatYear(@Param("statYear") int statYear);

    /** 指定年份全县乡镇农牧户户数填报合计（{@code biz_yak_outbound_report.farmer_household_count}） */
    int sumOutboundReportFarmerHouseholdCountByStatYear(@Param("statYear") int statYear);

    /** 存栏填报最近一条数据的年月（按 stat_year、stat_month 降序） */
    HomeScreenStatPeriodDto selectLatestHerdInventoryStatPeriod();

    /** 出栏填报最近一条数据的年月 */
    HomeScreenStatPeriodDto selectLatestOutboundReportStatPeriod();

    int sumHerdInventoryYakTotalByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    int sumOutboundReportYakCountByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    int sumOutboundReportFarmerHouseholdCountByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    HomeScreenHerdGenderSumDto sumHerdInventoryGenderByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    HomeScreenHerdCowAgeSumDto sumHerdInventoryCowAgeByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年各月全县公牛/母牛存栏合计（{@code bull_total}/{@code cow_total}） */
    List<HomeScreenHerdGenderMonthDto> selectHerdInventoryBullCowByMonth(@Param("statYear") int statYear);

    /** 自然年月区间内全县公牛/母牛存栏按月合计（{@code startYm}、{@code endYm} 为 yyyyMM 整数） */
    List<HomeScreenYearMonthBullCowDto> selectHerdInventoryBullCowByYearMonthRange(
            @Param("startYm") int startYm, @Param("endYm") int endYm);

    /** 指定年各月全县牦牛出栏填报合计 */
    List<HomeScreenMonthCountDto> selectOutboundReportYakCountByMonth(@Param("statYear") int statYear);

    /** 自然年月区间内全县牦牛出栏按月合计 */
    List<HomeScreenYearMonthCountDto> selectOutboundReportYakCountByYearMonthRange(
            @Param("startYm") int startYm, @Param("endYm") int endYm);
}
