/// <summary>
        ///     U1 - Príchod zákazníka
        ///     Naplánujem:
        ///     -	Začiatok spracovania objednávky - naplánujem udalosť okamžite, ak je volny pracovnik.
        ///     -	Front čakajúcich zákazníkov - Vložím do frontu čakajúcich zákazníkov zákazníka s aktuálnym časom príchodu.
        ///     -	Príchod nového zákazníka s vygenerovaným časom z Generátora 1.
        ///     Štatistiky:
        ///     -	S1a - Začnem merať čas čakania zákazníka v rade čakajúcich zákazníkov na zadanie objednávky.
        ///     -	S2a  – Pripočítam jedného zákazníka v rade čakajúcich zákazníkov.
        ///     -	S3a - Začnem počítať čas strávený zákazníkov v servise.
        /// </summary>
        public override void Execute()
        {
            if (AktualnyZakaznik == null)
            {
                throw new Exception("NULL zakaznik. ");
            }

            AktualnyZakaznik.S1_ZacniCakanie_front_cakajucich_zakaznikov(EventTime);
            AktualnyZakaznik.S3_ZacniCakanie_bytia_v_servise(EventTime);
            ((AppCore)ReferenceSimCore).S2_AddValue();

            if (((AppCore)ReferenceSimCore).JeVolnyPracovnik1())
            {
                //obsad volneho pracovnik
                ((AppCore)ReferenceSimCore).ObsadPracovnikaSkupiny1();

                var zadanie = new ZaciatokSpracovaniaObjednavkyEvent(EventTime, ReferenceSimCore, AktualnyZakaznik);
                ReferenceSimCore.ScheduleEvent(zadanie);
            }
            else
            {
                ((AppCore)ReferenceSimCore).S2_AddValue();

                //inak vlozim zakaznika do frontu cakajucich zakaznikov
                ((AppCore)ReferenceSimCore).Front_CakajuciZakaznici_PridajZakaznika(AktualnyZakaznik);
            }

            //naplanujem novy prichod zákazníka
            var a       = ((AppCore)ReferenceSimCore).Gen.Generator1_ZakazniciPrichod();
            var time    = EventTime + a;
            var prichod = new PrichodZakaznikaEvent(time, ReferenceSimCore, new Zakaznik());

            ReferenceSimCore.ScheduleEvent(prichod);
        }
        /// <summary>
        ///     U5 - Preparkovanie auta k dielni
        /// </summary>
        /// Vyberiem opravené auto z frontu opravených áut.
        /// Naplánujem:
        /// -	Začiatok opravy v okamžitom čase, ak je voľný pracovník skupiny 2. Obsadím pracovníka 2 skupiny.
        /// -	Front pokazených áut - Pridám auto (aktuálneho zákazníka) do frontu pokazených áut, ak existuje a zároveň nie je voľný pracovník skupiny 2.
        /// -	Preparkovanie auta späť zákazníkovi – prioritne (pracovníci skupiny 1 uprednostňujú vrátenie opraveného auta zákazníkovi pred prijatím novej objednávky). Vyberiem opravené auto z frontu opravených áut. Ak nie je front opravených prázdny, tak naplánujem udalosť s vygenerovaným časom Generátora 5 – preparkovanie s opraveným autom.
        /// -	Začiatok spracovania objednávky  - s druhou prioritou, ak je front opravených áut prázdny a zároveň nie je front čakajúcich zákazníkov prázdny. Vyberiem zákazníka z frontu čakajúcich zákazníkov. Naplánujem okamzite.
        /// -	Uvoľnenie pracovníka – ak front opravených áut prázdny, a zároveň front čakajúcich zákazníkov, tak uvoľním pracovníka skupiny 1.
        public override void Execute()
        {
            if (AktualnyZakaznik != null)
            {
                if (((AppCore)ReferenceSimCore).JeVolnyPracovnik2())
                {
                    ((AppCore)ReferenceSimCore).ObsadPracovnikaSkupiny2();

                    //naplanujem zaciatok opravy
                    var oprava = new ZaciatokOpravyEvent(EventTime, ReferenceSimCore, AktualnyZakaznik);
                    ReferenceSimCore.ScheduleEvent(oprava);
                }
                else
                {
                    //vlozim do frontu auto pokazenych aut
                    ((AppCore)ReferenceSimCore).Front_PokazeneAuta_Pridaj(AktualnyZakaznik);
                }
            }

            var opraveneAuto = ((AppCore)ReferenceSimCore).Front_OpraveneAuta_Vyber();

            //PRIORITNE
            if (opraveneAuto != null)
            {
                //cas preparkovanie spat
                var casPreparkovania = EventTime + ((AppCore)ReferenceSimCore).Gen.Generator5_Preparkovanie();

                //vyberiem auto z frontu
                //preparkovanie auta naspat
                var preparkovanieNaspat = new PreparkovanieAutaSpatEvent(casPreparkovania, ReferenceSimCore,
                                                                         opraveneAuto);
                ReferenceSimCore.ScheduleEvent(preparkovanieNaspat);
            }
            else
            {
                ((AppCore)ReferenceSimCore).S2_AddValue();
                var cakajuciZakaznik = ((AppCore)ReferenceSimCore).Front_CakajuciZakaznici_VyberZakaznika();

                //NEPRIORITNE
                if (cakajuciZakaznik != null)
                {
                    //vyberiem z frontu cakajucich zakaznikov
                    //naplanujem zaciatok obsluhy
                    var zaciatokObsluhy = new ZaciatokSpracovaniaObjednavkyEvent(EventTime, ReferenceSimCore,
                                                                                 cakajuciZakaznik);
                    ReferenceSimCore.ScheduleEvent(zaciatokObsluhy);
                }
                else
                {
                    //uvolnim pracovnika 1
                    ((AppCore)ReferenceSimCore).UvolniPracovnikaSkupiny1();
                }
            }
        }