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

import java.math.BigDecimal;
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.HomeScreenHerdSpeciesSumDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenHerdYakStructureSumDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenCoopBusinessModelSumDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenDisposableIncomeYearDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenEnterpriseFinanceSumDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenMonthCountDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenOutboundSpeciesSumDto;
import com.ruoyi.web.modules.screen.domain.dto.HomeScreenSelfConsumptionSumDto;
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;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenTownSubsidyItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenBreedingEntityQuantityListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenYakInventoryOutboundListItemVo;

/**
 * 大屏首页聚合查询。
 * <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 时该侧为 0。
     */
    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();

    /** 指定年份内存栏填报最大月份（stat_year = 所选年，再按 stat_month 降序） */
    HomeScreenStatPeriodDto selectLatestHerdInventoryStatPeriodByYear(@Param("statYear") int statYear);

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

    /** 指定年份内出栏填报最大月份 */
    HomeScreenStatPeriodDto selectLatestOutboundReportStatPeriodByYear(@Param("statYear") int statYear);

    /** 指定年份内农牧户填报最大月份（{@code biz_farmer_household}） */
    HomeScreenStatPeriodDto selectLatestFarmerHouseholdStatPeriodByYear(@Param("statYear") int statYear);

    /** 指定年份内合作社发展填报最大月份 */
    HomeScreenStatPeriodDto selectLatestCooperativeDevelopmentStatPeriodByYear(@Param("statYear") int statYear);

    /** 指定年份内家庭牧场填报最大月份 */
    HomeScreenStatPeriodDto selectLatestFamilyRanchStatPeriodByYear(@Param("statYear") int statYear);

    /** 指定年份内养殖大户填报最大月份 */
    HomeScreenStatPeriodDto selectLatestLargeLivestockFarmerStatPeriodByYear(@Param("statYear") int statYear);

    /** 指定年份内有无畜户填报最大月份 */
    HomeScreenStatPeriodDto selectLatestLivestockOwnershipHouseholdStatPeriodByYear(@Param("statYear") int statYear);

    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);

    /** 指定年月全县村级农牧户数合计（{@code biz_farmer_household.household_count}） */
    int sumFarmerHouseholdCountByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月全县村级草场承包总面积合计（{@code biz_farmer_household.pasture_contract_area}） */
    BigDecimal sumFarmerHouseholdPastureContractAreaByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月合作社数量（记录条数） */
    int countCooperativeDevelopmentByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月家庭牧场数量（记录条数） */
    int countFamilyRanchByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月养殖大户数量（记录条数） */
    int countLargeLivestockFarmerByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月全县村级有畜户户数合计 */
    int sumWithLivestockHouseholdCountByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

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

    /** 指定年月全县牦牛/奶牛/羊存栏合计 */
    HomeScreenHerdSpeciesSumDto sumHerdInventorySpeciesByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月全县牦牛结构明细合计（种公牛/阉畜/幼畜/成畜/保险） */
    HomeScreenHerdYakStructureSumDto sumHerdInventoryYakStructureByStatYearMonth(
            @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);

    /** 指定年月全县各畜种出栏合计 */
    HomeScreenOutboundSpeciesSumDto sumOutboundReportSpeciesByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月全县自食牛/绵羊/山羊合计 */
    HomeScreenSelfConsumptionSumDto sumOutboundReportSelfConsumptionByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月全县家庭牧场收入/支出/利润/补助合计（万元） */
    HomeScreenEnterpriseFinanceSumDto sumFamilyRanchFinanceByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月全县养殖大户收入/支出/利润/补助合计（万元） */
    HomeScreenEnterpriseFinanceSumDto sumLargeLivestockFarmerFinanceByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年月合作社经营模式分类计数 */
    HomeScreenCoopBusinessModelSumDto countCooperativeBusinessModelByStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    // /** 指定年月农牧户分类计数（各「是」标记记录数） */
    // HomeScreenFarmerHouseholdClassSumDto countFarmerHouseholdClassByStatYearMonth(
    //         @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /**
     * 指定年月各乡镇农牧户补助合计金额（各村 {@code subsidy_total} 之和）。
     */
    List<HomeScreenTownSubsidyItemVo> sumFarmerHouseholdSubsidyTotalByTownStatYearMonth(
            @Param("statYear") int statYear, @Param("statMonth") int statMonth);

    /** 指定年份区间可支配收入（含起止年） */
    List<HomeScreenDisposableIncomeYearDto> selectDisposableIncomeByYearRange(
            @Param("startYear") int startYear, @Param("endYear") int endYear);

    /** 可支配收入填报最大所属年份；无数据返回 null */
    Integer selectLatestDisposableIncomeStatYear();

    /**
     * 牦牛存出栏情况明细：按 {@code (stat_year, stat_month, village_dept_id)} 关联存栏/出栏填报；
     * 按年、月倒序。缺一侧时存栏或出栏计为 0。
     */
    List<HomeScreenYakInventoryOutboundListItemVo> selectYakInventoryOutboundList(
            @Param("statYear") Integer statYear,
            @Param("statMonth") Integer statMonth,
            @Param("townDeptId") Long townDeptId,
            @Param("villageDeptId") Long villageDeptId);

    /**
     * 养殖主体数量明细：村×年月键集 = 农牧户 ∪ 合作社 ∪ 家庭牧场 ∪ 养殖大户。
     * 任一组织形式有数据即可出列，其余为 0。年月未传不过滤，支持跨多年翻页。
     */
    List<HomeScreenBreedingEntityQuantityListItemVo> selectBreedingEntityQuantityList(
            @Param("statYear") Integer statYear,
            @Param("statMonth") Integer statMonth,
            @Param("townDeptId") Long townDeptId,
            @Param("villageDeptId") Long villageDeptId);
}
