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

namespace ConfigMaker
{
    class Program
    {
        static void Main(string[] args)
        {
            AppConfig appc = new AppConfig();

            if (!appc.ReadAppConfig(true))
            {
                return;
            }

            Process(appc);
            System.Threading.Thread.Sleep(500);
        }

        public static void Process(AppConfig appc)
        {
            StreamReader rrheader;
            StreamReader rrfooter;
            StreamReader rrbody;

            String header = "";
            String footer = "";
            String body = "";

            String str = "";
            String s = "";

            // Читаем заголовок набора фильтров

            try
            {
                using (rrheader = new StreamReader(appc.Fsheader, Encoding.UTF8))
                {
                    while ((s = rrheader.ReadLine()) != null)
                    {
                        s = s.TrimEnd() + "\r\n";
                        header += s;
                    }
                }
            }
            catch (Exception ex)
            {
                str = "Ошибка чтения заголовочного файла, " + ex.Message;
                Console.WriteLine(str);
                return;
            }

            // Читаем окончание набора фильтров

            try
            {
                using (rrfooter = new StreamReader(appc.Fsfooter, Encoding.UTF8))
                {
                    while ((s = rrfooter.ReadLine()) != null)
                    {
                        s = s.TrimEnd() + "\r\n";
                        footer += s;
                    }
                }
            }
            catch (Exception ex)
            {
                str = "Ошибка чтения файла окончания, " + ex.Message;
                Console.WriteLine(str);
                return;
            }

            // Формируем фильтры пользователей

            String filterset = "";

            foreach (User uu in appc.Users)
            {
                // Ищем IP адрес пользователя в таблице IP адресов с целью
                // нахождения начального FilterId

                bool found = false;
                int sfi = 0;

                UInt32 ip = Ipaddr.FromString(uu.Ip);

                foreach (IpaddrTable ipt in appc.Iptables)
                {
                    if (ipt.CheckIpaddr(ip))
                    {
                        found = true;
                        sfi = ipt.StartFilterId;
                        break;
                    }
                }

                if (!found)
                    continue;

                // Формируем FilterId

                UInt32 ip4 = ip & 0x000000FF;
                int filterId = sfi + (int)ip4 * 2;
                int filterId1 = filterId + 1;

                // Читаем шаблон фильтра, который был задан через тарифный план

                body = "";
                try
                {
                    String ss = appc.FilterFolder + uu.Planname + ".tmf";

                    using (rrbody = new StreamReader(ss, Encoding.UTF8))
                    {
                        while ((s = rrbody.ReadLine()) != null)
                        {
                            s = s.TrimEnd() + "\r\n";
                            body += s;
                        }
                    }
                }
                catch
                {
                    continue;
                }

                String ubody = body;
                ubody = ubody.Replace("%FilterId%", filterId.ToString());
                ubody = ubody.Replace("%FilterId1%", filterId1.ToString());
                ubody = ubody.Replace("%FilterName%", uu.Username);
                ubody = ubody.Replace("%FilterIp%", uu.Ip);

                filterset += ubody;
            }

            // Формируем окончательный набор фильтров

            try
            {
                StreamWriter sw = new StreamWriter(appc.Result);
                sw.Write(header);
                sw.Write(filterset);
                sw.Write(footer);
                sw.Close();
            }
            catch (Exception ex)
            {
                str = "Ошибка записи файла, " + ex.Message;
                Console.WriteLine(str);
                return;
            }

            Console.WriteLine("");
            Console.WriteLine("Набор фильтров успешно сформирован.");
        }
    }
}
