package com.hdkj.lt.si.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 静态网架评估算法阈值配置（algorithm_config.static_grid_thresholds）
 * <p>
 * 对应数据契约文档《数据契约样例说明》中 static_grid_thresholds 的 15 个阈值字段。
 * 未配置的字段不传入请求体，由算法服务沿用其默认值。
 * 配置前缀：estimation.static-grid-thresholds（Nacos application-{profile}.yaml 公共配置）
 * 传入后算法侧不使用旧缓存（force_recalculate 已传 true）。
 *
 * @author lsl
 * @since 2026-07-30
 */
@Component
@ConfigurationProperties(prefix = "estimation.static-grid-thresholds")
@Data
public class StaticGridThresholdProp {

    /** 供电半径超标阈值(km)，默认 5 */
    private Double supplyRadiusLimitKm;

    /** 超长馈线阈值(km)，默认 100 */
    private Double extraLongFeederLimitKm;

    /** 主干线合理分段范围下限(段)，默认 3 */
    private Integer mainTrunkSegmentMin;

    /** 主干线合理分段范围上限(段)，默认 6 */
    private Integer mainTrunkSegmentMax;

    /** 主干挂灯笼风险的配变密度(台/段)，默认 5 */
    private Integer mainTrunkLanternTransformersPerSegment;

    /** 联络点过多阈值(个)，默认 3 */
    private Integer maximumTiePointCount;

    /** 联络点首端问题的最大分段数，默认 2 */
    private Integer feederHeadTieSegmentMax;

    /** 大分支低压用户数阈值(户)，默认 2000 */
    private Integer largeBranchLvUserLimit;

    /** 负荷组容量异常阈值(MVA)，默认 4 */
    private Double loadGroupCapacityLimitMva;

    /** 负荷组配变台数异常阈值(台)，默认 20 */
    private Integer loadGroupTransformerLimit;

    /** 配变容量估算负荷系数，默认 0.5 */
    private Double estimatedLoadFactor;

    /** N-1 转供备用裕度(%)，默认 10 */
    private Double nMinus1BackupMarginPercent;

    /** 主干卡脖子负载率阈值(%)，默认 80 */
    private Double mainTrunkBottleneckLoadRatePercent;

    /** 架空线热稳定电流(A)，默认 380 */
    private Double overheadThermalCurrentA;

    /** 电缆热稳定电流(A)，默认 530 */
    private Double cableThermalCurrentA;

    /**
     * 转成 algorithm_config.static_grid_thresholds 结构（null 字段不传，沿用算法默认值）
     */
    public Map<String, Object> toStaticGridThresholdMap() {
        Map<String, Object> map = new HashMap<>();
        putIfNotNull(map, "supply_radius_limit_km", supplyRadiusLimitKm);
        putIfNotNull(map, "extra_long_feeder_limit_km", extraLongFeederLimitKm);
        putIfNotNull(map, "main_trunk_segment_min", mainTrunkSegmentMin);
        putIfNotNull(map, "main_trunk_segment_max", mainTrunkSegmentMax);
        putIfNotNull(map, "main_trunk_lantern_transformers_per_segment", mainTrunkLanternTransformersPerSegment);
        putIfNotNull(map, "maximum_tie_point_count", maximumTiePointCount);
        putIfNotNull(map, "feeder_head_tie_segment_max", feederHeadTieSegmentMax);
        putIfNotNull(map, "large_branch_lv_user_limit", largeBranchLvUserLimit);
        putIfNotNull(map, "load_group_capacity_limit_mva", loadGroupCapacityLimitMva);
        putIfNotNull(map, "load_group_transformer_limit", loadGroupTransformerLimit);
        putIfNotNull(map, "estimated_load_factor", estimatedLoadFactor);
        putIfNotNull(map, "n_minus_1_backup_margin_percent", nMinus1BackupMarginPercent);
        putIfNotNull(map, "main_trunk_bottleneck_load_rate_percent", mainTrunkBottleneckLoadRatePercent);
        putIfNotNull(map, "overhead_thermal_current_a", overheadThermalCurrentA);
        putIfNotNull(map, "cable_thermal_current_a", cableThermalCurrentA);
        return map;
    }

    /**
     * 转成外层 algorithm_config 结构（静态网架只含 static_grid_thresholds）
     */
    public Map<String, Object> toAlgorithmConfigMap() {
        Map<String, Object> config = new HashMap<>();
        config.put("static_grid_thresholds", toStaticGridThresholdMap());
        return config;
    }

    private void putIfNotNull(Map<String, Object> map, String key, Object value) {
        if (value != null) {
            map.put(key, value);
        }
    }
}
