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

import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * COMTRADE文件数据结构
 * 对应C代码中的COMTRADE相关结构
 * @author hongawen
 */
@Data
@NoArgsConstructor
public class ComtradeData {
    
    /**
     * 通道信息
     */
    @Data
    @NoArgsConstructor
    public static class ChannelInfo {
        private int channelNumber;      // 通道号
        private String channelName;     // 通道名称
        private String phaseId;         // 相别标识
        private String unit;            // 单位
        private double a;                // 变换系数a
        private double b;                // 变换系数b
        private double skew;             // 时滞
        private int min;                 // 最小值
        private int max;                 // 最大值
        private double primary;          // 一次值
        private double secondary;        // 二次值
        private char ps;                 // P/S标识
        
        /**
         * 将采样值转换为实际值
         */
        public double convertToReal(int sampleValue) {
            return a * sampleValue + b;
        }
    }
    
    /**
     * CFG配置信息
     */
    @Data
    @NoArgsConstructor
    public static class CfgInfo {
        private String stationName;     // 站名
        private String recordDeviceId;  // 装置ID
        private int revYear;             // 标准版本年份
        private int totalChannels;      // 总通道数
        private int analogChannels;     // 模拟通道数
        private int digitalChannels;    // 数字通道数
        private ChannelInfo[] analogChannelInfos;   // 模拟通道信息
        private ChannelInfo[] digitalChannelInfos;  // 数字通道信息
        private double lineFreq;         // 电网频率
        private int nrates;              // 采样率数量
        private double[] sampleRates;    // 每段采样率数组（对应C代码rate[]）
        private int[] segmentSamples;    // 每段数据点数组（对应C代码fd_data_num[]）
        private double sampleRate;       // 主采样率（兼容性保留）
        private int totalSamples;        // 总采样点数
        private ClockStruct startTime;   // 开始时间
        private ClockStruct triggerTime; // 触发时间
        private String dataFileType;     // 数据文件类型(ASCII/BINARY)
        private double timeMult;         // 时间倍率
    }
    
    /** CFG配置信息 */
    private CfgInfo cfgInfo;

    /** 原始采样数据 */
    private int[][] rawData;

    /** 转换后的实际值数据 */
    private double[][] realData;

    /** 时间戳数组 */
    private long[] timestamps;
    
    /**
     * 初始化
     */
    public void init(int channelCount, int sampleCount) {
        cfgInfo = new CfgInfo();
        rawData = new int[channelCount][sampleCount];
        realData = new double[channelCount][sampleCount];
        timestamps = new long[sampleCount];
    }
    
    /**
     * 转换所有原始数据为实际值
     */
    public void convertAllToReal() {
        if (cfgInfo == null || cfgInfo.getAnalogChannelInfos() == null) {
            return;
        }
        
        for (int ch = 0; ch < cfgInfo.getAnalogChannels(); ch++) {
            ChannelInfo chInfo = cfgInfo.getAnalogChannelInfos()[ch];
            for (int i = 0; i < cfgInfo.getTotalSamples(); i++) {
                realData[ch][i] = chInfo.convertToReal(rawData[ch][i]);
            }
        }
    }
}