package com.zhyc.module.base.service.impl;

import com.zhyc.module.base.domain.BreedRamFile;
import com.zhyc.module.base.domain.SheepFile;
import com.zhyc.module.base.mapper.SheepFileMapper;
import com.zhyc.module.base.service.IBreedRamFileService;
import com.zhyc.module.base.service.ISheepFileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;import java.util.Map;

/**
 * 羊只档案Service业务层处理
 * 
 * @author wyt
 * @date 2025-07-13
 */
@Service
public class SheepFileServiceImpl implements ISheepFileService {
    @Autowired
    private SheepFileMapper sheepFileMapper;

    /**
     * 查询羊只档案
     *
     * @param id 羊只档案主键
     * @return 羊只档案
     */
    @Override
    public SheepFile selectSheepFileById(Long id) {
        return sheepFileMapper.selectSheepFileById(id);
    }

    /**
     * 查询羊只档案列表
     *
     * @param sheepFile 羊只档案
     * @return 羊只档案
     */
    @Override
    public List<SheepFile> selectSheepFileList(SheepFile sheepFile) {
        return sheepFileMapper.selectSheepFileList(sheepFile);
    }

    @Override
    public SheepFile selectBasSheepByManageTags(String tags) {
        return sheepFileMapper.selectSheepByManageTags(tags);
    }


    @Override
    public List<Map<String, Object>> countBySheepType() {
        return sheepFileMapper.countBySheepType();
    }

    @Override
    public List<Map<String, Object>> countByBreedStatus() {
        return sheepFileMapper.countByBreedStatus();
    }

    @Override
    public List<Map<String, Object>> countByVariety() {
        return sheepFileMapper.countByVariety();
    }

    @Override
    public List<Map<String, Object>> countParityOfLactation() {
        return sheepFileMapper.countParityOfLactation();
    }
    @Override
    public Long countInGroup() { return sheepFileMapper.countInGroup(); }

    /**
     * 获取指定字段的唯一值列表
     */
    @Override
    public List<String> getFieldValues(String fieldName) {
        // 第一步：安全性验证 - 防止SQL注入攻击
        if (!isValidFieldName(fieldName)) {
            throw new IllegalArgumentException("非法的字段名: " + fieldName + "，请检查字段名是否正确");
        }

        // 第二步：调用新的 Provider 方法
        // 注意：这里调用的是 selectFieldValuesByProvider，不是 selectFieldValues
        return sheepFileMapper.selectFieldValuesByProvider(fieldName);
    }

    @Override
    public List<SheepFile> selectSheepFileListByCondition(Map<String, Object> params, SheepFile sheepFile) {
        // 验证并处理参数
        Map<String, Object> safeConditions = processConditions(params);

        // 调用新的 Provider 方法
        List<SheepFile> result = sheepFileMapper.selectByCondition(sheepFile, safeConditions);


        return result;

    }

    @Override
    public int insertSheepFile(SheepFile sheepFile) {
        return 0;
    }

    @Override
    public int updateSheepFile(SheepFile sheepFile) {
        return 0;
    }

    /**
     * 处理条件参数，确保安全
     */
    private Map<String, Object> processConditions(Map<String, Object> params) {
        if (params == null || params.isEmpty()) {
            return new HashMap<>();
        }

        Map<String, Object> safeParams = new HashMap<>();

        for (Map.Entry<String, Object> entry : params.entrySet()) {
            String fieldName = entry.getKey();
            Object value = entry.getValue();

            // 将前端字段名转换为数据库字段名
            String dbFieldName = convertToDbFieldName(fieldName);

            // 验证字段名是否安全
            if (isValidFieldName(dbFieldName)) {
                // 处理值，确保不是 Character 类型
                Object safeValue = value;
                if (value != null) {
                    String strValue = value.toString();

                    // 特殊处理范围条件：确保数字值的安全性
                    if (strValue.startsWith("GT:") || strValue.startsWith("LT:") ||
                            strValue.startsWith("GE:") || strValue.startsWith("LE:")) {
                        String numPart = strValue.substring(3);
                        // 验证数字部分是否安全（防止 SQL 注入）
                        if (isNumeric(numPart)) {
                            safeValue = strValue;
                        } else {
                            // 如果不是数字，忽略这个条件
                            System.out.println("警告：范围条件的值不是数字: " + fieldName + " = " + strValue);
                            continue;
                        }
                    } else {
                        // 其他值直接使用字符串
                        safeValue = strValue;
                    }
                }
                safeParams.put(dbFieldName, safeValue);
            } else {
                // 记录日志
                System.out.println("警告：忽略非法字段名: " + fieldName + " -> " + dbFieldName);
            }
        }

        return safeParams;
    }

