public void Odober(Osoba kdo, int host)
 {
     for (int i = 0; i < zoznam.Count; i++)
     {
         if ((zoznam[i].kdo == kdo) && (zoznam[i].host == host))
         {
             Udalost ud = zoznam[i];
             zoznam.Remove(ud);
         }
     }
     return; // odoberame vstky vyskyty, to je potrebne, napr. ak odchadza zakaznik, ktoreho jedlo uz kuchari pripravuju, potrebujeme zrusit vsetkych tychto kucharov
 }
 public void OdoberZKalendara(ref Kalendar Kalendar, int cislo, int cas)
 {
     for (int i = 0; i < Kalendar.zoznam.Count; i++)
     {
         if ((Kalendar.zoznam[i].kdo == Osoba.Kuchar) && (Kalendar.zoznam[i].host == cislo))
         {
             Udalost ud = Kalendar.zoznam[i];
             Kalendar.zoznam.Remove(ud);
             PocetVolKuchar += 1; //odstranili sme z kalendara zamestnanych kucharov, pracujucich na objednavke, pre zakaznika, ktory odchadza
             ZamestnajKuchara(ref Kalendar, cas);
         }
     }
     return;
 }
        public Udalost Vyber() //Vrati udalost, ktora sa udeje ako prva v zozname udalosti.
        {
            Udalost help = null;

            foreach (Udalost udalost in zoznam)
            {
                if ((help == null) || (udalost.kdy < help.kdy))
                {
                    help = udalost;
                }
            }
            if (help != null)
            {
                zoznam.Remove(help);
            }
            return(help);
        }
        public void Vypocet()
        {
            KalendarRestaurace.Pridaj(1, Osoba.Host, StavHosta.NovyHost, 0);  // pridame do kalendara prichod prveho hosta

            Udalost udalost = null;

            while ((udalost = KalendarRestaurace.Vyber()) != null) //cyklus v ktorom vyberame z kalendara udalosti podla casu a spracuvavame ich
            {
                cas = udalost.kdy;                                 // Aktualizace casu
                //Console.Write("CAS: " + cas + " Obs.: " + ObsluzenychLudi + " Odch.: " + LudiaOdisli + " kto " + udalost.kdo + " cislo " + udalost.host + " stav " + udalost.akce);

                if (udalost.kdo == Osoba.Host)
                {
                    switch (udalost.akce)
                    {
                    case StavHosta.NovyHost:                                                          // Generovanie a vstup noveho hosta do restaurace
                        GenerujNovehoHosta(ref CisloZakaznika);
                        int Pom1 = 1;                                                                 //rnd.Next(1, 11);
                        if (cas + Pom1 < MaxCas - 30)                                                 //30 min pred zaverecnou uz negenerujeme novych hosti, takze uz generovani nedame do kalendara
                        {
                            KalendarRestaurace.Pridaj(cas + Pom1, Osoba.Host, StavHosta.NovyHost, 0); //Do kalendara: generovanie noveho hosta nahodne o 1 az 10 minut
                        }
                        break;

                    case StavHosta.Usadeny:                           //Ak nastane tato situace, zakaznik cakal pridlho na objednanie jedla
                        //Console.WriteLine();
                        obsluha.OdstranZakaznika(udalost.host);       //Odstranenie daneho hosta zo zoznamu ukolov obsluhy
                        ZakaznikOdchadzaZRestaurace(udalost.host, 0); //Nespokojny zakaznik odchadza, netreba uklidit, zakaznik si ani neobjednal
                        break;

                    case StavHosta.Objednane:                                                                              //Ak nastane tato situace, zakaznik cakal pridlho na prinesenie jedla
                        //Console.WriteLine();
                        kuchyna.OdstranZakaznika(udalost.host);                                                            //Odstranenie daneho hosta zo zoznamov v kuchyni
                        kuchyna.OdoberZKalendara(ref KalendarRestaurace, udalost.host, cas);                               //Odobratie rozpracovanych jedal daneho hosta
                        obsluha.OdstranZakaznika(udalost.host);                                                            //Odstranenie daneho hosta zo zoznamu ukolov obsluhy
                        obsluha.OdoberZKalendara(ref KalendarRestaurace, udalost.host, ref VRestauraci, ref kuchyna, cas); //Odobratie volanie obsluhy kucharom na prinesenie jedla
                        ZakaznikOdchadzaZRestaurace(udalost.host, 0);                                                      //Zakaznik odchhadza, nie je potrebne uklidit, este nejedli
                        break;

                    case StavHosta.DoneseneJedlo:                                                        //Sytuacia, kedy zakaznik doje svoje jedlo. V tomto momente sa rozodne, ci odchadza, alebo si objedna dalsi napoj
                    case StavHosta.DonesenyNapoj:                                                        //Sytuacia, kedy zakaznik dopije napoj. Zachova sa rovnako, ako po dojedeni jedla
                        //Console.WriteLine();
                        int Pozice           = obsluha.NajdiStolSoZakaznikom(udalost.host, VRestauraci); //Pozice hosta v restauraci
                        int OdchodAleboNapoj = rnd.Next(1, 101);                                         //nahodne cislo od 1 do 100

                        if ((cas < MaxCas) && (OdchodAleboNapoj <= 20))
                        {                                                                                                    //Cas este nedosiahol maxima, host si moze este objednat napoj. Objedna napoj s pravdepodobnosti 20%
                            VRestauraci[Pozice].Stav = StavHosta.CakaNaObjednanieNapoja;
                            KalendarRestaurace.Pridaj(cas, Osoba.Casnik, StavHosta.CakaNaObjednanieNapoja, udalost.host);    //Zavolanie casnika na objednanie napoja
                            KalendarRestaurace.Pridaj(cas + 15, Osoba.Host, StavHosta.CakaNaObjednanieNapoja, udalost.host); //Trpezlivost na cakanie na casnika
                        }
                        else                                                                                                 //Cas prekrocil max cas, teda uz neprijimame objednavky, host musi odist alebo si uz host nechce objednat
                        {
                            VRestauraci[Pozice].Stav = StavHosta.Zaplatim;                                                   //Host si uz nic neobjednava, chce odist, musi teda este zaplatit, zavola casnika
                            KalendarRestaurace.Pridaj(cas, Osoba.Casnik, StavHosta.Zaplatim, udalost.host);                  //Zavolanie casnika, chceme zaplatit
                            KalendarRestaurace.Pridaj(cas + 20, Osoba.Host, StavHosta.Zaplatim, udalost.host);               //Trpezlivost na cakanie na zaplatenie
                        }
                        break;

                    case StavHosta.CakaNaObjednanieNapoja:            //Vyprsala trpezlivost na cakanie na objednanie napoja, host odchadza
                    case StavHosta.Zaplatim:                          //Vyprsala trpezlivost na cakanie na naplatenie, odchadza
                        obsluha.OdstranZakaznika(udalost.host);       //Odstranime zakaznika zo zoznamu ukolov daneho casnika
                        ZakaznikOdchadzaZRestaurace(udalost.host, 1); //Nespokojny zakaznik odchadza, zakaznik uz jedol, takze treba uklidit
                        //Console.WriteLine();
                        break;

                    case StavHosta.Odchod:
                        ZakaznikOdchadzaZRestaurace(udalost.host, 0);     //Zakaznik odchadza, stol uvolnime po uklideni
                        //Console.WriteLine();
                        break;

                    default:
                        break;
                    }
                }
                else if (udalost.kdo == Osoba.Casnik)
                {
                    //Console.WriteLine();
                    obsluha.SpracujUlohu(cas, udalost.host, ref KalendarRestaurace, ref VRestauraci, ref kuchyna);
                    if (MaxPocObsl - obsluha.PocetVolObsluha > MaxPotrebObsluha)
                    {
                        MaxPotrebObsluha = MaxPocObsl - obsluha.PocetVolObsluha;
                    }
                }
                else //udalost.kdo == Osoba.Kuchar
                { //tato moznost nastane iba ked kuchar dovari nejake jedlo
                    //Console.WriteLine();
                    //Najprv zistime ci nie je zmena v max potrebnom pocte kucharov, lebo dalej sa kuchar uvolni
                    if (MaxPocKuch - kuchyna.PocetVolKuchar > MaxPotrebKuchar)
                    {
                        MaxPotrebKuchar = MaxPocKuch - kuchyna.PocetVolKuchar;
                    }

                    kuchyna.SpracujHotoveJedlo(ref KalendarRestaurace, udalost.host, cas);
                }
            }
            return;
        }