using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;

namespace DTXMania
{
	[Serializable]
	internal class Cスコア
	{
		// プロパティ

		public STScoreIni情報 ScoreIni情報;
		[Serializable]
		[StructLayout(LayoutKind.Sequential)]
		public struct STScoreIni情報
		{
			public DateTime 最終更新日時;
			public long ファイルサイズ;

			public STScoreIni情報(DateTime 最終更新日時, long ファイルサイズ)
			{
				this.最終更新日時 = 最終更新日時;
				this.ファイルサイズ = ファイルサイズ;
			}
		}

		public STファイル情報 ファイル情報;
		[Serializable]
		[StructLayout(LayoutKind.Sequential)]
		public struct STファイル情報
		{
			public string ファイルの絶対パス;
			public string フォルダの絶対パス;
			public DateTime 最終更新日時;
			public long ファイルサイズ;

			public STファイル情報(string ファイルの絶対パス, string フォルダの絶対パス, DateTime 最終更新日時, long ファイルサイズ)
			{
				this.ファイルの絶対パス = ファイルの絶対パス;
				this.フォルダの絶対パス = フォルダの絶対パス;
				this.最終更新日時 = 最終更新日時;
				this.ファイルサイズ = ファイルサイズ;
			}
		}

		public ST譜面情報 譜面情報;
		[Serializable]
		[StructLayout(LayoutKind.Sequential)]
		public struct ST譜面情報
		{
			public string タイトル;
			public string アーティスト名;
			public string コメント;
			public string ジャンル;
			public string Preimage;
			public string Premovie;
			public string Presound;
			public string Backgound;
			public STDGBSValue<int> レベル;
			public STDGBSValue<CScoreIni.ERANK> 最大ランク;
			public STDGBSValue<double> 最大スキル;
			public STDGBSValue<bool> フルコンボ;
			public STDGBSValue<int> 演奏回数;
			public STDGBSValue<EUseLanes> 使用レーン数;
			public STHISTORY 演奏履歴;
			public bool レベルを非表示にする;
			public EDTX種別 曲種別;
			public double Bpm;
			public int Duration;

			[Serializable]
			[StructLayout(LayoutKind.Sequential)]
			public struct STHISTORY
			{
				public string 行1;
				public string 行2;
				public string 行3;
				public string 行4;
				public string 行5;
				public string this[int index]
				{
					get
					{
						switch (index)
						{
							case 0:
								return this.行1;

							case 1:
								return this.行2;

							case 2:
								return this.行3;

							case 3:
								return this.行4;

							case 4:
								return this.行5;
						}
						throw new IndexOutOfRangeException();
					}
					set
					{
						switch (index)
						{
							case 0:
								this.行1 = value;
								return;

							case 1:
								this.行2 = value;
								return;

							case 2:
								this.行3 = value;
								return;

							case 3:
								this.行4 = value;
								return;

							case 4:
								this.行5 = value;
								return;
						}
						throw new IndexOutOfRangeException();
					}
				}
			}
		}

		public bool bSongDBにキャッシュがあった;
		public bool bスコアが有効である
		{
			get
			{
				return
					this.譜面情報.レベル.Drums +
					this.譜面情報.レベル.Guitar +
					this.譜面情報.レベル.Bass != 0;
			}
		}


		// コンストラクタ

		public Cスコア()
		{
			this.ScoreIni情報 = new STScoreIni情報(DateTime.MinValue, 0L);
			this.bSongDBにキャッシュがあった = false;
			this.ファイル情報 = new STファイル情報("", "", DateTime.MinValue, 0L);
			this.譜面情報 = new ST譜面情報();
			this.譜面情報.タイトル = "";
			this.譜面情報.アーティスト名 = "";
			this.譜面情報.コメント = "";
			this.譜面情報.ジャンル = "";
			this.譜面情報.Preimage = "";
			this.譜面情報.Premovie = "";
			this.譜面情報.Presound = "";
			this.譜面情報.Backgound = "";
			this.譜面情報.レベル = new STDGBSValue<int>();
			this.譜面情報.最大ランク = new STDGBSValue<CScoreIni.ERANK>();
			this.譜面情報.最大ランク.Drums = CScoreIni.ERANK.UNKNOWN;
			this.譜面情報.最大ランク.Guitar = CScoreIni.ERANK.UNKNOWN;
			this.譜面情報.最大ランク.Bass = CScoreIni.ERANK.UNKNOWN;
			this.譜面情報.フルコンボ = new STDGBSValue<bool>();
			this.譜面情報.演奏回数 = new STDGBSValue<int>();
			this.譜面情報.演奏履歴 = new ST譜面情報.STHISTORY();
			this.譜面情報.演奏履歴.行1 = "";
			this.譜面情報.演奏履歴.行2 = "";
			this.譜面情報.演奏履歴.行3 = "";
			this.譜面情報.演奏履歴.行4 = "";
			this.譜面情報.演奏履歴.行5 = "";
			this.譜面情報.レベルを非表示にする = false;
			this.譜面情報.最大スキル = new STDGBSValue<double>();
			this.譜面情報.曲種別 = EDTX種別.DTX;
			this.譜面情報.Bpm = 120.0;
			this.譜面情報.Duration = 0;
			this.譜面情報.使用レーン数 = new STDGBSValue<EUseLanes>();
		}
	}
}
