using System.Diagnostics;

namespace Examen
{
    public class Pipe
    {
        private static string[] array; // Массив для хранения данных из файла

        /// <summary>
        /// Получение данных из файла
        /// </summary>
        public static void getData(string path)
        {
            try
            {
                array = File.ReadAllLines(path);
            }
            catch
            {
                Console.Write("\nОшибка. Исходный файл \"data.txt\" не найден или повреждён!");
                Environment.Exit(0);
            }
        }

        /// <summary>
        /// Вывод исходных данных на экран
        /// </summary>
        public static void show()
        {
            for (int i = 0; i < array.Length; i++)
            {
                string[] str = array[i].Split(";"); ;
                Console.Write("Тип: " + str[0]);
                Console.Write(". Длина: " + str[1]);
                Console.Write(". Внешний диаметр: " + str[2]);
                Console.Write(". Толщина стенки: " + str[3]);

                if (str[0] == "PN25")
                {
                    Console.Write(". A");
                }
                else
                {
                    Console.Write(". " + str[4]);
                }

                Console.WriteLine();
            }
            diagnostic("Вывод исходных данных на экран");
        }

        /// <summary>
        /// Вывод информации о браке
        /// </summary>
        public static void getBreak()
        {
            for (int i = 0; i < array.Length; i++)
            {
                string[] str = array[i].Split(";"); ;
                Console.Write("Тип: " + str[0]);
                Console.Write(". Длина: " + str[1]);
                Console.Write(". Внешний диаметр: " + str[2]);
                Console.Write(". Толщина стенки: " + str[3]);

                if (str[0] == "PN25")
                {
                    Console.Write(". A");
                }
                else
                {
                    Console.Write(". " + str[4]);
                }

                if (Math.Round(Convert.ToDouble(str[1])) < 3960 || Math.Round(Convert.ToDouble(str[1])) > 4040)
                {
                    Console.Write("\tНе соответствует");
                    Console.WriteLine();
                    continue;
                }

                if (str[0] == "PN10")
                {
                    if (Math.Round(Convert.ToDouble(str[2])) * 0.1 > Convert.ToDouble(str[3]) || Math.Round(Convert.ToDouble(str[2])) * 0.11 < Convert.ToDouble(str[3]))
                    {
                        Console.Write("\tНе соответствует");
                        Console.WriteLine();
                        continue;
                    }
                }

                if (str[0] == "PN16")
                {
                    if (Math.Round(Convert.ToDouble(str[2])) * 0.135 > Convert.ToDouble(str[3]) || Math.Round(Convert.ToDouble(str[2])) * 0.14 < Convert.ToDouble(str[3]))
                    {
                        Console.Write("\tНе соответствует");
                        Console.WriteLine();
                        continue;
                    }
                }

                if (str[0] == "PN20")
                {
                    if (Math.Round(Convert.ToDouble(str[2])) * 0.165 > Convert.ToDouble(str[3]) || Math.Round(Convert.ToDouble(str[2])) * 0.17 < Convert.ToDouble(str[3]))
                    {
                        Console.Write("\tНе соответствует");
                        Console.WriteLine();
                        continue;
                    }
                }

                if (str[0] == "PN25")
                {
                    if (Math.Round(Convert.ToDouble(str[2])) * 0.165 > Convert.ToDouble(str[3]) || Math.Round(Convert.ToDouble(str[2])) * 0.17 < Convert.ToDouble(str[3]))
                    {
                        Console.Write("\tНе соответствует");
                        Console.WriteLine();
                        continue;
                    }
                }

                Console.WriteLine("\tСоответствует");
            }
            diagnostic("Вывод ифнормации о браке на экран");
            Debug.WriteLine("Вывод ифнормации о браке на экран");
        }

        /// <summary>
        /// Вывод информации о браке по каждому типу продукции
        /// </summary>
        public static void getBreakEach()
        {
            Console.WriteLine("\nК сожалению функция недоступна на данный момент\n");
        }

        /// <summary>
        /// Вывод информации о весе продукции
        /// </summary>
        /// <returns>Суммарынй вес продукции</returns>
        public static double getWeight()
        {
            double r;
            double S;
            double volume;
            double weight;
            double sum = 0; ;
            for (int i = 0; i < array.Length; i++)
            {
                string[] str = array[i].Split(";"); ;
                Console.Write("Тип: " + str[0]);
                Console.Write(". Длина: " + str[1]);
                Console.Write(". Внешний диаметр: " + str[2]);
                Console.Write(". Толщина стенки: " + str[3]);

                if (str[0] == "PN25")
                {
                    Console.Write(". A");
                }
                else
                {
                    Console.Write(". " + str[4]);
                }

                r = (Convert.ToDouble(str[2]) - Convert.ToDouble(str[3])) / 2;
                S = Math.PI * r * r;
                volume = S * Convert.ToDouble(str[1]) * 0.001;

                if (str[4] == "A" && str[0] != "PN25")
                {
                    weight = volume * 1.24;
                }
                else
                {
                    weight = volume * 0.91;
                }

                Console.Write("\tВес: {0:f2} кг", weight/1000);
                sum += weight;
                Console.WriteLine();
            }
            Console.WriteLine("\nВес всей партии в целом: {0:f2} кг", sum / 1000);

            diagnostic("Вывод информации о весе продукции на экран");

            return sum;
        }

        /// <summary>
        /// Запись отладочной информации в файл "Diagnostic.txt"
        /// </summary>
        /// <param name="s">Строка для записи в файл</param>
        public static void diagnostic(string s)
        {
            TextWriterTraceListener tr = new TextWriterTraceListener(File.AppendText("Diagnostic.txt"));
            Trace.Listeners.Add(tr);
            Debug.WriteLine(s);
            Debug.Flush();
            tr.Close();
        }

        /// <summary>
        /// Создание файла "Diagnostic.txt"
        /// </summary>
        public static void firstRun()
        {
            string location = Environment.CurrentDirectory;
            location = location.Insert(location.Length, "\\Diagnostic.txt");
            FileStream file = new FileStream(location, FileMode.Create);
            file.Close();
            diagnostic("Запуск приложения");
            Debug.WriteLine("Запуск приложения");
        }
    }
}