using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;

namespace Sokoban {

    class Program {

        private static List<Table> _Palyak = new List<Table>();
        private static SzelessegiLada Kereso;
        private static string akar = "i"; 

        static void Main(string[] args) {
            while(akar=="i"){
                Console.Write("Kérem adja meg a forrás fájl nevét és elérési útját! ");
                string path=Console.ReadLine();

                TextWriter tw=null;
                if (tw != null) tw.Close();
                 tw = File.CreateText("C:\\dest.txt"); 
               
                FileInfo f = new FileInfo(path);
                if (!f.Exists) Console.WriteLine("A fájl nem létezik. Akar megadni újabb fájlt? (i/n)");
                else {
                    fileOlvas(f);
                    if (_Palyak.Count > 0)
                    {
                        foreach (Table p in _Palyak)
                        {
                            Console.WriteLine("A " + (_Palyak.IndexOf(p) + 1) + " pálya:"); Console.WriteLine();
                            tw.WriteLine("A " + (_Palyak.IndexOf(p) + 1) + " pálya:");
                            for (int j = 0; j < p.Dimenzio.X; ++j)
                            {
                                for (int i = 0; i < p.Dimenzio.Y; ++i)
                                {
                                    Console.Write(p.Tabla[j, i] + ","); tw.Write(p.Tabla[j, i] + ",");
                                }
                                Console.WriteLine(); tw.WriteLine();
                            }
                            Console.WriteLine("Kezdési idő: " + DateTime.Now); tw.WriteLine("Kezdési idő: " + DateTime.Now);
                            tw.WriteLine();
                            Kereso = new SzelessegiLada(p.Tabla,(byte)p.Dimenzio.X,(byte)p.Dimenzio.Y); 
                            Lada l = Kereso.Kereses();
                            if (l != null)
                            {
                                Console.WriteLine("A probléma megoldható! Az egyik lehetsége megoldásának lépészáma: " + l.Szint);
                                tw.WriteLine("A probléma megoldható! Az egyik lehetsége megoldásának lépészáma: " + l.Szint);
                                tw.WriteLine();
                                Console.WriteLine("Irányok: " + l.Iranyok.Remove(l.Iranyok.Length - 1, 1));
                                tw.WriteLine("Irányok: " + l.Iranyok.Remove(l.Iranyok.Length - 1, 1));
                            }
                            else { Console.WriteLine("Nincs megoldás!"); tw.WriteLine("Nincs megoldás!"); }
                            Console.WriteLine("Befejezési idő: " + DateTime.Now); tw.WriteLine("Befejezési idő: " + DateTime.Now);
                            tw.WriteLine(); tw.Flush();
                        }
                        Console.Write("Akar megadni újabb fájlt? (i/n)");
                        Console.WriteLine(); 

                    }
                    else { Console.WriteLine("A fájl üres! Akar megadni újabb fájlt? (i/n)");}
                }
                akar=Console.ReadLine(); 
            }
        }

        public static void fileOlvas(FileInfo f){
            List<string> palyakS =new List<string>();
            TextReader reader = f.OpenText(); 
            bool ok = true; byte[,] b;
            int Ymax = int.MinValue,j;
            string sor; byte k=1;
            Table p; Point Dimenzio;
            
            sor = reader.ReadLine();

            while (sor != null) {
                if(sor.Contains("#")) {
                    palyakS.Add(sor);
                    if(sor.Length>Ymax) Ymax=sor.Length;
                }
                else if (palyakS.Count > 0) {
                    Console.WriteLine("Az " + k + ". palya beolvasása megtörtént.");
                    b = new byte[palyakS.Count,Ymax]; j = 0;
                    foreach(string s in palyakS) {
                        for (int i = 0; i < s.Length; ++i) {
                            if (ok && s[i] == ' ') b[j, i] = 3;
                            else {
                                if (s.IndexOf('#', i) > 0) {
                                    switch (s[i]) {
                                        case '#': ok = false;
                                            b[j, i] = 3;
                                            break;
                                        case '$': b[j, i] = 2;
                                            break;
                                        case '.': b[j, i] = 4;
                                            break;
                                        case '@': b[j, i] = 1;
                                            break;
                                        case '*': b[j, i] = 6;
                                            break;
                                        case ' ': b[j, i] = 0;
                                            break;
                                        default: b[j, i] = 3;
                                            break;
                                    }
                                }
                                else b[j, i] = 3;
                                ok = false;
                            }
                        }
                        ++j; ok = true;
                    }
                    p = new Table(); p.Tabla = b; Dimenzio = new Point();
                    Dimenzio.X=palyakS.Count; Dimenzio.Y=Ymax; p.Dimenzio = Dimenzio;
                    _Palyak.Add(p); palyakS.Clear(); ++k;
                }
                sor = reader.ReadLine();
            }
        }
    }
}
