package com.zhyc.module.produce.breed.mapper;

import java.util.Date;
import java.util.List;
import java.util.Map;
import com.zhyc.module.produce.breed.domain.ScBreedRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 配种记录Mapper接口
 *
 * @author ruoyi
 * @date 2025-07-23
 */
@Mapper
public interface ScBreedRecordMapper
{
    /**
     * 查询配种记录
     *
     * @param id 配种记录主键
     * @return 配种记录
     */
    public ScBreedRecord selectScBreedRecordById(Long id);

    /**
     * 查询配种记录列表
     *
     * @param scBreedRecord 配种记录
     * @return 配种记录集合
     */
    public List<ScBreedRecord> selectScBreedRecordList(ScBreedRecord scBreedRecord);

    /**
     * 新增配种记录
     *
     * @param scBreedRecord 配种记录
     * @return 结果
     */
    public int insertScBreedRecord(ScBreedRecord scBreedRecord);

    /**
     * 修改配种记录
     *
     * @param scBreedRecord 配种记录
     * @return 结果
     */
    public int updateScBreedRecord(ScBreedRecord scBreedRecord);

    /**
     * 删除配种记录
     *
     * @param id 配种记录主键
     * @return 结果
     */
    public int deleteScBreedRecordById(Long id);

    /**
     * 批量删除配种记录
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteScBreedRecordByIds(Long[] ids);

    /**
     * 根据管理耳号查询羊只ID
     *
     * @param manageTags 管理耳号
     * @return 羊只ID
     */
    public Long getSheepIdByManageTags(String manageTags);

    /**
     * 根据公羊管理耳号查询羊只ID
     *
     * @param manageTags 管理耳号
     * @return 羊只ID
     */
    public Long getRamIdByManageTags(String manageTags);

    /**
     * 根据耳号查询羊只详细信息
     *
     * @param manageTags 管理耳号
     * @return 羊只信息
     */
    public Map<String, Object> getSheepInfoByTags(String manageTags);

    /**
     * 根据母羊耳号获取配种计划信息
     *
     * @param manageTags 母羊管理耳号
     * @return 配种计划信息
     */
    public Map<String, Object> getBreedPlanByEweTags(String manageTags);

    /**
     * 根据母羊耳号获取最新的配种计划信息（从配种计划生成表）
     *
     * @param manageTags 母羊管理耳号
     * @return 配种计划信息
     */
    public Map<String, Object> getLatestBreedPlanByEweTags(String manageTags);

    /**
     * 根据配种记录ID更新孕检信息
     *
     * @param breedRecordId 配种记录ID
     * @param pregnancyRecordId 孕检记录ID
     * @return 结果
     */
    public int updatePregnancyInfo(@Param("breedRecordId") Long breedRecordId,
                                   @Param("pregnancyRecordId") Long pregnancyRecordId);

    /**
     * 根据羊只ID和配种时间查询配种记录
     *
     * @param sheepId 羊只ID
     * @param matingDateStart 配种开始时间
     * @param matingDateEnd 配种结束时间
     * @return 配种记录集合
     */
    public List<ScBreedRecord> selectBreedRecordByMatingTime(@Param("sheepId") Long sheepId,
                                                             @Param("matingDateStart") String matingDateStart,
                                                             @Param("matingDateEnd") String matingDateEnd);

    /**
     * 增加羊只配种次数并更新配种日期
     *
     * @param sheepId 羊只ID
     * @param matingDate 配种日期
     * @param updateBy 更新人
     * @return 结果
     */
    public int incrementSheepMatingCount(@Param("sheepId") Long sheepId,
                                         @Param("matingDate") Date matingDate,
                                         @Param("updateBy") String updateBy);

    // ====================== ScBreedRecordMapper.java 需要添加 ======================
    /**
     * 统计公羊配种的母羊数（去重）
     * @param ramManageTags 公羊管理耳号
     * @return 配种母羊数
     */
    Long countMatedEwesByRamId(String ramManageTags);

    /**
     * 根据受体（母羊）耳号查询最新的冲胚记录信息
     * 用于胚胎移植时自动填充供体和移胚数
     * @param manageTags 受体母羊耳号
     * @return 冲胚记录Map
     */
    public Map<String, Object> getFlushRecordByEweNo(@Param("manageTags") String manageTags);
}