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 query 搜索关键字
     * @return 匹配的耳号列表
     */
    List<String> searchEarNumbers(@Param("query") String query);

    /**
     * 根据管理耳号查询
     *
     * @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();

    /**
     * 获取指定字段的唯一值列表 (配合 XML 中的 selectFieldValues)
     */
    List<String> selectFieldValues(@Param("fieldName") String fieldName);

    /**
     * 核心修复：根据复杂条件查询羊只档案列表
     * 对应 XML 中的 <select id="selectSheepFileListByCondition">
     * 必须使用 @Param 注解以便 XML 能正确识别两个参数
     */
    List<SheepFile> selectSheepFileListByCondition(
            @Param("params") Map<String, Object> params,
            @Param("sheepFile") SheepFile sheepFile
    );

    /**
     * 保留原有 Provider 方法 (若项目其他地方有用到)
     */
    @SelectProvider(type = SheepFileSqlProvider.class, method = "selectByCondition")
    @ResultMap("SheepFileResult")
    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 公羊列表
     */
    List<SheepFile> selectRamList();

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

    /**
     * 新增羊只档案 (对应 XML 中的 insert)
     */
    public int insertSheepFile(SheepFile sheepFile);

    /**
     * 修改羊只档案 (对应 XML 中的 update)
     */
    public int updateSheepFile(SheepFile sheepFile);

    /**
     * 删除羊只档案 (对应 XML 中的 delete)
     */
    public int deleteSheepFileById(Long id);

    /**
     * 批量删除羊只档案 (对应 XML 中的 delete)
     */
    public int deleteSheepFileByIds(Long[] ids);
}