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

namespace MaratonValto
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string filename = "maratonvalto.csv";
            List<Eredmeny>  eredmenyek = LoadFromCsv(filename);

            Feladat6(eredmenyek);
            Feladat7(eredmenyek);
            Feladat8(eredmenyek);

            Console.ReadLine();
        }

        public static void Feladat8(List<Eredmeny> eredmenyek)
        {
            List<int> csapatok = new List<int>();
            List<int> csapatok_ido = new List<int>();
            foreach (var item in eredmenyek)
            {
                if (!csapatok.Contains(item.Versenyzo.Csapat))
                {
                    csapatok.Add(item.Versenyzo.Csapat);
                    csapatok_ido.Add(item.Ido);
                }
                else
                {
                    int index = 0;
                    while (item.Versenyzo.Csapat != csapatok[index])
                    {
                        index++;
                    }

                    csapatok_ido[index] += item.Ido;
                }

            }

            

            int min = csapatok_ido[0];
            int ind = 0; // indexe a csapatnak a csapatoklistában
            for (int i = 1; i < csapatok.Count; i++)
            {
                if (csapatok_ido[i] < min)
                {
                    min = csapatok_ido[i];
                    ind = i;
                }
            }

            int ora = csapatok_ido[ind] / 3600;
            int perc = csapatok_ido[ind] / 60 - (ora * 60);
            int masodperc = csapatok_ido[ind] - (perc * 60) - (ora * 3600);

            Console.WriteLine($"8. feladat: ");
            Console.WriteLine($"A legjobb csapat száma: {csapatok[ind]} ideje: {ora}:{perc}:{masodperc}");
            

            foreach (var item in eredmenyek)
            {
                if (item.Versenyzo.Csapat == csapatok[ind])
                {
                    Console.WriteLine($"\t{item.Kor}. Kör: {item.Versenyzo.Fid} {item.Versenyzo.Fnev} {item.Versenyzo.Szulev}");
                }
            }

            /*
             SELECT * FROM eredmenyek
             GROUP BY versemyzo.csapat
             ORDER BY SUM(versenyzo.ido) DESC LIMIT 1;
             
             */

        }

        public static void Feladat7(List<Eredmeny> eredmenyek)
        {
            Console.WriteLine("7. feladat:");

            IEnumerable<MaratonValto.Eredmeny> gyorsak = from eredmeny in eredmenyek
                                     where eredmeny.Ido/60 <= 30
                                     select eredmeny;

            GyorsakCreate(gyorsak);

            Console.WriteLine("A gyorsak.txt állomány létrehozva.");
        }

        public static void GyorsakCreate(IEnumerable<MaratonValto.Eredmeny> gyorsak)
        {
            FileStream fs = new FileStream("gyorsak.txt", FileMode.Create, FileAccess.Write);
            StreamWriter sw = new StreamWriter(fs);

            foreach (var item in gyorsak)
            {
                string line = $"{item.Versenyzo.Fid} {item.Versenyzo.Fnev} {item.Ido}";
                sw.WriteLine(line);
            }
            

            sw.Close();
            fs.Close();

        }

        public static void Feladat6(List<Eredmeny> eredmenyek)
        {
            double atlagoskorido = AtlagosKorIdo(eredmenyek);
            Console.WriteLine($"6.feladat:");
            Console.WriteLine($"\tA versenyzők átlagos körideje: {atlagoskorido} másodperc");
        }

        public static double AtlagosKorIdo(List<Eredmeny> eredmenyek)
        {
            double result = 0.00;
            foreach (var item in eredmenyek)
            {
                double ido = Convert.ToDouble(item.Ido);
                result += ido;
            }

            return result / eredmenyek.Count;
        }

        public static List<Eredmeny> LoadFromCsv(string filename)
        {
            List<Eredmeny> result = new List<Eredmeny>();

            FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
            StreamReader streamReader = new StreamReader(fileStream);

            string line = streamReader.ReadLine();
            line = streamReader.ReadLine();

            while (line != null) {
                string[] adatok = line.Split(';');
                int fid = int.Parse(adatok[0]);
                string fnev = adatok[1];
                int szulev = int.Parse(adatok[2]);
                int szulho = int.Parse(adatok[3]);
                int csapat = int.Parse(adatok[4]);
                int ffi = int.Parse(adatok[5]);

                int kor = int.Parse(adatok[6]);
                int ido = int.Parse(adatok[7]);


                Futo futo = new Futo(fid, fnev, szulev, szulho, csapat, ffi);
                Eredmeny eredmeny = new Eredmeny(futo, kor, ido);

                result.Add(eredmeny);
                line = streamReader.ReadLine();
            }

            streamReader.Close();
            fileStream.Close();

            return result;
        }
    }

    public class Futo
    {
        public int Fid;
        public string Fnev;
        public int Szulev;
        public int Szulho;
        public int Csapat;
        public int Ffi; //1 - férfi || 0 - nő
        public Futo(int fid, string fnev, int szulev, int szulho, int csapat, int ffi)
        {
            Fid = fid;
            Fnev = fnev;
            Szulev = szulev;
            Szulho = szulho;
            Csapat = csapat;
            Ffi = ffi;
        }
    }

    public class Eredmeny
    {
        public Futo Versenyzo;
        public int Kor;
        public int Ido;
        public Eredmeny(Futo versenyzo, int kor, int ido) { 
            Versenyzo = versenyzo;
            Kor = kor;
            Ido = ido;
        }
    }

}
