using System;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;

namespace ConfigMaker
{
    public class AppConfig
    {
        public String Fsheader;
        public String Fsfooter;
        public String Fileusers;
        public String FilterFolder;
        public String Result;

        public List<IpaddrTable> Iptables;
        public List<User> Users;

        public AppConfig()
        {
            Fsheader = "";
            Fsfooter = "";
            Fileusers = "";
            Result = "";
            FilterFolder = "";

            Iptables = new List<IpaddrTable>();
            Users = new List<User>();
        }

        public bool ReadAppConfig(bool debug)
        {
            string[] names = ConfigurationManager.AppSettings.AllKeys;
            NameValueCollection appStgs = ConfigurationManager.AppSettings;
            for (int i = 0; i < appStgs.Count; i++)
            {
                if (names[i].ToLower().StartsWith("filtersetheader"))
                {
                    Fsheader = appStgs[i];

                    if (debug)
                    {
                        Console.WriteLine("Файл заголовка набора фильтров: " + Fsheader);
                    }
                }

                if (names[i].ToLower().StartsWith("filterfolder"))
                {
                    FilterFolder = appStgs[i];

                    if (debug)
                    {
                        Console.WriteLine("Папка с шаблонами фильтрами пользователей: " + FilterFolder);
                    }
                }

                if (names[i].ToLower().StartsWith("filtersetfooter"))
                {
                    Fsfooter = appStgs[i];

                    if (debug)
                    {
                        Console.WriteLine("Файл окончания набора фильтров: " + Fsfooter);
                    }
                }

                if (names[i].ToLower().StartsWith("users"))
                {
                    Fileusers = appStgs[i];

                    if (debug)
                    {
                        Console.WriteLine("Файл с пользователями: " + Fileusers);
                    }
                }

                if (names[i].ToLower().StartsWith("result"))
                {
                    Result = appStgs[i];

                    if (debug)
                    {
                        Console.WriteLine("Результирующий файл набора фильтров: " + Result);
                    }
                }

                if (names[i].ToLower().StartsWith("range"))
                {
                    String[] r = appStgs[i].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

                    if (r.Length == 3)
                    {
                        UInt32 ips, ipe;
                        try
                        {
                            ips = Ipaddr.FromString(r[0]);
                        }
                        catch
                        {
                            continue;
                        }

                        try
                        {
                            ipe = Ipaddr.FromString(r[1]);
                        }
                        catch
                        {
                            continue;
                        }

                        int sfi;
                        try
                        {
                            sfi = Int32.Parse(r[2]);
                        }
                        catch
                        {
                            continue;
                        }

                        IpaddrTable ipt = new IpaddrTable();
                        try
                        {
                            ipt.AddEntry(new IpaddrPair(ips, ipe));
                        }
                        catch
                        {
                        }

                        ipt.StartFilterId = sfi;

                        if (debug)
                        {
                            String str = String.Format("Диапазон IP адресов: {0}-{1}", r[0], r[1]);
                            Console.WriteLine(str);
                        }

                        Iptables.Add(ipt);
                    }
                }
            }

            bool ok = true;

            if (Fsheader.Length == 0)
            {
                Console.WriteLine("Ошибка! Не задан файл заголовка набора фильтров.");
                ok = false;
            }

            if (FilterFolder.Length == 0)
            {
                Console.WriteLine("Ошибка! Не задана папка с фильтрами пользователей.");
                ok = false;
            }

            if (Fsfooter.Length == 0)
            {
                Console.WriteLine("Ошибка! Не задан файл окончания набора фильтров.");
                ok = false;
            }

            if (Fileusers.Length == 0)
            {
                Console.WriteLine("Ошибка! Не задан файл с пользователями.");
                ok = false;
            }

            if (Result.Length == 0)
            {
                Console.WriteLine("Ошибка! Не задан файл результирующего набора фильтров.");
                ok = false;
            }

            if (Iptables.Count == 0)
            {
                Console.WriteLine("Ошибка! Не задан диапазон IP адресов пользователей.");
                ok = false;
            }

            Users.Clear();
            try
            {
                User.ReadUserConfig(Fileusers, ref Users);
            }
            catch (Exception ex)
            {
                String str = "Ошибка чтения файла с пользователями, " + ex.Message;
                Console.WriteLine(str);
                ok = false;
            }

            return ok;
        }

    }
}
