using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace MyNes.Core
{
    public abstract class ISettings
    {
    	protected string filePath;

    	protected FieldInfo[] Fields;

    	public ISettings(string filePath)
    	{
    		this.filePath = filePath;
    	}

    	public virtual void LoadSettings()
    	{
    		Fields = GetType().GetFields();
    		if (!File.Exists(filePath))
    		{
    			return;
    		}
    		string[] array = File.ReadAllLines(filePath);
    		for (int i = 0; i < array.Length; i++)
    		{
    			string[] array2 = array[i].Split('=');
    			if (array2 != null && array2.Length == 2)
    			{
    				SetField(array2[0], array2[1]);
    			}
    		}
    	}

    	public virtual void SaveSettings()
    	{
    		Fields = GetType().GetFields();
    		List<string> list = new List<string>();
    		FieldInfo[] fields = Fields;
    		foreach (FieldInfo fieldInfo in fields)
    		{
    			if (fieldInfo.IsPublic)
    			{
    				list.Add(fieldInfo.Name + "=" + GetFieldValue(fieldInfo));
    			}
    		}
    		File.WriteAllLines(filePath, list.ToArray());
    	}

    	protected virtual void SetField(string fieldName, string val)
    	{
    		for (int i = 0; i < Fields.Length; i++)
    		{
    			if (!(Fields[i].Name == fieldName))
    			{
    				continue;
    			}
    			if (Fields[i].FieldType == typeof(string))
    			{
    				Fields[i].SetValue(this, val);
    			}
    			else if (Fields[i].FieldType == typeof(bool))
    			{
    				Fields[i].SetValue(this, val == "1");
    			}
    			else if (Fields[i].FieldType == typeof(int))
    			{
    				int result = 0;
    				if (int.TryParse(val, out result))
    				{
    					Fields[i].SetValue(this, result);
    				}
    			}
    			else if (Fields[i].FieldType == typeof(float))
    			{
    				float result2 = 0f;
    				if (float.TryParse(val, out result2))
    				{
    					Fields[i].SetValue(this, result2);
    				}
    			}
    			else if (Fields[i].FieldType == typeof(string[]))
    			{
    				string[] value = val.Split(new string[1] { "*" }, StringSplitOptions.RemoveEmptyEntries);
    				Fields[i].SetValue(this, value);
    			}
    			else
    			{
    				Tracer.WriteLine("Unknown setting type = " + Fields[i].FieldType);
    			}
    			break;
    		}
    	}

    	protected virtual string GetFieldValue(string fieldName)
    	{
    		for (int i = 0; i < Fields.Length; i++)
    		{
    			if (Fields[i].Name == fieldName)
    			{
    				return GetFieldValue(Fields[i]);
    			}
    		}
    		return "";
    	}

    	protected virtual string GetFieldValue(FieldInfo field)
    	{
    		object value = field.GetValue(this);
    		if (field.FieldType == typeof(string))
    		{
    			return value.ToString();
    		}
    		if (field.FieldType == typeof(bool))
    		{
    			if (!(bool)value)
    			{
    				return "0";
    			}
    			return "1";
    		}
    		if (field.FieldType == typeof(int))
    		{
    			return value.ToString();
    		}
    		if (field.FieldType == typeof(float))
    		{
    			return value.ToString();
    		}
    		if (field.FieldType == typeof(string[]))
    		{
    			string text = "";
    			string[] array = (string[])value;
    			if (array != null)
    			{
    				string[] array2 = array;
    				foreach (string text2 in array2)
    				{
    					text = text + text2 + "*";
    				}
    			}
    			if (text.Length > 0)
    			{
    				return text.Substring(0, text.Length - 1);
    			}
    			return "";
    		}
    		return "";
    	}
    }
}