package com.ruoyi.web.modules.industryservice.support;

import java.util.Calendar;
import java.util.Date;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;

/**
 * 牦牛资产档案查询与同步入参校验、月龄计算。
 */
public final class YakAssetValidation
{
    private YakAssetValidation()
    {
    }

    /** 列表 keyword 去首尾空白，空串转 null */
    public static String trimKeyword(String keyword)
    {
        if (keyword == null)
        {
            return null;
        }
        String t = keyword.trim();
        return t.isEmpty() ? null : t;
    }

    /**
     * 列表资产状态筛选：null 表示不过滤；有值时须为 1～4。
     *
     * @see YakAssetRules#ASSET_STATUS_MIN
     * @see YakAssetRules#ASSET_STATUS_MAX
     */
    public static void validateAssetStatus(Integer assetStatus)
    {
        if (assetStatus == null)
        {
            return;
        }
        if (assetStatus < YakAssetRules.ASSET_STATUS_MIN || assetStatus > YakAssetRules.ASSET_STATUS_MAX)
        {
            throw new ServiceException("资产状态须为1～4");
        }
    }

    /** 生理曲线天数：1～366，null 由调用方按默认值处理 */
    public static void validatePhysioDays(Integer days)
    {
        if (days == null)
        {
            return;
        }
        if (days < 1 || days > 366)
        {
            throw new ServiceException("生理曲线天数须为1～366");
        }
    }

    /** 生长曲线指标枚举校验 */
    public static void validateGrowthMetric(String metric)
    {
        if (StringUtils.isEmpty(metric))
        {
            return;
        }
        String m = metric.trim().toLowerCase();
        if (!YakAssetRules.METRIC_WEIGHT.equals(m)
                && !YakAssetRules.METRIC_HEIGHT.equals(m)
                && !YakAssetRules.METRIC_CHEST.equals(m)
                && !YakAssetRules.METRIC_LENGTH.equals(m))
        {
            throw new ServiceException("生长曲线指标须为 weight/height/chest/length");
        }
    }

    /** 入栏同步时牦牛编号非空且长度 ≤ 64 */
    public static void validateYakNoForSync(String yakNo)
    {
        if (StringUtils.isEmpty(yakNo))
        {
            throw new ServiceException("牦牛编号不能为空");
        }
        if (yakNo.trim().length() > 64)
        {
            throw new ServiceException("牦牛编号长度不能超过64");
        }
    }

    /**
     * 由出生日期计算整月龄（不足 1 月记 0）。
     * <p>
     * 入栏同步写入 {@code age_months}；养殖产业看板在字段为空时可用同算法按统计日回退。
     * </p>
     *
     * @param birthDate 出生日期
     * @param asOf      截止日（同步时间或统计日）
     */
    public static int resolveAgeMonths(Date birthDate, Date asOf)
    {
        if (birthDate == null || asOf == null)
        {
            return 0;
        }
        Calendar birth = Calendar.getInstance();
        birth.setTime(birthDate);
        Calendar end = Calendar.getInstance();
        end.setTime(asOf);
        int months = (end.get(Calendar.YEAR) - birth.get(Calendar.YEAR)) * 12
                + (end.get(Calendar.MONTH) - birth.get(Calendar.MONTH));
        if (end.get(Calendar.DAY_OF_MONTH) < birth.get(Calendar.DAY_OF_MONTH))
        {
            months--;
        }
        return Math.max(months, 0);
    }
}
