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

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.TreeSelect;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenCooperativeDevelopmentListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenFamilyRanchListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenFarmerHouseholdListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenImbalanceWarningListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenLargeLivestockFarmerListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenLivestockOwnershipHouseholdListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenPerCapitaIncomeListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenStandardListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenYakHerdInventoryListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenBreedingEntityQuantityListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenYakInventoryOutboundListItemVo;
import com.ruoyi.web.modules.screen.domain.vo.HomeScreenYakOutboundReportListItemVo;
import com.ruoyi.web.modules.screen.service.IHomeScreenService;

/**
 * 大屏 — 首页统计（只读）。
 * <p>
 * 看板聚合产业总览、畜群/牦牛存栏结构、牲畜出栏与自食、企业收支、人均收入等；
 * 已屏蔽惠农补贴、草场类型占比、牦牛出栏月度、牦牛存栏变动。
 *
 * @see IHomeScreenService
 */
@RestController
@RequestMapping("/bigScreen/home")
public class HomeScreenController extends BaseController
{
    @Autowired
    private IHomeScreenService homeScreenService;

    /**
     * 首页看板一屏数据（已屏蔽补贴、草场类型、牦牛出栏月度、存栏变动）。
     *
     * @param statYear 统计年份，如 {@code 2026}；当年截止至服务器当天，历史年截止 12-31
     */
    @GetMapping("/dashboard")
    public AjaxResult dashboard(@RequestParam("statYear") String statYear)
    {
        return success(homeScreenService.loadDashboard(statYear));
    }

    /**
     * 养殖标准列表（分页），按 Tab 分类筛选当年已发布标准。
     *
     * @param category 标准分类枚举名：{@code BREEDING_MGMT|FEEDING|EQUIPMENT|TREATMENT|GROWTH}
     */
    @GetMapping("/standards")
    public TableDataInfo standards(
            @RequestParam("statYear") String statYear,
            @RequestParam("category") String category)
    {
        startPage();
        List<HomeScreenStandardListItemVo> list = homeScreenService.listStandards(statYear, category);
        return getDataTable(list);
    }

    /**
     * 地图标注：所选年份内存栏/出栏表各自最大填报月，按乡镇汇总各村牦牛存栏/出栏。
     *
     * @param statYear 统计年份，如 {@code 2026}
     */
    @GetMapping("/townMapMarkers")
    public AjaxResult townMapMarkers(@RequestParam("statYear") String statYear)
    {
        return success(homeScreenService.loadTownMapMarkers(statYear));
    }

