package com.njcn.gather.tool.adddata.component;

import com.njcn.gather.tool.adddata.pojo.vo.AddDataTemplateVO;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 前端展示模板注册器。
 */
@Component
public class AddDataTemplateRegistry {

    /** 模板列表。 */
    private final List<AddDataTemplateVO> templates;

    public AddDataTemplateRegistry() {
        List<AddDataTemplateVO> result = new ArrayList<AddDataTemplateVO>();
        result.add(createTemplate("电压有效值", "data_v", "ABC", Arrays.asList("A", "B", "C"),
                "RMS_MAX", "RMS_MIN", "主值字段 RMS", "RMS_CP95"));
        result.add(createTemplate("线电压有效值", "data_v", "T", Arrays.asList("T"),
                "RMSAB/RMSBC/RMSCA 对应 MAX 字段", "RMSAB/RMSBC/RMSCA 对应 MIN 字段", "主值字段 RMSAB/RMSBC/RMSCA", "RMSAB/RMSBC/RMSCA 对应 CP95 字段"));
        result.add(createTemplate("频率", "data_v", "T", Arrays.asList("T"),
                "FREQ_MAX", "FREQ_MIN", "主值字段 FREQ", "FREQ_CP95"));
        result.add(createTemplate("电压总谐波畸变率", "data_v", "ABC", Arrays.asList("A", "B", "C"),
                "V_THD_MAX", "V_THD_MIN", "主值字段 V_THD", "V_THD_CP95"));
        result.add(createTemplate("电流有效值", "data_i", "ABC", Arrays.asList("A", "B", "C"),
                "RMS_MAX", "RMS_MIN", "主值字段 RMS", "RMS_CP95"));
        result.add(createTemplate("电流总谐波畸变率", "data_i", "ABC", Arrays.asList("A", "B", "C"),
                "I_THD_MAX", "I_THD_MIN", "主值字段 I_THD", "I_THD_CP95"));
        result.add(createTemplate("电压谐波幅值", "data_harmphasic_v", "ABC", Arrays.asList("A", "B", "C"),
                "各次 V_n_MAX", "各次 V_n_MIN", "主值字段 V_n", "各次 V_n_CP95"));
        result.add(createTemplate("电流谐波幅值", "data_harmphasic_i", "ABC", Arrays.asList("A", "B", "C"),
                "各次 I_n_MAX", "各次 I_n_MIN", "主值字段 I_n", "各次 I_n_CP95"));
        result.add(createTemplate("电压谐波含有率", "data_harmrate_v", "ABC", Arrays.asList("A", "B", "C"),
                "各次 V_n_MAX", "各次 V_n_MIN", "主值字段 V_n", "各次 V_n_CP95"));
        result.add(createTemplate("电流谐波含有率", "data_harmrate_i", "ABC", Arrays.asList("A", "B", "C"),
                "各次 I_n_MAX", "各次 I_n_MIN", "主值字段 I_n", "各次 I_n_CP95"));
        result.add(createTemplate("间谐波电流", "data_inharm_i", "ABC", Arrays.asList("A", "B", "C"),
                "各次 I_n_MAX", "各次 I_n_MIN", "主值字段 I_n", "各次 I_n_CP95"));
        result.add(createTemplate("有功谐波功率", "data_harmpower_p", "ABC", Arrays.asList("A", "B", "C"),
                "P_MAX 与各次 P_n_MAX", "P_MIN 与各次 P_n_MIN", "主值字段 P / P_n", "P_CP95 与各次 P_n_CP95"));
        result.add(createTemplate("无功谐波功率", "data_harmpower_q", "ABC", Arrays.asList("A", "B", "C"),
                "Q_MAX 与各次 Q_n_MAX", "Q_MIN 与各次 Q_n_MIN", "主值字段 Q / Q_n", "Q_CP95 与各次 Q_n_CP95"));
        result.add(createTemplate("视在谐波功率", "data_harmpower_s", "ABC", Arrays.asList("A", "B", "C"),
                "S_MAX 与各次 S_n_MAX", "S_MIN 与各次 S_n_MIN", "主值字段 S / S_n", "S_CP95 与各次 S_n_CP95"));
        result.add(createTemplate("电压波动", "data_fluc", "T", Arrays.asList("T"),
                "当前表无独立最大值字段", "当前表无独立最小值字段", "主值字段 FLUC", "当前表无独立 CP95 字段"));
        result.add(createTemplate("短时闪变", "data_flicker", "T", Arrays.asList("T"),
                "当前表无独立最大值字段", "当前表无独立最小值字段", "主值字段 PST", "当前表无独立 CP95 字段"));
        result.add(createTemplate("长时闪变", "data_plt", "T", Arrays.asList("T"),
                "当前表无独立最大值字段", "当前表无独立最小值字段", "主值字段 PLT", "当前表无独立 CP95 字段"));
        templates = Collections.unmodifiableList(result);
    }

    /**
     * 返回模板列表。
     *
     * @return 模板列表
     */
    public List<AddDataTemplateVO> getTemplates() {
        return templates;
    }

    /**
     * 创建模板对象。
     *
     * @param parameterName 参数名称
     * @param tableName 表名
     * @param phaseDisplay 展示相别
     * @param phaseCodes 落库相别
     * @param maxRule 最大值规则
     * @param minRule 最小值规则
     * @param averageRule 平均值规则
     * @param cp95Rule cp95 规则
     * @return 模板对象
     */
    private AddDataTemplateVO createTemplate(String parameterName, String tableName, String phaseDisplay, List<String> phaseCodes,
                                             String maxRule, String minRule, String averageRule, String cp95Rule) {
        AddDataTemplateVO template = new AddDataTemplateVO();
        template.setParameterName(parameterName);
        template.setTableName(tableName);
        template.setPhaseDisplay(phaseDisplay);
        template.setPhaseCodes(new ArrayList<String>(phaseCodes));
        template.setDisplay(true);
        template.setShowQualified(true);
        template.setMaxValueRule(maxRule);
        template.setMinValueRule(minRule);
        template.setAverageValueRule(averageRule);
        template.setCp95ValueRule(cp95Rule);
        template.setDecimalScale(2);
        return template;
    }
}
