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

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

        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)
            {
                IntArrKiir(kor.dobasokFull);
                IntArrKiir(kor.dontesekFull);
                Console.WriteLine("---------");
            }

            Console.WriteLine(CountPairs(new int[] { 2, 2, 3, 3, 4 }));

            
        }


        static int GetAllPairs(List<int> dobasok, List<int> dontesek)
        {
            int pairs = 0;

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

            foreach (var dobas in dobasok)
            {
                
            }


            return pairs;
        }

        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}");

        }
    }
}