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

namespace HegyekMO
{
    class Program
    {
        const double lab = 3.280839895;
        static void Main(string[] args)
        {
            DataRead();

            Feladat3();
            Feladat4();
            Feladat5();
            Feladat6();
            Feladat7();
            Feladat8();
            Feladat9();
            Console.ReadLine();
        }

        public static void Feladat3()
        {
            Console.WriteLine($"3. feladat: Hegycsúcsok száma: {Data.hegyek.Count} db");
        }

        public static void Feladat4()
        {
            double magassag_SZUM = Magassag_SZUM(Data.hegyek);
            double db = Data.hegyek.Count;

            double atlag = magassag_SZUM / db;

            Console.WriteLine($"4. feladat: Hegycsúcsok átlagos magassága: {atlag} m");
        }

        public static int Magassag_SZUM(List<Hegy> T)
        {
            int SZUM = 0;
            foreach (var item in T)
            {
                SZUM += item.Magassag;
            }
            return SZUM;
        }

        public static void Feladat5()
        {
            Hegy legmagasabb = Legmagasabb(Data.hegyek);

            Console.WriteLine("5. feladat: A legmagasabb hegycsúcs adatai:");
            Console.WriteLine($"\tNév: {legmagasabb.HegycsucsNev}");
            Console.WriteLine($"\tHegység: {legmagasabb.Hegyseg}");
            Console.WriteLine($"\tMagasság: {legmagasabb.Magassag} m");
        }

        public static Hegy Legmagasabb(List<Hegy> T)
        {
            Hegy hegy;
            int index = 0;
            int magassag = 0;
            for (int i = 0; i < T.Count; i++)
            {
                if (T[i].Magassag > magassag)
                {
                    magassag = T[i].Magassag;
                    index = i;
                }
            }
            hegy = T[index];

            return hegy;
        }

        public static void Feladat6()
        {
            Console.Write("6. feladat: Add meg a magasságot:");
            string keresendo = Console.ReadLine();
            Console.WriteLine();
            int magassag = int.Parse(keresendo);

            Hegy legmagasabb = Legmagasabb(Data.hegyek);

            string name = "";

            if (magassag > legmagasabb.Magassag)
            {
                Console.WriteLine("\tNincs ennél magasabb hegy");
            }
            else
            {
                foreach (var item in Data.hegyek)
                {
                    if (magassag < item.Magassag)
                    {
                        name = item.HegycsucsNev;
                        break;
                    }
                }

                Console.WriteLine($"\tVan {magassag} m-nél magasabb hegycsúcs a {name}");
            }


        }

        public static void Feladat7()
        {
            int db = Magasabbak(Data.hegyek, lab);

            Console.WriteLine($"7. feladat: 3000 lábnál magasabb hegycsúcsok száma: {db}");
        }

        public static int Magasabbak(List<Hegy> T, double mertekegyseg)
        {
            int db = 0;
            foreach (var item in T)
            {
                if (item.Magassag * mertekegyseg > 3000)
                {
                    db++;
                }
            }
            return db;
        }

        public static void Feladat8()
        {
            Console.WriteLine("8. feladat: Hegység statisztika");

            Dictionary<string, int> Csoportositotthegyek = new Dictionary<string, int>();
            foreach (var item in Data.hegyek)
            {
                if (!Csoportositotthegyek.ContainsKey(item.Hegyseg))
                {
                    Csoportositotthegyek.Add(item.Hegyseg, 1);
                }
                else
                {
                    Csoportositotthegyek[item.Hegyseg]++;
                }
            }

            foreach (var item in Csoportositotthegyek)
            {
                Console.WriteLine($"\t{item.Key}: {item.Value} db");
            }
        }

        public static void Feladat9()
        {
            string path = @"bukk-videk.txt";
            Console.WriteLine($"9. feladat: {path}");

            List<Hegy> bukki_hegyek = new List<Hegy>();

            foreach (var item in Data.hegyek)
            {
                if (item.Hegyseg == "Bükk-vidék")
                {
                    bukki_hegyek.Add(item);
                }
            }

            FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
            StreamWriter streamWriter = new StreamWriter(fileStream);

            streamWriter.WriteLine("Hegycsúcs neve;Magasság lábban");

            foreach (var item in bukki_hegyek)
            {
                string formatted_height = string.Format("{0:F1}", item.Magassag * lab);
                string line = $"{item.HegycsucsNev};{formatted_height}";
                Console.WriteLine($"\t{line}");
                streamWriter.WriteLine(line);
            }

            streamWriter.Close();
            fileStream.Close();
        }


        public static void DataRead()
        {
            string path = @"hegyekMo.txt";
            FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
            StreamReader streamReader = new StreamReader(fileStream);

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

            while (line != null)
            {
                string[] datas = line.Split(';');


                Hegy hegy = new Hegy(datas[0], datas[1], Convert.ToInt32(datas[2]));
                Data.hegyek.Add(hegy);

                line = streamReader.ReadLine();
            }

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


    public static class Data
    {
        public static List<Hegy> hegyek = new List<Hegy>();
    }
    public class Hegy
    {
        public string HegycsucsNev { get; private set; }
        public string Hegyseg { get; private set; }
        public int Magassag { get; private set; }

        public Hegy(string hegycsucsnev, string hegyseg, int magassag)
        {
            HegycsucsNev = hegycsucsnev;
            Hegyseg = hegyseg;
            Magassag = magassag;
        }
    }
}