    /**
     * 草畜失衡预警记录明细（分页）；按预警时间倒序。
     * <p>查询条件：所属年份、所属月份、所属乡镇、所属村（均可选）。</p>
     */
    @GetMapping("/grassLivestockImbalanceWarnings")
    public TableDataInfo grassLivestockImbalanceWarnings(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenImbalanceWarningListItemVo> list =
                homeScreenService.listGrassLivestockImbalanceWarnings(
                        statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 人均收入情况明细（分页）；按所属年份倒序。
     * <p>查询条件：所属年份（可选，未传不过滤）。数据源 {@code biz_disposable_income}。</p>
     */
    @GetMapping("/perCapitaIncomes")
    public TableDataInfo perCapitaIncomes(
            @RequestParam(value = "statYear", required = false) Integer statYear)
    {
        startPage();
        List<HomeScreenPerCapitaIncomeListItemVo> list = homeScreenService.listPerCapitaIncomes(statYear);
        return getDataTable(list);
    }

    /**
     * 农牧户数据明细（分页）；按年、月倒序。草场面积数据明细复用本接口。
     * <p>查询条件：所属年份（可选，未传不过滤）、所属月份（可选，未传不过滤）、所属乡镇、所属村。
     * 数据源 {@code biz_farmer_household}，返回全部业务字段（含 {@code pastureContractArea} 等）。</p>
     */
    @GetMapping("/farmerHouseholds")
    public TableDataInfo farmerHouseholds(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenFarmerHouseholdListItemVo> list =
                homeScreenService.listFarmerHouseholds(statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 合作社发展数据明细（分页）；按年、月倒序。
     * <p>查询条件：所属年份（可选，未传不过滤）、所属月份（可选，未传不过滤）、所属乡镇、所属村。
     * 数据源 {@code biz_cooperative_development}。</p>
     */
    @GetMapping("/cooperativeDevelopments")
    public TableDataInfo cooperativeDevelopments(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenCooperativeDevelopmentListItemVo> list =
                homeScreenService.listCooperativeDevelopments(statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 家庭牧场数据明细（分页）；按年、月倒序。
     * <p>查询条件：所属年份（可选，未传不过滤）、所属月份（可选，未传不过滤）、所属乡镇、所属村。
     * 数据源 {@code biz_family_ranch}。</p>
     */
    @GetMapping("/familyRanches")
    public TableDataInfo familyRanches(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenFamilyRanchListItemVo> list =
                homeScreenService.listFamilyRanches(statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 养殖大户数据明细（分页）；按年、月倒序。
     * <p>查询条件：所属年份（可选，未传不过滤）、所属月份（可选，未传不过滤）、所属乡镇、所属村。
     * 数据源 {@code biz_large_livestock_farmer}。</p>
     */
    @GetMapping("/largeLivestockFarmers")
    public TableDataInfo largeLivestockFarmers(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenLargeLivestockFarmerListItemVo> list =
                homeScreenService.listLargeLivestockFarmers(statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 牦牛出栏数据明细（分页）；按年、月倒序。对应牲畜出栏/自食情况明细。
     * <p>查询条件：所属年份（可选，未传不过滤）、所属月份（可选，未传不过滤）、所属乡镇、所属村。
     * 数据源 {@code biz_yak_outbound_report}。</p>
     */
    @GetMapping("/yakOutboundReports")
    public TableDataInfo yakOutboundReports(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenYakOutboundReportListItemVo> list =
                homeScreenService.listYakOutboundReports(statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 牦牛存栏数据明细（分页）；按年、月倒序。对应畜群存栏/牦牛存栏结构明细。
     * <p>查询条件：所属年份（可选，未传不过滤）、所属月份（可选，未传不过滤）、所属乡镇、所属村。
     * 数据源 {@code biz_yak_herd_inventory}。</p>
     */
    @GetMapping("/yakHerdInventories")
    public TableDataInfo yakHerdInventories(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenYakHerdInventoryListItemVo> list =
                homeScreenService.listYakHerdInventories(statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 有无畜户数据明细（分页）；按年、月倒序。
     * <p>查询条件：所属年份（可选，未传不过滤）、所属月份（可选，未传不过滤）、所属乡镇、所属村。
     * 数据源 {@code biz_livestock_ownership_household}。</p>
     */
    @GetMapping("/livestockOwnershipHouseholds")
    public TableDataInfo livestockOwnershipHouseholds(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenLivestockOwnershipHouseholdListItemVo> list =
                homeScreenService.listLivestockOwnershipHouseholds(statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 牦牛存出栏情况明细（分页）；按年、月倒序。
     * <p>按 {@code (stat_year, stat_month, village_dept_id)} 关联
     * {@code biz_yak_herd_inventory} 与 {@code biz_yak_outbound_report}；
     * 返回年份、月份、乡镇、村、牦牛总存栏数、牦牛总出栏数。
     * 所属年/月未传则不过滤，支持跨多年全量翻页。</p>
     */
    @GetMapping("/yakInventoryOutbounds")
    public TableDataInfo yakInventoryOutbounds(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenYakInventoryOutboundListItemVo> list =
                homeScreenService.listYakInventoryOutbounds(statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 养殖主体数量明细（分页）；按年、月倒序。
     * <p>村×年月键集 = 农牧户 ∪ 合作社 ∪ 家庭牧场 ∪ 养殖大户；
     * 任一组织形式有数据即可返回，其余数量为 0。
     * 条件：年/月/乡镇/村均可选；未传年月不过滤以支持跨多年全量翻页（界面默认当前年月）。</p>
     */
    @GetMapping("/breedingEntityQuantities")
    public TableDataInfo breedingEntityQuantities(
            @RequestParam(value = "statYear", required = false) Integer statYear,
            @RequestParam(value = "statMonth", required = false) Integer statMonth,
            @RequestParam(value = "townDeptId", required = false) Long townDeptId,
            @RequestParam(value = "villageDeptId", required = false) Long villageDeptId)
    {
        startPage();
        List<HomeScreenBreedingEntityQuantityListItemVo> list =
                homeScreenService.listBreedingEntityQuantities(statYear, statMonth, townDeptId, villageDeptId);
        return getDataTable(list);
    }

    /**
     * 乡镇列表（全县填报乡镇；不按登录人数据权限收窄）。
     */
    @GetMapping("/townOptions")
    public AjaxResult townOptions()
    {
        return success(homeScreenService.listTownOptions());
    }

    /**
     * 村树结构（县 → 乡镇 → 村；全县口径）。
     */
    @GetMapping("/villageTree")
    public AjaxResult villageTree()
    {
        List<TreeSelect> tree = homeScreenService.listVillageTree();
        return success(tree);
    }
}
