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

import java.math.BigDecimal;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.web.modules.industryservice.domain.BizLargeLivestockFarmer;

/**
 * 养殖大户派生字段计算与「是/否」规范化。
 * <p>
 * 派生规则（与交接表一致）：
 * <ul>
 *   <li>年底牲畜存栏小计 = 牛年底存栏 + 羊年底存栏（空按 0）</li>
 *   <li>草场面积小计 = 草畜平衡面积 + 流转经营草地面积（空按 0）</li>
 *   <li>利润 = 收入 − 支出（任一为空则利润为空）</li>
 *   <li>是否草畜平衡户：核定载畜量 ≥ 年底存栏绵羊单位 →「是」，否则「否」；缺一则空</li>
 * </ul>
 * 草畜失衡判定见 {@link #isImbalanced}：核定载畜量 &lt; 年底存栏绵羊单位。
 * </p>
 */
public final class LargeLivestockFarmerDerivedSupport
{
    public static final String YES = "是";

    public static final String NO = "否";

    private LargeLivestockFarmerDerivedSupport()
    {
    }

    /**
     * 就地写入派生字段：stockSubtotal、grasslandAreaSubtotal、profit、isGrassBalanced。
     * 应在数值校验通过后、落库前调用。
     */
    public static void applyDerived(BizLargeLivestockFarmer row)
    {
        if (row == null)
        {
            return;
        }
        row.setStockSubtotal(safeInt(row.getCattleYearEndStock()) + safeInt(row.getSheepYearEndStock()));
        row.setGrasslandAreaSubtotal(safeDec(row.getGrassBalanceArea()).add(safeDec(row.getTransferGrassArea())));
        if (row.getIncome() != null && row.getExpense() != null)
        {
            row.setProfit(row.getIncome().subtract(row.getExpense()));
        }
        else
        {
            row.setProfit(null);
        }
        if (row.getApprovedCarryingCapacity() != null && row.getYearEndStockSheepUnit() != null)
        {
            row.setIsGrassBalanced(
                    row.getApprovedCarryingCapacity().compareTo(row.getYearEndStockSheepUnit()) >= 0 ? YES : NO);
        }
        else
        {
            row.setIsGrassBalanced(null);
        }
    }

    /**
     * 是否草畜失衡（需触发预警）。
     * 两值齐全且核定载畜量 &lt; 年底存栏绵羊单位时返回 true。
     */
    public static boolean isImbalanced(BizLargeLivestockFarmer row)
    {
        if (row == null || row.getApprovedCarryingCapacity() == null || row.getYearEndStockSheepUnit() == null)
        {
            return false;
        }
        return row.getApprovedCarryingCapacity().compareTo(row.getYearEndStockSheepUnit()) < 0;
    }

    /**
     * 将「是/否」规范化；空串视为未填（返回 null）；其它值抛业务异常。
     *
     * @param fieldLabel 用于错误提示，如「是否享受补助」
     */
    public static String normalizeYesNo(String value, String fieldLabel)
    {
        if (StringUtils.isEmpty(value))
        {
            return null;
        }
        String text = value.trim();
        if (YES.equals(text) || NO.equals(text))
        {
            return text;
        }
        throw new ServiceException(fieldLabel + "只能填写「是」或「否」");
    }

    /** 是否为「是」 */
    public static boolean isYes(String value)
    {
        return YES.equals(value);
    }

    private static int safeInt(Integer value)
    {
        return value == null ? 0 : value;
    }

    private static BigDecimal safeDec(BigDecimal value)
    {
        return value == null ? BigDecimal.ZERO : value;
    }
}
