package com.zhyc.module.base.mapper;

import com.zhyc.module.base.domain.SheepFile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.SelectProvider;

import java.util.List;
import java.util.Map;

/**
 * 羊只档案Mapper接口
 *
 * @author wyt
 * @date 2025-07-13
 */
@Mapper
public interface SheepFileMapper
{
    /**
     * 查询羊只档案
     *
     * @param id 羊只档案主键
     * @return 羊只档案
     */
    public SheepFile selectSheepFileById(Long id);

    /**
     * 查询羊只档案列表
     *
     * @param sheepFile 羊只档案
     * @return 羊只档案集合
     */
    public List<SheepFile> selectSheepFileList(SheepFile sheepFile);


    /**
     * 根据管理耳号查询
     *
     * @param tags 管理耳号
     * @return 结果
     */
    SheepFile selectSheepByManageTags(String tags);


    // 在群羊只总数
    Long countInGroup();


    // 羊只类别分布（按 name 分组）
    List<Map<String,Object>> countBySheepType();

    // 繁育状态分布（按 breed 分组）
    List<Map<String,Object>> countByBreedStatus();

    // 品种分布（按 variety 分组）
    List<Map<String,Object>> countByVariety();

    // 泌乳羊胎次分布（name = '泌乳羊' 时按 parity 分组）
    List<Map<String,Object>> countParityOfLactation();


    /**
     * 新增方法：获取指定字段的唯一值列表
     *
     * 这个方法用于查询数据库中某个字段的所有不重复的值
     * 主要用于前端筛选条件中的下拉选项数据
     *
     * @param fieldName 字段名（数据库表中的列名）
     * @return 该字段的所有唯一值列表，按字母顺序排序
     *
     * 使用场景示例：
     * - 用户选择"耳号"字段时，返回所有不重复的耳号
     * - 用户选择"品种"字段时，返回所有不重复的品种名称
     */
    List<String> selectFieldValues(String fieldName);

    /**
     * 根据复杂条件查询羊只档案列表
     *
     * @param params 查询参数映射
     * @param sheepFile 原有的查询条件（保持兼容）
     * @return 羊只档案列表
     */
    List<SheepFile> selectSheepFileListByCondition(
            @Param("params") Map<String, Object> params,
            @Param("sheepFile") SheepFile sheepFile
    );

    // 修改：使用 @SelectProvider 并指定 ResultMap
    @SelectProvider(type = SheepFileSqlProvider.class, method = "selectByCondition")
    @ResultMap("SheepFileResult")  // 重要：指定使用 XML 中定义的 ResultMap
    List<SheepFile> selectByCondition(
            @Param("sheepFile") SheepFile sheepFile,
            @Param("conditions") Map<String, Object> conditions
    );

    // 修改：获取字段值的方法
    @SelectProvider(type = SheepFileSqlProvider.class, method = "selectFieldValues")
    List<String> selectFieldValuesByProvider(@Param("fieldName") String fieldName);


    /**
     * 查询所有公羊（gender=2）
     *
     * @return 公羊列表
     */
    /**
     * 查询所有公羊（gender=2）
     * @return 公羊列表
     */
    List<SheepFile> selectRamList();

    /**
     * 根据管理耳号查询羊只
     * @param manageTags 管理耳号
     * @return 羊只信息
     */
    SheepFile selectSheepFileByManageTags(String manageTags);
}