    /**
     * 判断字符串是否为数字
     */
    private boolean isNumeric(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        try {
            Double.parseDouble(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    /**
     * 将前端字段名转换为数据库字段名
     */
    private String convertToDbFieldName(String fieldName) {
        // 将驼峰命名转换为下划线命名
        return fieldName.replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase();
    }


    /**
     * 扩展字段名白名单验证
     */
    private boolean isValidFieldName(String fieldName) {
        // 扩展允许查询的字段白名单
        String[] allowedFields = {
                "id",
                "bs_manage_tags",      // 管理耳号
                "electronic_tags",     // 电子耳号
                "dr_ranch",           // 牧场名称
                "sheepfold_name",     // 羊舍名称
                "variety",            // 品种
                "family",             // 家系
                "name",               // 羊只类型
                "gender",             // 性别
                "birthday",           // 出生日期
                "day_age",            // 日龄
                "month_age",          // 月龄
                "parity",             // 胎次
                "birth_weight",       // 出生体重
                "weaning_date",       // 断奶日期
                "status_id",          // 羊只状态
                "weaning_weight",     // 断奶体重
                "current_weight",     // 当前体重
                "weaning_day_age",    // 断奶日龄
                "weaning_daily_gain", // 断奶日增重
                "breed",              // 繁殖状态
                "father_manage_tags", // 父亲耳号
                "mother_manage_tags", // 母亲耳号
                "receptor_manage_tags", // 受体耳号
                "grandfather_manage_tags", // 祖父耳号
                "grandmother_manage_tags", // 祖母耳号
                "maternal_grandfather_manage_tags", // 外祖父耳号
                "maternal_grandmother_manage_tags", // 外祖母耳号
                "mating_date",        // 配种日期
                "mating_type_id",     // 配种类型
                "preg_date",          // 孕检日期
                "lambing_date",       // 产羔日期
                "lambing_day",        // 产羔时怀孕天数
                "mating_day",         // 配后天数
                "gestation_day",      // 怀孕天数
                "expected_date",      // 预产日期
                "post_lambing_day",   // 产后天数
                "lactation_day",      // 泌乳天数
                "anestrous_day",      // 空怀天数
                "mating_counts",      // 配种次数
                "mating_total",       // 累计配种次数
                "miscarriage_counts", // 累计流产次数
                "comment",            // 备注
                "controlled",         // 是否性控
                "body",               // 体况评分
                "breast",             // 乳房评分
                "source",             // 入群来源
                "source_date",        // 入群日期
                "source_ranch",       // 来源牧场
                "update_by",          // 修改人
                "update_time",        // 修改日期
                "create_by",          // 创建人
                "create_time"         // 创建日期
        };

        for (String allowedField : allowedFields) {
            if (allowedField.equals(fieldName)) {
                return true;
            }
        }

        return false;
    }

    @Autowired
    private IBreedRamFileService breedRamFileService;  // 注入种公羊服务

    /**
     * 新增羊只档案
     */

    /**
     * 同步公羊数据到种公羊档案表
     */
    private void syncToBreedRamFile(SheepFile sheepFile) {
        try {
            // 检查是否已存在
            BreedRamFile existingRam = breedRamFileService.selectBreedRamFileByOrdinaryEarNumber(
                    sheepFile.getBsManageTags()
            );

            if (existingRam != null) {
                // 已存在，更新
                BreedRamFile updateRam = convertToBreedRamFile(sheepFile);
                updateRam.setId(existingRam.getId());
                breedRamFileService.updateBreedRamFile(updateRam);
            } else {
                // 不存在，新增
                BreedRamFile newRam = convertToBreedRamFile(sheepFile);
                breedRamFileService.insertBreedRamFile(newRam);
            }
        } catch (Exception e) {
            // 记录日志，但不影响主流
        }
    }

    /**
     * 将SheepFile转换为BreedRamFile
     */
    private BreedRamFile convertToBreedRamFile(SheepFile sheepFile) {
        BreedRamFile breedRamFile = new BreedRamFile();

        // 基本信息
        breedRamFile.setOrdinaryEarNumber(sheepFile.getBsManageTags());
        breedRamFile.setRanchId(sheepFile.getRanchId());
        breedRamFile.setRanchName(sheepFile.getDrRanch());
        breedRamFile.setSheepfoldId(sheepFile.getSheepfoldId());
        breedRamFile.setSheepfoldName(sheepFile.getSheepfoldName());
        breedRamFile.setElectronicTags(sheepFile.getElectronicTags());
        breedRamFile.setVarietyId(sheepFile.getVarietyId());
        breedRamFile.setVariety(sheepFile.getVariety());
        breedRamFile.setSheepCategory(sheepFile.getName());
        breedRamFile.setBirthday(sheepFile.getBirthday());

        // 体重相关
        breedRamFile.setBirthWeight(BigDecimal.valueOf(sheepFile.getBirthWeight()));
        breedRamFile.setWeaningDate(sheepFile.getWeaningDate());
        breedRamFile.setWeaningDayAge(sheepFile.getWeaningDayAge());
        breedRamFile.setWeaningWeight(BigDecimal.valueOf(sheepFile.getWeaningWeight()));
        breedRamFile.setWeaningDailyGain(BigDecimal.valueOf(sheepFile.getWeaningDailyGain()));
        breedRamFile.setCurrentWeight(BigDecimal.valueOf(sheepFile.getCurrentWeight()));

        // 家系信息
        breedRamFile.setFatherNumber(sheepFile.getFatherManageTags());
        breedRamFile.setMotherNumber(sheepFile.getMotherManageTags());
        breedRamFile.setGrandfatherNumber(sheepFile.getGrandfatherManageTags());
        breedRamFile.setGrandmotherNumber(sheepFile.getGrandmotherManageTags());
        breedRamFile.setMaternalGrandfatherNumber(sheepFile.getMaternalGrandfatherManageTags());
        breedRamFile.setMaternalGrandmotherNumber(sheepFile.getMaternalGrandmotherManageTags());

        // 审计信息
        breedRamFile.setCreateBy(sheepFile.getCreateBy());
        breedRamFile.setCreateTime(sheepFile.getCreateTime());
        breedRamFile.setUpdateBy(sheepFile.getUpdateBy());
        breedRamFile.setUpdateTime(sheepFile.getUpdateTime());
        breedRamFile.setIsDelete(sheepFile.getIsDelete());

        return breedRamFile;
    }

}
