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

namespace Program
{
    class Program
    {
        static void Main(string[] args)
        {
            //Feladat1();
            //Feladat2();
            Feladat3();
        }

        static void Feladat3()
        {
            Dictionary<char, int> lookUpTable = new Dictionary<char, int>();

            //csökkentett értékek, mert programozásban ugye nem egytől számolunk
            lookUpTable.Add('A', 0);
            lookUpTable.Add('E', 1);
            lookUpTable.Add('I', 2);
            lookUpTable.Add('O', 3);
            lookUpTable.Add('U', 4);

            char[,] tablazat = CreateAlphabetMatrix();

            PrintMatrix(tablazat);

            string path = @"..\..\..\Sources\szoveg.txt";
            var data = File.ReadAllLines(path);

            List<string> secretWords = new List<string>();

            foreach (var line in data)
            {
                var currentWords = line.Split(' ');
                foreach (var item in currentWords)
                {
                    secretWords.Add(item);
                }
            }

            List<string> solvedWords = new List<string>();

            bool coordsShouldSwitch = false;

            foreach (var secret in secretWords)
            {
                List<char> solvedChars = new List<char>();
                for (int i = 0; i < secret.Length; i+=2)
                {
                    if (coordsShouldSwitch)
                    {
                        int row = lookUpTable[secret[i + 1]];
                        int col = lookUpTable[secret[i]];

                        solvedChars.Add(tablazat[row, col]);
                    } 
                    else
                    {
                        int row = lookUpTable[secret[i]];
                        int col = lookUpTable[secret[i + 1]];

                        solvedChars.Add(tablazat[row, col]);
                    }

                    coordsShouldSwitch = !coordsShouldSwitch;
                }

                solvedWords.Add(new string(solvedChars.ToArray()));
            }

            // a feladat

            foreach (var solved in solvedWords)
            {
                Console.WriteLine(solved);
            }

            int indexOfFirstWordWithQInIt = solvedWords.IndexOf(solvedWords.First(x => x.Contains('Q')));
            int indexOfLastWordWithQInIt = solvedWords.IndexOf(solvedWords.Last(x => x.Contains('Q')));



            //Console.WriteLine(solvedWords[indexOfFirstWordWithQInIt]);
            //Console.WriteLine(solvedWords[indexOfLastWordWithQInIt]);

            Console.WriteLine($"A szövegben lévő Q karakteres szavak közötti max távolság: {indexOfLastWordWithQInIt - indexOfFirstWordWithQInIt - 1}");

            // b feladat

            string pathToSzoveg2 = @"..\..\..\Sources\szoveg2.txt";
            var szoveg2Data = File.ReadAllText(pathToSzoveg2);

            char[] vowelsLookUp = { 'A', 'E', 'I', 'O', 'U' };

            List<char> vowels = new List<char>();

            foreach (char c in szoveg2Data)
            {
                if (vowelsLookUp.Contains(c))
                {
                    vowels.Add(c);
                }
            }

            string feladatBString = new string(vowels.ToArray());

            
            
            List<char> solvedCharsForFeladatB = new List<char>();
            for (int i = 0; i < feladatBString.Length; i += 2)
            {                
                int row = lookUpTable[feladatBString[i]];
                int col = lookUpTable[feladatBString[i + 1]];

                solvedCharsForFeladatB.Add(tablazat[row, col]);
                
            }

            Console.WriteLine($"B feladat megoldás: {new string(solvedCharsForFeladatB.ToArray())}");


            // c feladat
            string atirando = "EZTKELLATIRNI";
            string pathToSzavak = @"..\..\..\Sources\szavak.txt";

            var szavak = File.ReadAllLines(pathToSzavak);

            Dictionary<int, char> reversedLookUpTable = new Dictionary<int, char>();
            reversedLookUpTable.Add(0, 'A');
            reversedLookUpTable.Add(1, 'E');
            reversedLookUpTable.Add(2, 'I');
            reversedLookUpTable.Add(3, 'O');
            reversedLookUpTable.Add(4, 'U');

            List<char> titkositottKarakterek = new List<char>();

            foreach (char c in atirando)
            {
                for (int row = 0; row < tablazat.GetLength(0); row++)
                {
                    for (int col = 0; col < tablazat.GetLength(1); col++)
                    {
                        if (tablazat[row, col] == c)
                        {
                            titkositottKarakterek.Add(reversedLookUpTable[row]);
                            titkositottKarakterek.Add(reversedLookUpTable[col]);
                        }
                    }
                }
            }

            string feladatCString = new string(titkositottKarakterek.ToArray());
            Console.WriteLine(feladatCString);

            foreach (var item in szavak)
            {
                Console.WriteLine(item);
            }

            List<string> feladatCMegoldas = new List<string>();

            for (int i = 0; i < feladatCString.Length; i+=2)
            {
                char firstChar = feladatCString[i];
                char secondChar = feladatCString[i + 1];

                string pattern;
                if (firstChar == secondChar)
                {
                    pattern = $@"^(?=.*{firstChar}.*{firstChar}).*{firstChar}.*{firstChar}.*$";
                }
                else
                {
                    pattern = $@"^(?!.*{firstChar}.*{firstChar})(?!.*{secondChar}.*{secondChar}).*{firstChar}.*{secondChar}.*$";
                }
                Regex regex = new Regex(pattern);

                foreach (string szo in szavak)
                {
                    if (regex.IsMatch(szo))
                    {
                        feladatCMegoldas.Add(szo);
                        //Console.WriteLine($"{firstChar} - {secondChar} - {szo}");
                        break;
                    }
                }
            }

            // c megoldás

            string cmegoldasString = "";
            foreach (var item in feladatCMegoldas)
            {
                Console.Write(item + " ");
                cmegoldasString += item + " ";
            }
            Console.WriteLine();

            

            //Ellenőrzés a kapott kódra
            /*
            
            List<char> solvedCharsForFeladatC = new List<char>();
            for (int i = 0; i < feladatCString.Length; i += 2)
            {
                int row = lookUpTable[feladatCString[i]];
                int col = lookUpTable[feladatCString[i + 1]];

                solvedCharsForFeladatC.Add(tablazat[row, col]);

            }

            Console.WriteLine(  new string(solvedCharsForFeladatC.ToArray()));
            */

            // d feladat bizonyítás
            /*

            List<char> maganhangzok = new List<char>();

            foreach (char c in cmegoldasString)
            {
                if (vowelsLookUp.Contains(c))
                {
                    maganhangzok.Add(c);
                }
            }

            string asd = new string(vowels.ToArray());



            List<char> megtalatkarakterek = new List<char>();
            for (int i = 0; i < feladatBString.Length; i += 2)
            {
                int row = lookUpTable[feladatBString[i]];
                int col = lookUpTable[feladatBString[i + 1]];

                megtalatkarakterek.Add(tablazat[row, col]);

            }

            Console.WriteLine(new string(megtalatkarakterek.ToArray()));

            */
        }

