using System;
using System.Globalization;
using System.IO;
namespace Ips.Library.Signals
{
    /// 
    /// 信号文件
    /// 
    public class SignalFile
    {
        public const string SigTimeFolderFormat = "yyyyMMdd_HH";
        public const string SigTimeFileFormat = "yyyyMMddHHmmss";
        public const string SigFreqFormat = "#######0.000###";
        public const string BandWidthFormat = "######0.###";
        /// 
        /// 信号文件实体类
        /// 
        public SignalFile()
        {
        }
        /// 
        /// 采集文件http下载地址(HttpGet)
        /// 
        public string DownloadUrl { get; set; }
        /// 
        /// 信号时间
        /// 
        public DateTime SigTime { get; set; }
        /// 
        /// 信号频点
        /// 
        public long SigFreq { get; set; }
        /// 
        /// 信号带宽
        /// 
        public int BandWidth { get; set; }
        /// 
        /// 采样率
        /// 
        public int Fs { get; set; }
        /// 
        /// 接收站编码
        /// 
        public string SiteCode { get; set; }
        /// 
        /// 采集卡编码
        /// 
        public string AdcCode { get; set; }
        /// 
        /// 采集通道编号
        /// 
        public int ChNum { get; set; }
        /// 
        /// 卫星编号
        /// 
        public string SatNum { get; set; }
        /// 
        /// 目录名称
        /// 
        public string DirectoryName => SigTime.ToString(SigTimeFolderFormat);
        /// 
        /// 文件名称
        /// 
        public string FileName => GetFileName(SigTime, SigFreq, BandWidth, Fs, SiteCode, AdcCode, ChNum, SatNum);
        /// 
        /// 获取文件全路径
        /// 
        public string GetLocalFullName(string dataRoot)
        {
            string fullName = Path.Combine(dataRoot, DirectoryName, FileName);
            return fullName;
        }
        /// 
        /// 将文件名转换为信号文件对象
        /// 
        /// 
        /// 
        public static SignalFile Parse(string input)
        {
            if (string.IsNullOrWhiteSpace(input)) return null;
            input = Path.GetFileNameWithoutExtension(input);
            var items = input.Split('_');
            var result = new SignalFile();
            DateTime sigTime;
            if (DateTime.TryParseExact(items[0], SigTimeFileFormat, CultureInfo.CurrentUICulture, DateTimeStyles.None, out sigTime))
            {
                result.SigTime = sigTime;
            }
            foreach (var item in items)
            {
                var key = item[0];
                var val = item.Substring(1);
                switch (key)
                {
                    case 'F':
                        result.SigFreq = double.TryParse(val, out double sigFreq) ? (long)Math.Round(sigFreq * 1e6, 0) : 0L;
                        break;
                    case 'W':
                        result.BandWidth = double.TryParse(val, out double bandWidth) ? (int)Math.Round(bandWidth * 1e3) : 0;
                        break;
                    case 'C':
                        result.Fs = int.TryParse(val, out int fs) ? fs : 0;
                        break;
                    case 'R':
                        result.SiteCode = val;
                        break;
                    case 'K':
                        result.AdcCode = val;
                        break;
                    case 'T':
                        result.ChNum = int.TryParse(val, out int chNum) ? chNum : 0;
                        break;
                    case 'S':
                        result.SatNum = val;
                        break;
                }
            }
            return result;
        }
        /// 
        /// 获取文件名称
        /// 
        /// 信号时间
        /// 信号频点
        /// 信号带宽
        /// 采样率
        /// 卫星编号
        /// 站点编码
        /// 采集卡编码
        /// 通道号
        /// 值为空时的替换符
        /// 
        public static string GetFileName(DateTime? sigTime, long? sigFreq, int? bandWidth, int? fs, string siteCode, string adcCode, int? chNum, string satNum, string nullText = "")
        {
            string sigTimeText = sigTime.HasValue ? sigTime.Value.ToString(SigTimeFileFormat) : nullText;
            string sigFreqText = sigFreq.HasValue && sigFreq > 0 ? "_F" + Math.Round(sigFreq.Value * 1e-6, 6).ToString(SigFreqFormat) : nullText;
            string bandWidthText = bandWidth.HasValue && bandWidth > 0 ? "_W" + Math.Round(bandWidth.Value * 1e-3, 3).ToString(BandWidthFormat) : nullText;
            string fsText = fs.HasValue && fs > 0 ? "_C" + fs.Value.ToString() : nullText;
            string siteCodeText = !string.IsNullOrWhiteSpace(siteCode) ? "_R" + siteCode.Trim() : nullText;
            string adcCodeText = !string.IsNullOrWhiteSpace(adcCode) ? "_K" + adcCode.Trim() : nullText;
            string chNumText = chNum.HasValue && chNum > 0 ? $"_T{chNum}" : nullText;
            string satNumText = !string.IsNullOrWhiteSpace(satNum) ? "_S" + satNum.Trim() : nullText;
            return string.Concat(sigTimeText, sigFreqText, bandWidthText, fsText, siteCodeText, adcCodeText, chNumText, satNumText, ".dat");
        }
        /// 
        /// 创建信号文件基础信息
        /// 
        /// 信号时间
        /// 信号频点
        /// 信号带宽
        /// 采样率(个)
        /// 卫星编号
        /// 站点编码
        /// 采集卡编码
        /// 通道号
        /// 
        public static SignalFile Create(DateTime sigTime, long sigFreq, int bandWidth, int fs, string siteCode, string adcCode, int chNum, string satNum)
        {
            var result = new SignalFile()
            {
                SigTime = sigTime,
                SigFreq = sigFreq,
                BandWidth = bandWidth,
                Fs = fs,
                SiteCode = siteCode,
                AdcCode = adcCode,
                ChNum = chNum,
                SatNum = satNum
            };
            return result;
        }
    }
}