//--------------------------------------------------------------
//	FIR フィルタの係数をファイルから読み込むメソッド ReadFile()
//
//		作成者：三上直樹，2022/12/04 作成，ⓒ三上直樹 2022
//--------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO;

namespace FIRフィルタ_係数読込_正弦波入力_波形
{
	public partial class Form1 : Form
	{
		private bool ReadFile(ref float[] hk)
		{
			if (openFileDialog1.ShowDialog() != DialogResult.OK) return false;

			// Shift-JIS としてファイルを読み込む
			string[] strIn = File.ReadAllLines(openFileDialog1.FileName, Encoding.Default);
			if (!strIn.Any(s => s.Contains("標本化周波数")) ||
				!strIn.Any(s => s.Contains("次数")))
			{
				// UTF-8 としてファイルを読み込む
				strIn = File.ReadAllLines(openFileDialog1.FileName, Encoding.UTF8);
				if (ErrMsg(strIn.Any(s => s.Contains("標本化周波数")) &&
						   strIn.Any(s => s.Contains("次数")), ref hk,
						   "データのフォーマットが違っているか\r\n"+
						   "文字コードがシフトJIS または UTF-8 以外の可能性があります．"))
					return false;
			}

			textBox1.Clear();
			foreach (string s in strIn.Where(s2 => s2.StartsWith("// ")))
				textBox1.AppendText(s.Replace("// ", " ")+"\r\n");

			// 標本化周波数の読み込み
			double fSkHz = -1;
			var strFs = strIn.FirstOrDefault(s => s.Contains("標本化周波数"));
			if (strFs != null)
			{
				var fsText = strFs.Split(' ')
								  .Where(s => (s != "") && !s.Contains("kHz"))
								  .Last();
				if (ErrMsg(double.TryParse(fsText, out fSkHz), ref hk,
						   "標本化周波数に対応する数値が見つかりません．")) return false;
			}

			if (ErrMsg((float)(fSkHz*1000) == FS_, ref hk,
					   "ファイルの標本化周波数は 10 kHz ではありません．")) return false;

			// 次数の読み込み
			int order = -1;
			var strOrder = strIn.FirstOrDefault(s => s.Contains("次数"));
			if (strOrder != null)
			{
				var orderText = strOrder.Split(' ')
										.Where(s => (s != "") && !s.Contains("次"))
										.Last();
				if (ErrMsg(int.TryParse(orderText, out order), ref hk,
						   "次数に対応する数値が見つかりません．")) return false;
			}

			// 係数の存在する行を抽出する
			var strCoefs = strIn.Where(s => !s.Contains("//"));

			List<float> hnList = new List<float>();
			foreach (var s in strCoefs)
			{
				string[] subStr = s.Split(",".ToCharArray(),
										  StringSplitOptions.RemoveEmptyEntries);
				for (int n=0; n<subStr.Length; n++)
				{
					float val;
					if (ErrMsg(float.TryParse(subStr[n].TrimEnd('f'), out val),
							   ref hk, "不正なデータです．")) return false;
					hnList.Add(val);
				}
			}

			Array.Resize(ref hk, order+1);
			hk = hnList.ToArray();

			return true;
		}

		// tf が false の場合，エラーメッセージを表示し，true を返す
		bool ErrMsg(bool tf, ref float[] hk, string str)
		{
			if (!tf)
			{
				MessageBox.Show(str);
				textBox1.Clear();
				Array.Resize(ref hk, 1);
				hk = new float[]{1.0f};
			}
			return !tf;
		}
	}
}
