with Ada.Calendar;
use Ada.Calendar;

package body Rozwiazanie is
   task body Przystan is
      liczba_pasazerow       : Natural := 0;
      liczba_sprzedanych     : Natural := 0;
      suma_cen              : Integer := 0;
      rejs_nr               : Natural := 0;
      oczekujacy_pasazerowie : Natural := 0; -- Nowa zmienna

      rejs_rozpoczety       : Boolean := False;
      pracownik_zainicjowal : Boolean := False;
      wchodzenie            : Boolean := True;
      pasazerowie_do_wejscia : Natural := 0;
      pasazerowie_do_zejscia : Natural := 0;
      last_activity         : Time := Clock;

      procedure Update_Activity is
      begin
         last_activity := Clock;
      end Update_Activity;

      procedure Start_Rejs_If_Ready is
      begin
         if (liczba_sprzedanych = MAX) or else
            (suma_cen >= WYSTARCZY) or else
            (pracownik_zainicjowal)
         then
            if pasazerowie_do_wejscia = oczekujacy_pasazerowie then
               rejs_rozpoczety := True;
               pasazerowie_do_zejscia := oczekujacy_pasazerowie;
               wchodzenie := False;
            end if;
         end if;
      end Start_Rejs_If_Ready;

   begin
      loop
         select
            accept Kasa (cena : in Integer; bilet : out Integer) do
               Update_Activity;

               if cena = 0 then
                  pracownik_zainicjowal := True;
                  -- Obsługa rejsu technicznego bez pasażerów
                  if oczekujacy_pasazerowie = 0 then
                     rejs_rozpoczety := True;
                     pasazerowie_do_zejscia := 0;
                     rejs_nr := rejs_nr + 1;
                     liczba_sprzedanych := 0;
                     suma_cen := 0;
                     pracownik_zainicjowal := False;
                     wchodzenie := True;
                     pasazerowie_do_wejscia := 0;
                     oczekujacy_pasazerowie := 0;
                  end if;
               else
                  suma_cen := suma_cen + cena;
                  liczba_sprzedanych := liczba_sprzedanych + 1;
                  oczekujacy_pasazerowie := oczekujacy_pasazerowie + 1;
               end if;

               bilet := rejs_nr;
               Start_Rejs_If_Ready;
            end Kasa;

         or
            when wchodzenie =>
               accept Wejdz do
                  Update_Activity;
                  liczba_pasazerow := liczba_pasazerow + 1;
                  pasazerowie_do_wejscia := pasazerowie_do_wejscia + 1;
                  Start_Rejs_If_Ready;
               end Wejdz;

         or
            when not wchodzenie and pasazerowie_do_zejscia > 0 =>
               accept Zejdz do
                  Update_Activity;
                  liczba_pasazerow := liczba_pasazerow - 1;
                  pasazerowie_do_zejscia := pasazerowie_do_zejscia - 1;

                  if pasazerowie_do_zejscia = 0 then
                     rejs_nr := rejs_nr + 1;
                     liczba_sprzedanych := 0;
                     suma_cen := 0;
                     pracownik_zainicjowal := False;
                     wchodzenie := True;
                     pasazerowie_do_wejscia := 0;
                     oczekujacy_pasazerowie := 0;
                  end if;
               end Zejdz;

         or
            delay 1.0;
            if Clock - last_activity > Duration(1.0) then
               exit;
            end if;
         end select;
      end loop;
   end Przystan;

end Rozwiazanie; moj kod nie przechodzi testu VIPy bilety powinne byc dla nich za 200 a rejs sie odbywac odrazu bo osiaga juz prog cenowy