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

namespace Dopadajici_zareni_Mars_Odysseus
{
    // Do třídy Funkce jsme si napsali všechny funkce, do kterých vkládáme z třídy Program hodnoty 
    // dopadajícího zaření v podobě parametrů. 
    class Funkce
    {
        // Definice privátní proměné random, která nám vytvoří náhodné číslo.
        private Random random = new Random();

        /// <summary>
        /// Tato funkce vypíše, kolik času vám zbývá do překročení limitu při dopadání stejného množství
        /// částic jako dopadlo v této vteřině.
        /// </summary>
        /// <param name="cislo">Částice, které dopadly na povrch v této vteřině</param>
        /// <param name="limit">Limit, který se nemsmí překročit </param>
        /// <param name="zacatecnyCislo">Číslo, od kterého měříme čas do překročení limitu</param>

        private void VypisCas(int cislo, int limit, int zacatecnyCislo)
        {
            int i;  //deklarace čítače cyklu, po každém projetí cyklu se i zvětší o jedna a to nám určuje počet 
                    //vteřn které zbývají do dosažení limiru, i dejlarujeme už na záčátku, aby jsme ho mohli 
                    //vypsat mimo cyklus
            
            if (zacatecnyCislo < limit)
            {
                for (i = 1; zacatecnyCislo <= limit; i++) 
                {
                    zacatecnyCislo += cislo;
                            //v tomto cyklu přičteme k základnímu číslu počet dopadnutého záření doku nepřekročí limit
                         //a tím zjistíme počet vteřin.
                }
                    
                //Výpis přibližného možného pobytu na Marsu
                Console.WriteLine(" Do dosažení maximálního počtu zasažených částic ti přibližně zbývá " + i + " vteřin");
                Console.WriteLine();

               
            }
        }

        /// <summary>
        /// Tato funkce vypisuje náhoná čísla záření v rozmezích, podle toho jak dané zaření dopadá na Mars, a následně
        /// vypisuje, zda je je člověk v pořádku (výpis i se změnou barvy) a následně vypíše funkci VypisCas()
        /// </summary>
        /// <param name="limit">Limit, po jeho překročení může mít člověk vážné zdravodní komplikace (3% šance na zvýšení rakoviny). Limit je udáván v nanosievertech. </param>
        /// <param name="nahodaOd">Nejmenší možná dávka radiace za 1 s, která může na povrch Marsu dopadnout, udáváno v nanosievertech</param>
        /// <param name="nahodaDo">Největší možná dávka radiace za 1 s, která může na povrch Marsu dopadnout, udáváno v nanosievertech</param>

        public void VypisCisla(int limit, int nahodaOd, int nahodaDo) //hodnoty, se kterými potřebujeme pracovat předáváme funkci v parametrech
        {

            int cislo = 0;   //Číslo, které se vypíše, na začátku 0 a po projetí každého cyklu se zvětšuje o náhodnou hodnotu (cislo je hodnota záření, která už člověka na Marsu dopadlo za dobu jeho pobytu)
            int limitPolovina = limit / 2;    //polovina limitu
            int limitCtvrtina = limit / 4;    //čtvrtina limitu
            int limitTriCtvrtiny = limitCtvrtina * 3;    //tři čtvrtiny limitu

            string m = " nanosievertu";

            for (int i = 0; cislo < limit; i++)      // pokud je cislo menší než polovina limitu, provede se následujíci kód
            {

                int random2 = random.Next(nahodaOd, nahodaDo);     // náhodné číslo, hodnota záření která dopadla v dané vteřině(desetinásobek opravdové hodnodnoty, aby šli generovat náhodná čísla)
                cislo = cislo + random2;      // k cislo přičteme hodnotu záření

                if (cislo < limitPolovina)       // pokud je cislo menší než polovina limitu, provede se následujíci kód
                {
                    Console.ForegroundColor = ConsoleColor.DarkGreen;      // změna barvy na zelenou
                    Console.WriteLine("Aktuální hodnota záření: " + (double)cislo/10  + m);      //výpis aktuální hodnoty cisla, převod na desetiné číslo a vydělení 10, aby jsme doslai skutečné číslo dopadu záření
                    Console.WriteLine();     //odřádkování
                    Console.WriteLine(" Záření, které dopadlo v tuto vteřinu: " + (double)random2/10 + m);     //výpis dopadu záření v této vteřině
                    Console.Write(" Stav: ");    //stav člověka nacházejícího se na Marsu
                    if (cislo < limitCtvrtina)      //podmínka
                    {
                        Console.WriteLine("Jsi OK");      // hláška pod čtvrtinou 
                    }
                    else
                    {
                        Console.WriteLine("Jsi docela OK");      //hláška, když je číslo mezí čtvrtinou a polovinou limitu
                    }
                }

                else      //druhá strana první podmínky, vykoná se, pokud první podmínka neplatí
                {

                    if (cislo >= limit)     //pokud číslo je vyšší než limit, vypíše se následující kód
                    {
                        Console.ForegroundColor = ConsoleColor.Red;    // změna barvy na červenou
                        Console.WriteLine("Aktuální hodnota záření: " + (double)cislo/10 + m);     //výpis aktuální hodnoty cisla 
                        Console.WriteLine();
                        Console.WriteLine(" Záření, které dopadlo v tuto vteřinu: " + (double)random2/10 + m );//výpis dopadu záření v této vteřině
                        Console.Write(" Stav: ");   //stav člověka nacházejícího se na Marsu
                        Console.Write(" Přesáhl jsi maximální limit povoleného záření");     // hláška po přesáhnutí limitu
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.DarkYellow;      // změna barvy na žlutou
                        Console.WriteLine("Aktuální hodnota záření: " + (double)cislo/10 + m);        //výpis aktuální hodnoty cisla 
                        Console.WriteLine();
                        Console.WriteLine(" Záření, které dopadlo v tuto vteřinu: " + (double)random2/10 + m);//výpis dopadu záření v této vteřině
                        Console.Write(" Stav: ");       //stav člověka nacházejícího se na Marsu
                        if (cislo < limitTriCtvrtiny)
                        {
                            Console.WriteLine("Přibližuješ se k maximální hodnotě");       //hláška, když je číslo mezi polovinou a třemi čtvrtinami limitu
                        }
                        else
                        {
                            Console.WriteLine("Měl bys vyhledat úkryt");     //hláška po třech čtvrtinách limitu

                        }
                    }
                }

                VypisCas(random2, limit, cislo);        //výpis finkce VypisCas()
                Console.WriteLine();
                Thread.Sleep(1000);          // vlákno uspíme na 1s, aby jsme simulovali dopady po jedné vteřině
            }
        }

        /// <summary>
        /// Metoda vypíše název dopadajíécího zaření, které se začne měřit.
        /// </summary>
        /// <param name="nazev">Tato metoda přejímá jako argument název, který výpíše</param>

        public void NapisNazev(string nazev)
        {
            Console.ForegroundColor = ConsoleColor.Cyan;// změna barvy na modrou
            Console.WriteLine();
            Console.WriteLine(nazev + ": ");//vypsání názvu
            Console.WriteLine();
            Thread.Sleep(100);
        }
    }
}
