public void UsadHosta() //Usadenie novych hosti do restaurace
        {
            int PredchadzajuciPocetStolov = PocetVolStoly + 1;

            while (PredchadzajuciPocetStolov != PocetVolStoly) // Ak su nejaky hostia cakajuci na vstup, tak ich usadzame, dokym mame volne stoly
            {
                PredchadzajuciPocetStolov = PocetVolStoly;
                if (FrontaNaVstupe.Count > 0)
                {
                    Zakaznik NaVstup = FrontaNaVstupe.Peek();
                    if (NaVstup.PocetStolov <= PocetVolStoly) //ak je pre daneho hosta dost volnych stolov, zakaznik sa usadi
                    {
                        NaVstup        = FrontaNaVstupe.Dequeue();
                        NaVstup.Stav   = StavHosta.Usadeny;
                        PocetVolStoly -= NaVstup.PocetStolov;                                                       //Dane stoly sa obsadia
                        VRestauraci.Add(NaVstup);                                                                   //Zakaznik sa usadi do restaurace
                        KalendarRestaurace.Pridaj(this.cas + 3, Osoba.Casnik, StavHosta.Usadeny, NaVstup.Cislo);    // Do kalendara: ze o 3 minuty si bude chciet zakaznik objednat
                        KalendarRestaurace.Pridaj(this.cas + 3 + 15, Osoba.Host, StavHosta.Usadeny, NaVstup.Cislo); //Do kalendara: trpezlivost 15 min na cekani na objednani u casnika
                    }
                }
            }
            if (MaxPocStol - PocetVolStoly > MaxPotrebStolov)
            {
                MaxPotrebStolov = MaxPocStol - PocetVolStoly;
            }                                                                                                   //udrzujeme si premennu, kolko maximalne bolo sucasne obsadenych stolov
        }
            public void SpracujHotoveJedlo(ref Kalendar kalendar, int cislo, int cas) //Jeden kuchar dovaril jeden chod z objednavky
            {
                foreach (ObjednavkaVKuchyni objednavka in ZoznamPripravovanychObjednavok)
                { //Vyradenie daneho zakaznika z pripravovanych objednavok
                    if (objednavka.CisloObjednavky == cislo)
                    {
                        objednavka.HotoveJedla += 1;                                                             //Jedno jedlo z danej objednavky je hotove
                        PocetVolKuchar         += 1;                                                             //Kuchar, ktory varil dane jedlo sa uvolnil
                        ZamestnajKuchara(ref kalendar, cas);                                                     //Uvolneneho kuchara mozeme zas zamestnat
                        if (objednavka.HotoveJedla == objednavka.CelkovoObjednanych)                             //Objednavka je hotova, moze sa odniest hostom
                        {
                            kalendar.Pridaj(cas, Osoba.Casnik, StavHosta.Objednane, objednavka.CisloObjednavky); //Dame pokyn casnikovy, ze jedlo je hotove a moze ho odniest zakaznikom
                            ZoznamPripravovanychObjednavok.Remove(objednavka);                                   //Hotovu objednavku vyradime z kuchyne
                        }

                        return; // odoberame len prvy vyskyt
                    }
                }
            }
            public void ZamestnajObsluhu(ref Kalendar KalendarRestaurace, ref List <Zakaznik> VRestauraci, ref Kuchyna kuchyna, int cas)
            {
                if (PocetVolObsluha > 0) // Ak je volny casnik, zamestname ho
                {
                    //Vyhladanie ulohy, ktora sa musi spracovat nejdriv. Ak nemame ziadnu ulohu, nic sa nestane.
                    UlohaPreObsluhu NaSpracovanie = null;
                    foreach (UlohaPreObsluhu uloha in ZoznamUlohPreObsluhu)
                    {
                        if ((NaSpracovanie == null) || (uloha.cas < NaSpracovanie.cas))
                        {
                            NaSpracovanie = uloha;
                        }
                    }

                    if (NaSpracovanie != null)                                                     //Ak sa nasla uloha pre obsluhu, tak ta, ktoru treba spracovat nejdriv
                    {
                        ZoznamUlohPreObsluhu.Remove(NaSpracovanie);                                //Odstranenie ulohy zo zoznamu uloh

                        int Pozice = NajdiStolSoZakaznikom(NaSpracovanie.cisloHosta, VRestauraci); //Pozice zakaznika v zozname VRestauraci

                        if (Pozice == -1)                                                          //Host s danym cislem se nenasel v restauraci
                        {
                            Console.WriteLine("CHYBA. Nenasiel sa host s danym cislom, medzi hostami usadenymi v restauraci, chyba moze byt v zruseni udalosti v kalendari, ak hostovy dojde trpezlivost na cakanie na casnika.");
                        }
                        else //Host s danym cislom sa nasiel v restauraci
                        {
                            KalendarRestaurace.Odober(Osoba.Host, VRestauraci[Pozice].Cislo); //Odoberieme z kalendara zakaznikovu trpezlivost
                            PocetVolObsluha -= 1;

                            int CasNaPripravuNapojov;
                            switch (VRestauraci[Pozice].Stav)
                            {
                            case StavHosta.Usadeny:                                                                                                   //Usadeny host si chce objednat, zamestna 1 casnika
                                kuchyna.PridajObjednavkuDoKuchyne(VRestauraci[Pozice].Cislo, VRestauraci[Pozice].jedlo, ref KalendarRestaurace, cas); //Predanie objednavky do kuchyne, to da pokyn kucharom, aby varili
                                VRestauraci[Pozice].Stav = StavHosta.Objednane;

                                //Uvolnenie casnika po tom, co prijme objednavku a donesie zakaznikovi napoje
                                CasNaPripravuNapojov = VRestauraci[Pozice].PocetLudi;                                             //Pre kazdeho zakaznika bude trvat priprava napoja pol minuty
                                KalendarRestaurace.Pridaj(cas + CasNaPripravuNapojov + 3, Osoba.Casnik, StavHosta.Objednane, -1); //Casnika uvolnime za 3 min (cas na prijatie objednavky) + pol minuty za kazdeho hosta na pripravu napoja

                                //Trpezlivost zakaznika na prinesenie jedla, po objednani a prineseni napojov
                                int CasNaCakanieNaJedlo = VRestauraci[Pozice].PocetStolov * 10 + 15;     //Trpezlivost na pripravu jedla bude 15 min + 10 min za kazdy stol daneho zakaznika (viac ludi bude musiet dlhsie cakat na pripravu)
                                KalendarRestaurace.Pridaj(cas + CasNaPripravuNapojov + 3 + CasNaCakanieNaJedlo, Osoba.Host, StavHosta.Objednane, VRestauraci[Pozice].Cislo);
                                break;

                            case StavHosta.Objednane:     //Jedlo je hotove, kuchyna dala pokyn na odnesenie
                                VRestauraci[Pozice].Stav = StavHosta.DoneseneJedlo;

                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Casnik, StavHosta.DoneseneJedlo, -1);                           //Uvolnenie casnika po 2 min, kedy nosi jedlo na stol
                                KalendarRestaurace.Pridaj(cas + 4 + 15, Osoba.Host, StavHosta.DoneseneJedlo, VRestauraci[Pozice].Cislo); //15 min zakaznik je
                                break;

                            case StavHosta.CakaNaObjednanieNapoja:
                                VRestauraci[Pozice].Stav = StavHosta.DonesenyNapoj;

                                CasNaPripravuNapojov = VRestauraci[Pozice].PocetLudi;                                                                           //Pre kazdeho zakaznika bude trvat priprava napoja pol minuty
                                KalendarRestaurace.Pridaj(cas + 3 + CasNaPripravuNapojov, Osoba.Casnik, StavHosta.DonesenyNapoj, -1);                           //Uvolnenie casnika po 1 min na prijatie objednavky + priprava napojov
                                KalendarRestaurace.Pridaj(cas + 3 + CasNaPripravuNapojov + 15, Osoba.Host, StavHosta.DonesenyNapoj, VRestauraci[Pozice].Cislo); //15 min na vypitie napojov
                                break;

                            case StavHosta.Zaplatim:
                                VRestauraci[Pozice].Spokojnost = 0;
                                VRestauraci[Pozice].Stav       = StavHosta.Odchod;
                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Host, StavHosta.Odchod, VRestauraci[Pozice].Cislo);
                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Casnik, StavHosta.Odchod, -1);
                                break;

                            case StavHosta.Odchod:     //Odchod nespokojneho zakaznika z restaurace po uklideni
                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Host, StavHosta.Odchod, VRestauraci[Pozice].Cislo);
                                KalendarRestaurace.Pridaj(cas + 4, Osoba.Casnik, StavHosta.Odchod, -1);
                                break;

                            default:
                                break;
                            }
                        }
                    }
                }
            }
            public void ZamestnajKuchara(ref Kalendar Kalendar, int cas)
            {
                int Pom = -1;
                int i   = 0;

                if (PocetVolKuchar > 0)
                {                                                                  // Najprv dokoncime rozpracovanu objednavku. Ak su vsetky jedla z rozpracovanych objednavom uz v priprave, volny kuchar zacne pracovat na novej objednavke
                    for (int j = 0; j < ZoznamPripravovanychObjednavok.Count; j++) //Zistujeme, ci existuje rozpracovana objednavka, ktoru treba dokoncit
                    {
                        if (ZoznamPripravovanychObjednavok[j].jedlo[0] + ZoznamPripravovanychObjednavok[j].jedlo[1] + ZoznamPripravovanychObjednavok[j].jedlo[2] > 0)
                        {
                            Pom = j;
                        }
                    }

                    if (Pom >= 0)
                    { //V zozname pripravovanych objednavok je este objednavka, ktoru treba dokoncit
                        i = 2;
                        while (ZoznamPripravovanychObjednavok[Pom].jedlo[i] == 0)
                        {
                            i -= 1;
                        }
                        ZoznamPripravovanychObjednavok[Pom].jedlo[i] -= 1;
                        switch (i)
                        {       //podla narocnosti jedla, zamestname jedneho kuchara pripravou jedneho jedla z danej objednavky
                        case 0: //Jedla na pozicii 0 trva pripravit 4 minuty
                            Kalendar.Pridaj(cas + 4, Osoba.Kuchar, StavHosta.Objednane, ZoznamPripravovanychObjednavok[Pom].CisloObjednavky);
                            break;

                        case 1:     //Jedla na pozicii 1 trva pripravit 7 minut
                            Kalendar.Pridaj(cas + 7, Osoba.Kuchar, StavHosta.Objednane, ZoznamPripravovanychObjednavok[Pom].CisloObjednavky);
                            break;

                        case 2:     //Jedla na pozicii 2 trva pripravit 10 minut
                            Kalendar.Pridaj(cas + 10, Osoba.Kuchar, StavHosta.Objednane, ZoznamPripravovanychObjednavok[Pom].CisloObjednavky);
                            break;

                        default:
                            break;
                        }
                        PocetVolKuchar -= 1;
                    }
                    else //Ziadna objednavka uz nie je rozpracovana, teda vezmeme dalsiu objednavku z fronty a zacneme na nej pracovat
                    {
                        if (FrontaObjednavokVKuchyni.Count > 0)
                        {
                            //Najdeme objednavku, ktora prisla najskor
                            ObjednavkaVKuchyni pomocna = null;
                            foreach (ObjednavkaVKuchyni objednavka in FrontaObjednavokVKuchyni)
                            {
                                if ((pomocna == null) || (objednavka.cas < pomocna.cas))
                                {
                                    pomocna = objednavka;
                                }
                            }
                            FrontaObjednavokVKuchyni.Remove(pomocna); //Odstranime objednavku z fronty na pripravu

                            i = 2;                                    //Najdeme jedlo, ktore treba pripravit, od casovo narocnejich po menej narocne
                            while (pomocna.jedlo[i] == 0)
                            {
                                i -= 1;
                            }
                            pomocna.jedlo[i] -= 1;

                            switch (i)
                            {       //podla narocnosti jedla, zamestname jedneho kuchara pripravou jedneho jedla z danej objednavky
                            case 0: //Jedla na pozicii 0 trva pripravit 4 minuty
                                Kalendar.Pridaj(cas + 4, Osoba.Kuchar, StavHosta.Objednane, pomocna.CisloObjednavky);
                                break;

                            case 1:      //Jedla na pozicii 1 trva pripravit 7 minut
                                Kalendar.Pridaj(cas + 7, Osoba.Kuchar, StavHosta.Objednane, pomocna.CisloObjednavky);
                                break;

                            case 2:     //Jedla na pozicii 2 trva pripravit 10 minut
                                Kalendar.Pridaj(cas + 10, Osoba.Kuchar, StavHosta.Objednane, pomocna.CisloObjednavky);
                                break;

                            default:
                                break;
                            }

                            ZoznamPripravovanychObjednavok.Add(pomocna); //Do zoznamu pridame objednavku, kde uz oznacime, ktore jedlo ide dany kuchar pripravit

                            PocetVolKuchar -= 1;                         // Jeden kuchar sa zamestna varenim
                        }
                    }
                }
            }