        static char[,] CreateAlphabetMatrix()
        {
            char[,] matrix = new char[5, 5];
            List<char> alphabet = new List<char>();

            // Add letters A-Z except for 'W'
            for (char c = 'A'; c <= 'Z'; c++)
            {
                if (c != 'W')
                {
                    alphabet.Add(c);
                }
            }

            // Fill the matrix with the alphabet
            int index = 0;
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    matrix[i, j] = alphabet[index];
                    index++;
                }
            }

            return matrix;
        }

        static void PrintMatrix(char[,] matrix)
        {
            for (int i = 0; i < matrix.GetLength(0); i++)
            {
                for (int j = 0; j < matrix.GetLength(1); j++)
                {
                    Console.Write(matrix[i, j] + " ");
                }
                Console.WriteLine();
            }
        }


        static void Feladat2()
        {
            string path = @"..\..\..\Sources\dobasok.txt";
            string path2 = @"..\..\..\Sources\dontesek.txt";

            var dobasok = new List<int>();
            var dontesek = new List<int>();

            //d feladathoz
            int pokermaxNum = 0;


            //dobasok

            var data = File.ReadAllText(path).Trim();
            foreach (char c in data)
            {
                dobasok.Add(Convert.ToInt32($"{c}"));
            }



            //dontesek

            var data2 = File.ReadAllText(path2).Trim();

            foreach (char c in data2)
            {
                dontesek.Add(Convert.ToInt32($"{c}"));
            }

            
            Jatekos alfa = new Jatekos();
            alfa.Nev = "Alfa";
            Jatekos beta = new Jatekos();
            beta.Nev = "Beta";
            Jatekos gamma = new Jatekos();
            gamma.Nev = "Gamma";

            List<Jatekos> jatekosok = new List<Jatekos>();
            jatekosok.Add(alfa);
            jatekosok.Add(beta);
            jatekosok.Add(gamma);

            List<Kor> korok = new List<Kor>();

            

            List<int> dobasokSmallerScope = new List<int>();

            int jatekosCounter = 0;

            List<int> dobasokFull = new List<int>();
            List<int> dontesekFull = new List<int>();

            for (int i = 0; i < dobasok.Count; i++)
            {
                int dobas = dobasok[i];
                int dontes = dontesek[i];

                dobasokFull.Add(dobas);
                dontesekFull.Add(dontes);

                if (dontes == 1)
                {
                    dobasokSmallerScope.Add(dobas);

                    if (dobasokSmallerScope.Count == 5)
                    {
                        Kor kor = new Kor();
                        kor.dobasok = dobasokSmallerScope.ToArray();
                        kor.jatekos = jatekosok[jatekosCounter];

                        kor.dobasokFull = dobasokFull.ToArray();
                        kor.dontesekFull = dontesekFull.ToArray();

                        dobasokFull.Clear();
                        dontesekFull.Clear();

                        korok.Add(kor);

                        dobasokSmallerScope.Clear();

                        if (jatekosCounter == 2)
                        {
                            jatekosCounter = 0;
                        } else
                        {
                            jatekosCounter++;
                        }
                       
                        continue;
                    }
                }

            }

            // a feladat
            Console.WriteLine($"Teljes körök száma: {korok.Count / 3}");

            // b feladat

            

            foreach (var kor in korok)
            {
                foreach (var jatekos in jatekosok)
                {
                    if (jatekos.Nev == kor.jatekos.Nev)
                    {
                        int[] dobasokAKorben = kor.dobasok;

                        bool sorCondition = dobasokAKorben.Distinct().Count() == 5;

                        //nagysor
                        if (sorCondition && dobasokAKorben.Contains(6))
                        {
                            jatekos.Minta.Nagysor = true;
                            continue;
                        }

                        //kissor
                        if (sorCondition && dobasokAKorben.Contains(1))
                        {
                            jatekos.Minta.Kissor = true;
                            continue;
                        }

                        //poker
                        var pokerGroup = dobasokAKorben.GroupBy(x => x).FirstOrDefault(g => g.Count() == 4);
                        if (pokerGroup != null)
                        {
                            int pokerValue = pokerGroup.Key;
                            if (pokerValue > pokermaxNum)
                            {
                                pokermaxNum = pokerValue;
                            }
                            jatekos.Minta.Poker = true;                            
                            continue;
                        }

                        //full
                        if (dobasokAKorben.Count(x => x == 3) == 1 && dobasokAKorben.Count(x => x == 2) == 1)
                        {
                            jatekos.Minta.Full = true;
                            continue;
                        }

                        //terc
                        if (dobasokAKorben.Count(x => x == 3) == 1)
                        {
                            jatekos.Minta.Terc = true;
                            continue;
                        }

                        //ketpar
                        if (dobasokAKorben.Count(x => x == 2) == 2)
                        {
                            jatekos.Minta.KetPar = true;
                            continue;
                        }

                        //egypar
                        if (dobasokAKorben.Count(x => x == 2) == 1)
                        {
                            jatekos.Minta.EgyPar = true;
                            continue;
                        }
                    }
                }
            }

            foreach (var jatekos in jatekosok)
            {
                if (jatekos.Minta.AllTrue())
                {
                    Console.WriteLine($"{jatekos.Nev} nyerte meg a játékot");
                }
            }

            // c feladat

            int counter = 0;

            foreach (var kor in korok)
            {
                if (kor.jatekos.Nev == "Gamma")
                {
                    int[] dobasokAKorben = kor.dobasok;
                    counter++;
                    if (dobasokAKorben.Count(x => x == 3) == 1 && dobasokAKorben.Count(x => x == 2) == 1)
                    {
                            
                        break;
                    }
                }
                
            }

            Console.WriteLine($"Gamma ebbe a körbe dobott full-t: {counter + 1}");

            // d feladat

            Console.WriteLine($"A legnagyobb poker értéke: {pokermaxNum}");


            // e feladat
            foreach (var kor in korok)
            {
                List<int[]> asztalok = new List<int[]>();
                List<int> currentAsztal = new List<int>();
                List<int> currentDontesek = new List<int>();

                int iter = 0;

                while (iter < kor.dobasokFull.Length)
                {
                    while (currentAsztal.Count != 5)
                    {
                        currentAsztal.Add(kor.dobasokFull[iter]);
                        currentDontesek.Add(kor.dontesekFull[iter]);

                        iter++;
                    }

                    if (currentAsztal.Count == 5)
                    {
                        asztalok.Add(currentAsztal.ToArray());
                        List<int> tempAsztal = new List<int>(currentAsztal);
                        List<int> tempDontesek = new List<int>(currentDontesek);
                        currentAsztal.Clear();
                        currentDontesek.Clear();

                        for (int i = 0; i < tempAsztal.Count; i++)
                        {
                            if (tempDontesek[i] == 1)
                            {
                                currentAsztal.Add((int)tempAsztal[i]);
                                currentDontesek.Add(1);
                            }
                        }
                    }
                }

                kor.asztalok = asztalok;
            }

            int pairs = 0;

            foreach (var kor in korok)
            {
                foreach (var asztal in kor.asztalok)
                {
                    foreach (var item in asztal)
                    {
                        Console.Write($"{item} ");
                    }
                    Console.WriteLine();

                    pairs += CountPairs(asztal);
                }
                Console.WriteLine("-----");
            }

            Console.WriteLine($"Párok száma: {pairs}");

            
        }

        static void PopulateAsztal(Kor kor)
        {
            List<int[]> asztalok = new List<int[]>();
            List<int> currentAsztal = new List<int>();
            List<int> currentDontesek = new List<int>();

            int iter = 0;

            while (iter != kor.dobasokFull.Length - 1)
            {
                while (currentAsztal.Count != 5)
                {
                    currentAsztal.Add(kor.dobasokFull[iter]);
                    currentDontesek.Add(kor.dontesekFull[iter]);

                    iter++;
                }

                if (currentAsztal.Count == 5)
                {
                    asztalok.Add(currentAsztal.ToArray());
                    List<int> tempAsztal = currentAsztal;
                    List<int> tempDontesek = currentDontesek;
                    currentAsztal.Clear();
                    currentDontesek.Clear();

                    for (int i = 0; i < tempAsztal.Count; i++)
                    {
                        if (tempDontesek[i] == 1)
                        {
                            currentAsztal.Add((int)tempAsztal[i]);
                            currentDontesek.Add(1);
                        }
                    }
                }
            }
        }


        static int CountPairs(int[] dobasok)
        {
            int pairs = 0;

            //terc
            if (dobasok.Count(x => x == 3) == 1)
            {
                return 0;
            }

            var pokerGroup = dobasok.GroupBy(x => x).FirstOrDefault(g => g.Count() == 4);
            if (pokerGroup != null)
            {
                return 0;
            }


            for (int i = 0; i < dobasok.Length; i++)
            {
                for (int j = i + 1; j < dobasok.Length; j++)
                {
                    if (dobasok[i] == dobasok[j])
                    {
                        pairs++;
                    }
                }
            }
            return pairs;
        }
        static void IntArrKiir(int[] arr)
        {
            foreach (var item in arr)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }

        static void Feladat1()
        {
            string path = @"..\..\..\Sources\idopontok.txt";

            var idopontok = new List<Idopont>();

            var data = File.ReadAllLines(path);
            foreach (var line in data)
            {
                var parts = line.Split(' ');
                Idopont idopont = new Idopont(int.Parse(parts[0]), int.Parse(parts[1]));
                idopontok.Add(idopont);
            }


            foreach (var idopont in idopontok)
            {
                Console.WriteLine($"{idopont.Name}, {idopont.ClockAngle()}°");
            }

            Console.WriteLine($"Legnagyobb szögű időpont: {idopontok.OrderByDescending(x => x.Angle).First().Name}");


            // nem biztos, hogy jó
            List<double> angleDifferences = new List<double>();
            for (int i = 0; i < idopontok.Count - 1; i++)
            {
                angleDifferences.Add(Math.Abs(idopontok[i].Angle - idopontok[i + 1].Angle));
            }

            Console.WriteLine($"Legkisebb változás: {angleDifferences.Min()}°");

            var idopontok2 = new List<Idopont>();
            int napok = 5;

            for (int i = 0; i < napok; i++)
            {
                for (int orak = 0; orak < 24; orak++)
                {
                    for (int percek = 0; percek < 60; percek++)
                    {
                        Idopont idopont = new Idopont(orak, percek);
                        idopont.ClockAngle();
                        idopontok2.Add(idopont);
                    }
                }
            }

            string path2 = @"..\..\..\Sources\szogek.txt";

            var data2 = File.ReadAllText(path2).Split(' ');
            List<double> anglesToLookFor = new List<double>();


            foreach (var item in data2)
            {
                string formattedItem = item.Replace('.', ',');
                anglesToLookFor.Add(Double.Parse(formattedItem));
            }

            int counter = 0;
            int iterations = 0;
            int napokCounter = 1;

            foreach (var item in idopontok2)
            {
                if (item.Angle == anglesToLookFor[counter])
                {
                    counter++;
                }

                if (counter == anglesToLookFor.Count)
                {
                    break;
                }

                iterations++;

                if (iterations == 1440)
                {
                    napokCounter++;
                    iterations = 0;
                }
            }

            Console.WriteLine($"{napokCounter}|{idopontok2[iterations].Name}");

        }
    }
}