using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;

namespace PowerSwitcher
{
    public class InIReader
    {
        private Dictionary<string,Dictionary<string,string>> cont;
        private FileSystemWatcher k = new FileSystemWatcher(Directory.GetCurrentDirectory(), "*.ini");
        private string filename;
        
        public InIReader(string filename)
        {
            this.filename = filename;
            k.Changed += new FileSystemEventHandler(this.readAgain);
            loadFile();
        }

        private void readAgain(object sender, EventArgs e)
        {
            loadFile();
        }

        private void loadFile()
        {
            this.cont = new Dictionary<string, Dictionary<string, string>>();
            StreamReader file = new StreamReader(this.filename);
            List<String> buf = new List<string>();
            string fline = "";
            while (fline != null)
            {
                fline = file.ReadLine();
                if (fline != null)
                    buf.Add(fline);
            }
            file.Close();
            Dictionary<string, string> sub = new Dictionary<string, string>();
            string cap = "";
            foreach (string line in buf)
            {
                Match match = Regex.Match(line, @"^\[[a-zA-Z0-9\-_ ]+\]\w*$", RegexOptions.IgnoreCase);
                if (match.Success)
                {
                    if (sub.Count != 0 && cap != "")
                    {
                        cont.Add(cap, sub);
                    }
                    cap = line;
                    sub = new Dictionary<string, string>();
                }
                else
                {
                    if (line != "" && cap != "")
                    {
                        string key = line.Substring(0,line.IndexOf('='));
                        string value = line.Substring(line.IndexOf('=')+1);
                        sub.Add(key, value);
                    }
                }
            }
            if (sub.Count != 0 && cap != "")
            {
                cont.Add(cap, sub);
            }
        }

        public List<String> getSections()
        {
            return cont.Keys.ToList<String>();
        }

        public String getValue(String section, String key)
        {
            if (!section.StartsWith("["))
            {
                section = "[" + section + "]";
            }
            if (cont.Keys.Contains(section))
            {
                if (cont[section].Keys.Contains(key))
                {
                    return cont[section][key];
                }
            }
            return null;
        }


        public void SetValue(string section, string key, string value)
        {
            if (!section.StartsWith("["))
            {
                section = "[" + section + "]";
            }
            if (cont.Keys.Contains(section))
            {
                if (cont[section].Keys.Contains(key))
                {
                    cont[section][key] = value;
                }
                else
                {
                    cont[section].Add(key, value);
                }
            }
            else
            {
                Dictionary<string,string> sub = new Dictionary<string,string>();
                sub.Add(key, value);
                cont.Add(section, sub);
            }
            k.Changed -= null;
            saveSettings();
            loadFile();
            k.Changed += new FileSystemEventHandler(this.readAgain);
        }

        private void saveSettings()
        {
            StreamWriter file = new StreamWriter(this.filename);
            file.BaseStream.SetLength(0);
            file.BaseStream.Flush();
            file.BaseStream.Seek(0, SeekOrigin.Begin);
            foreach (KeyValuePair<string, Dictionary<string, string>> cap in this.cont)
            {
                file.WriteLine(cap.Key);
                foreach (KeyValuePair<string, string> sub in cap.Value)
                {
                    file.WriteLine(sub.Key + "=" + sub.Value);
                }
                file.WriteLine();
            }
            file.Flush();
            file.Close();
        }
    }
}