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

import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.web.modules.video.domain.BizLivestockMonitor;

/**
 * 畜牧监控入参校验与字段规范化。
 * <p>
 * 用于手工新增/修改（Controller {@code @Validated} + Service 二次校验）。
 * 第三方同步使用 {@link com.ruoyi.web.modules.video.service.LivestockMonitorSyncTxService} 内独立规则，
 * 避免与开放接口字段长度差异冲突。
 * </p>
 */
public final class LivestockMonitorValidation
{
    private LivestockMonitorValidation()
    {
    }

    /**
     * 保存前 trim 并规范化各字段：空串转 null；{@code videoSource} 转小写。
     */
    public static void trimFieldsForSave(BizLivestockMonitor row)
    {
        if (row == null)
        {
            return;
        }
        if (row.getMonitorId() != null)
        {
            row.setMonitorId(row.getMonitorId().trim());
        }
        if (row.getMonitorName() != null)
        {
            row.setMonitorName(row.getMonitorName().trim());
        }
        if (row.getInstallLocation() != null)
        {
            String loc = row.getInstallLocation().trim();
            row.setInstallLocation(loc.isEmpty() ? null : loc);
        }
        if (row.getEnclosureName() != null)
        {
            String enclosure = row.getEnclosureName().trim();
            row.setEnclosureName(enclosure.isEmpty() ? null : enclosure);
        }
        if (row.getOwnerName() != null)
        {
            String name = row.getOwnerName().trim();
            row.setOwnerName(name.isEmpty() ? null : name);
        }
        if (row.getVideoSource() != null)
        {
            row.setVideoSource(row.getVideoSource().trim().toLowerCase());
        }
    }

    /** 摄像头 ID（第三方 cameraId 字符串形式），必填，最长 32 字符 */
    public static void validateMonitorId(String monitorId)
    {
        if (StringUtils.isEmpty(monitorId))
        {
            throw new ServiceException("请填写摄像头ID");
        }
        if (monitorId.length() > 32)
        {
            throw new ServiceException("摄像头ID不能超过32个字符");
        }
    }

    /** 监控名称，必填，1～10 字符（与产品表单限制一致） */
    public static void validateMonitorName(String monitorName)
    {
        if (StringUtils.isEmpty(monitorName) || monitorName.length() < 1 || monitorName.length() > 10)
        {
            throw new ServiceException("监控名称须为1～10个字符");
        }
    }

    /** 安装位置可选，最长 10 字符 */
    public static void validateInstallLocationIfPresent(String installLocation)
    {
        if (StringUtils.isEmpty(installLocation))
        {
            return;
        }
        if (installLocation.length() > 10)
        {
            throw new ServiceException("安装位置不能超过10个字符");
        }
    }

    /** 圈舍名称可选，最长 64 字符 */
    public static void validateEnclosureNameIfPresent(String enclosureName)
    {
        if (StringUtils.isEmpty(enclosureName))
        {
            return;
        }
        if (enclosureName.length() > 64)
        {
            throw new ServiceException("圈舍名称不能超过64个字符");
        }
    }

    /** 视频来源必填，须为 {@link LivestockMonitorRules} 定义的 wvp/ys7/url */
    public static void validateVideoSource(String videoSource)
    {
        if (StringUtils.isEmpty(videoSource))
        {
            throw new ServiceException("请选择视频来源");
        }
        if (videoSource.length() > 32)
        {
            throw new ServiceException("视频来源不能超过32个字符");
        }
        if (!LivestockMonitorRules.isVideoSourceValid(videoSource))
        {
            throw new ServiceException("视频来源无效，须为 wvp、ys7 或 url");
        }
    }

    /** 主体类型可选，若填写须为 1（养殖主体）或 2（交易市场） */
    public static void validateOwnerTypeIfPresent(Integer ownerType)
    {
        if (ownerType == null)
        {
            return;
        }
        if (!LivestockMonitorRules.isOwnerTypeValid(ownerType))
        {
            throw new ServiceException("所属主体类型无效");
        }
    }

    /**
     * 所属主体成对校验：{@code ownerType} 与 {@code ownerId} 须同时有值或同时为空。
     * 仅填其一视为「信息不完整」。
     */
    public static void normalizeOptionalOwner(BizLivestockMonitor row)
    {
        if (row == null)
        {
            return;
        }
        Integer ownerType = row.getOwnerType();
        Long ownerId = row.getOwnerId();
        boolean hasType = ownerType != null;
        boolean hasId = ownerId != null;
        if (!hasType && !hasId)
        {
            row.setOwnerName(null);
            return;
        }
        if (hasType != hasId)
        {
            throw new ServiceException("所属主体信息不完整");
        }
        validateOwnerTypeIfPresent(ownerType);
    }

    /** 是否已填写完整主体（type + id 均有值） */
    public static boolean hasOwner(BizLivestockMonitor row)
    {
        return row != null && row.getOwnerType() != null && row.getOwnerId() != null;
    }

    /** 手工保存完整校验入口：trim → 各字段规则 → 可选主体规范化 */
    public static void validateRowForSave(BizLivestockMonitor row)
    {
        trimFieldsForSave(row);
        validateMonitorId(row.getMonitorId());
        validateMonitorName(row.getMonitorName());
        validateVideoSource(row.getVideoSource());
        normalizeOptionalOwner(row);
        validateInstallLocationIfPresent(row.getInstallLocation());
        validateEnclosureNameIfPresent(row.getEnclosureName());
    }
}
