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

import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.web.modules.diagnosis.domain.BizConsultSession;

/**
 * AI 诊断参数校验。
 */
public final class AiConsultValidation
{
    private AiConsultValidation()
    {
    }

    public static void validateListQuery(BizConsultSession query, Boolean searchMode)
    {
        if (Boolean.TRUE.equals(searchMode))
        {
            String keyword = query != null ? StringUtils.trim(query.getContentKeyword()) : null;
            if (StringUtils.isEmpty(keyword))
            {
                throw new ServiceException("请输入筛选条件");
            }
        }
    }

    /**
     * AI 提问分类（可为空）；非空时长度不超过 32，且须为 1～4 或对应文案编码。
     */
    public static void validateAiCategory(String aiCategory)
    {
        if (StringUtils.isEmpty(aiCategory))
        {
            return;
        }
        String trimmed = aiCategory.trim();
        if (trimmed.length() > 32)
        {
            throw new ServiceException("AI提问分类长度不能超过32个字符");
        }
        if (trimmed.matches("^\\d+$"))
        {
            int code = Integer.parseInt(trimmed);
            if (code < AiConsultConstants.CATEGORY_BREEDING
                    || code > AiConsultConstants.CATEGORY_EQUIPMENT)
            {
                throw new ServiceException("AI提问分类无效");
            }
        }
    }

    public static String normalizeAiCategory(String aiCategory)
    {
        if (StringUtils.isEmpty(aiCategory))
        {
            return null;
        }
        String trimmed = aiCategory.trim();
        return trimmed.isEmpty() ? null : trimmed;
    }

    /**
     * 大模型耗时（毫秒，可为空）；非空时须为非负且不超过 24 小时。
     */
    public static void validateCostTime(Long costTime)
    {
        if (costTime == null)
        {
            return;
        }
        if (costTime < 0L || costTime > 86_400_000L)
        {
            throw new ServiceException("对话耗时无效");
        }
    }

    public static Long normalizeCostTime(Long costTime)
    {
        return costTime == null || costTime < 0L ? null : costTime;
    }
}
