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

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.web.modules.industryservice.domain.BizFarmEnclosure;
import com.ruoyi.web.modules.industryservice.domain.BizPasture;
import com.ruoyi.web.modules.industryservice.domain.BizYakAsset;
import com.ruoyi.web.modules.industryservice.mapper.BizFarmEnclosureMapper;
import com.ruoyi.web.modules.industryservice.mapper.BizPastureMapper;
import com.ruoyi.web.modules.industryservice.mapper.BizYakAssetMapper;

/**
 * 养殖基础数据同步共用工具。
 * <p>
 * 提供第三方时间解析、本地关联 ID 解析等，供各 {@code *SyncTxService} 使用。
 * </p>
 */
public final class FarmingSyncSupport
{
    /** 写入各 biz_* 表的 data_source 字段 */
    public static final String DATA_SOURCE_THIRD_PARTY = "third_party";

    /** 同步操作人标识，写入 create_by / update_by */
    public static final String SYNC_BY = "sync";

    private static final SimpleDateFormat THIRD_PARTY_TIME = createThirdPartyTimeFormat();

    private static final SimpleDateFormat THIRD_PARTY_DATE = createThirdPartyDateFormat();

    private FarmingSyncSupport()
    {
    }

    /**
     * 解析第三方时间字符串，支持 {@code yyyy-MM-dd HH:mm:ss} 与 {@code yyyy-MM-dd}。
     *
     * @param value    原始字符串
     * @param fallback 解析失败或为空时的默认值
     */
    public static Date parseThirdPartyTime(String value, Date fallback)
    {
        if (StringUtils.isEmpty(value))
        {
            return fallback;
        }
        String text = value.trim();
        try
        {
            synchronized (THIRD_PARTY_TIME)
            {
                if (text.length() > 10)
                {
                    return THIRD_PARTY_TIME.parse(text);
                }
            }
            synchronized (THIRD_PARTY_DATE)
            {
                return THIRD_PARTY_DATE.parse(text);
            }
        }
        catch (ParseException e)
        {
            return fallback;
        }
    }

    /**
     * 根据第三方 farmId 解析本地养殖场主键。
     *
     * @return {@code biz_pasture.id}，未同步则 null
     */
    public static Long resolvePastureId(BizPastureMapper pastureMapper, Long farmExternalId)
    {
        if (farmExternalId == null || pastureMapper == null)
        {
            return null;
        }
        BizPasture pasture = pastureMapper.selectBizPastureByExternalId(farmExternalId);
        return pasture != null ? pasture.getId() : null;
    }

    /**
     * 根据第三方圈舍 id 解析本地圈舍主键。
     *
     * @return {@code biz_farm_enclosure.id}，未同步则 null
     */
    public static Long resolveEnclosureId(BizFarmEnclosureMapper enclosureMapper, Long enclosureExternalId)
    {
        if (enclosureExternalId == null || enclosureMapper == null)
        {
            return null;
        }
        BizFarmEnclosure enclosure = enclosureMapper.selectBizFarmEnclosureByExternalId(enclosureExternalId);
        return enclosure != null ? enclosure.getId() : null;
    }

    /**
     * 解析本地牦牛资产主键，供 IoT 数据关联。
     * <p>
     * 优先按第三方 {@code cattleId} 匹配 {@code biz_yak_asset.external_id}；
     * 其次按 {@code earTagNumber} 匹配 {@code ear_tag_number}；
     * 再次按 {@code cattleNo} 匹配 {@code yak_no}。
     * </p>
     *
     * @return {@code biz_yak_asset.id}，未匹配则 null
     */
    public static Long resolveYakAssetId(BizYakAssetMapper yakAssetMapper, Long cattleExternalId,
            String earTagNumber, String cattleNo)
    {
        if (yakAssetMapper == null)
        {
            return null;
        }
        if (cattleExternalId != null)
        {
            BizYakAsset byExternal = yakAssetMapper.selectBizYakAssetByExternalId(cattleExternalId);
            if (byExternal != null)
            {
                return byExternal.getId();
            }
        }
        if (StringUtils.isNotEmpty(earTagNumber))
        {
            BizYakAsset byEarTag = yakAssetMapper.selectBizYakAssetByEarTagNumber(earTagNumber.trim());
            if (byEarTag != null)
            {
                return byEarTag.getId();
            }
        }
        if (StringUtils.isNotEmpty(cattleNo))
        {
            BizYakAsset byYakNo = yakAssetMapper.selectBizYakAssetByYakNo(cattleNo.trim());
            return byYakNo != null ? byYakNo.getId() : null;
        }
        return null;
    }

    /**
     * 解析第三方数值字符串为 {@link BigDecimal}。
     */
    public static BigDecimal parseDecimal(String value)
    {
        if (StringUtils.isEmpty(value))
        {
            return null;
        }
        try
        {
            return new BigDecimal(value.trim());
        }
        catch (NumberFormatException e)
        {
            return null;
        }
    }

    /**
     * 解析第三方 Double 为 {@link BigDecimal}。
     */
    public static BigDecimal toDecimal(Double value)
    {
        return value != null ? BigDecimal.valueOf(value) : null;
    }

    /** 返回第一个非空字符串（trim 后） */
    public static String firstNonBlank(String... values)
    {
        if (values == null)
        {
            return null;
        }
        for (String value : values)
        {
            if (StringUtils.isNotEmpty(value))
            {
                return value.trim();
            }
        }
        return null;
    }

    private static SimpleDateFormat createThirdPartyTimeFormat()
    {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        df.setLenient(false);
        return df;
    }

    private static SimpleDateFormat createThirdPartyDateFormat()
    {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        df.setLenient(false);
        return df;
    }
}
