package com.njcn.gather.tools.comtrade.comparewave.core.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 配置结构体
 * <p>对应C代码：cfg_struct</p>
 * <p>用于电能质量检测的配置参数设置</p>
 * 
 * @author Claude Code
 * @since 1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConfigStruct {
    
    /**
     * 线路配置类型
     * <ul>
     *   <li>0: 星型接线</li>
     *   <li>1: V型接线</li>
     * </ul>
     */
    private int lineConfig;
    
    /**
     * 是否合成IB相
     * <ul>
     *   <li>0: 不合成</li>
     *   <li>1: 合成</li>
     * </ul>
     */
    private int ibAdd;
    
    /**
     * 是否合成线电压谐波
     * <ul>
     *   <li>0: 不合成</li>
     *   <li>1: 合成</li>
     * </ul>
     */
    private int uharmAdd;
    
    /**
     * 谐波分析次数
     * <p>默认值：50次谐波</p>
     */
    private int harmTime;
    
    /**
     * 设置默认配置参数
     * <p>将所有配置项重置为系统默认值</p>
     */
    public void setDefaults() {
        this.lineConfig = LineConfigType.STAR.getValue();    
        this.ibAdd = SynthesisFlag.DISABLED.getValue();          
        this.uharmAdd = SynthesisFlag.DISABLED.getValue();       
        this.harmTime = 50;
    }
    
    /**
     * 获取线路配置类型枚举
     * 
     * @return 线路配置类型
     */
    public LineConfigType getLineConfigType() {
        return LineConfigType.fromValue(this.lineConfig);
    }
    
    /**
     * 设置线路配置类型
     * 
     * @param type 线路配置类型
     */
    public void setLineConfigType(LineConfigType type) {
        this.lineConfig = type.getValue();
    }
    
    /**
     * 获取IB相合成标志
     * 
     * @return 合成标志
     */
    public SynthesisFlag getIbAddFlag() {
        return SynthesisFlag.fromValue(this.ibAdd);
    }
    
    /**
     * 设置IB相合成标志
     * 
     * @param flag 合成标志
     */
    public void setIbAddFlag(SynthesisFlag flag) {
        this.ibAdd = flag.getValue();
    }
    
    /**
     * 获取线电压谐波合成标志
     * 
     * @return 合成标志
     */
    public SynthesisFlag getUharmAddFlag() {
        return SynthesisFlag.fromValue(this.uharmAdd);
    }
    
    /**
     * 设置线电压谐波合成标志
     * 
     * @param flag 合成标志
     */
    public void setUharmAddFlag(SynthesisFlag flag) {
        this.uharmAdd = flag.getValue();
    }
    
    /**
     * 验证配置参数的有效性
     * 
     * @return 配置是否有效
     */
    public boolean isValid() {
        try {
            LineConfigType.fromValue(this.lineConfig);
            SynthesisFlag.fromValue(this.ibAdd);
            SynthesisFlag.fromValue(this.uharmAdd);
            // 谐波次数范围检查
            return this.harmTime > 0 && this.harmTime <= 127;
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
    
    /**
     * 线路配置类型枚举
     */
    public enum LineConfigType {
        /** 星型接线 */
        STAR(0),
        /** V型接线 */
        V_TYPE(1);
        
        private final int value;
        
        LineConfigType(int value) {
            this.value = value;
        }
        
        public int getValue() {
            return value;
        }
        
        public static LineConfigType fromValue(int value) {
            for (LineConfigType type : values()) {
                if (type.value == value) {
                    return type;
                }
            }
            throw new IllegalArgumentException("Invalid line config type: " + value);
        }
    }
    
    /**
     * 合成标志枚举
     */
    public enum SynthesisFlag {
        /** 禁用 */
        DISABLED(0),
        /** 启用 */
        ENABLED(1);
        
        private final int value;
        
        SynthesisFlag(int value) {
            this.value = value;
        }
        
        public int getValue() {
            return value;
        }
        
        public static SynthesisFlag fromValue(int value) {
            for (SynthesisFlag flag : values()) {
                if (flag.value == value) {
                    return flag;
                }
            }
            throw new IllegalArgumentException("Invalid synthesis flag: " + value);
        }
    }
}