program mehubaari(input, output);
   uses Crt;

   const eka = 1;
   type nim = string[60]; {epästandardi turbo-pascal piirre}
        nimet  = record
                    nimi : nim;
                    kpl  : integer;
                 end;

{---------tähän jonon tyyppimäärittelyt: --------------------}


{------------------------------------------------------------}

   var komento : char;

{---------tähän jonon muuttujat: ----------------------------}
       jono : array [1..10] of nimet;
       vika : 0..10;
       turva : file of nimet;


function LueLuku(ala, yla, vanha : longint) : longint;
  var luku : longint;
      kunnossa : boolean;
      koodi :integer;
      jono : string[10];
      x, y : integer;
  begin
    kunnossa := false;
    textcolor(lightgray);
    write('(oletus on ',vanha:1,')   ');
    textcolor(lightcyan);
    x := wherex; y:= wherey;
    repeat
      gotoxy(x, y);
      ClrEol;
      readln(jono);
      if jono = '' then
        begin
          luku := vanha;
          kunnossa := true;
        end
      else
        begin
          Val(jono, luku, koodi);
          if koodi <> 0 then
            begin
              writeln('Arvon on oltava numeerinen.                           ');
              kunnossa := false;
            end
          else
            if (ala <= luku) and (luku <= yla) then
              kunnossa := true
            else
              writeln('Arvon on oltava välillä: ',ala:1,' - ', yla:1);
        end;
      until kunnossa;
      LueLuku := luku;
  end;


{---------tähän jonon operaatiot: ---------------------------}

procedure Jonoon(N: nimet);
   begin
      if vika >= 10 then
         begin
            TextBackground(yellow);
            TextColor(white+blink);
            writeln('Jonossa ei ole tilaa! Tule myöhemmin uudelleen.');
            writeln('                            ENTERILLÄ eteenpäin');
            readln;
         end
      else
         begin
            vika := vika + 1;
            jono[vika] := N
         end;
   end;

procedure Jonosta(var N: nimet);
  {Jos jono on tyhjä, asetetaan N:n kenttä nimi tyhjäksi merkkijonoksi}
   var i : integer;
   begin
       if vika = 0 then
          N.nimi := ''
       else
          begin
             N := jono[eka];
             for i := eka to vika - 1 do
                jono[i] := jono[i+1];
             vika := vika-1;
          end;
   end;

procedure LuoTyhjaJono;
   begin
      vika := 0;
   end;


procedure Turvaan;
   var i : integer;
   begin
      assign(turva, 'a:jono.tur'); { TURBOA }
      rewrite(turva);
      for i := eka to vika do
         write(turva, jono[i]);
      close(turva);                 {turboa}
   end;

procedure Turvasta;
   begin
      assign(turva, 'a:jono.tur'); { turboa }
      reset(turva);
      if eof(turva) then
         LuoTyhjaJono
      else
         begin
             vika := 0;
             while not eof(turva) do
                begin
                   vika := vika + 1;
                   read(turva, jono[vika]);
                end;
         end;
      close(turva);                {turboa}
   end;




{---------tähän päättyy jonon toteutus-----------------------------}


   procedure TulostaValikko;
      begin
         TextBackground(blue);
         TextColor(White);
         ClrScr;
         writeln; writeln; writeln;
         writeln('                             ');
         writeln('     MEHUBAARIN JONOTUS      ');
         writeln('     ******************      ');
         writeln('                             ');
         writeln('                             ');
         writeln('     j) lisää jonottaja      ');
         writeln('     p) palvele ensimmäistä  ');
         writeln('     l) loppu                ');
         writeln('                             ');
      end;

   procedure Lisays;
      var nimi : nim;
          montako : integer;
          asiakas : nimet;
      begin
          repeat
             TextColor(black);
             write(' Asiakkaan nimi? ');
             TextColor(lightgreen);
             readln(nimi);
             if nimi = '' then
                writeln('Tyhjä nimi ei kelpaa, anna uudelleen!');
          until nimi <> '';
          write('Paljonko asiakas haluaa?  ');
          montako := LueLuku(1, 10, 2);
          asiakas.nimi := nimi;
          asiakas.kpl := montako;
          Jonoon(asiakas);
      end;

   procedure Palvelu;
      var asiakas : nimet;
      begin
         Jonosta(asiakas);
         TextBackground(green);
         TextColor(White);
         ClrScr;
         writeln;
         if asiakas.nimi <> '' then
               writeln('NYT PALVELLAAN HENKILÖÄ NIMELTÄ >>> ',
                       asiakas.nimi, '  ', asiakas.kpl:1, ' kappaletta <<<')
         else
            begin
               writeln('KETÄÄN EI OLE JONOSSA!! (Lepää vaikka!)');
               Sound(440);
               Delay(1000);
               Sound(round(3/2 * 440));
               Delay(1000);
               Sound(round(5/4 * 440));
               Delay(1000);
               Sound(440);
               Delay(2000);
               NoSound;
            end;
         writeln; writeln;
         TextColor(lightblue);
         writeln('                           ENTERILLÄ eteenpäin');
         readln;
      end;

   begin {PÄÄOHJELMA}
      Turvasta;
      repeat
         TulostaValikko;
         komento := ReadKey;
         if komento in ['j', 'J', 'p', 'P', 'l', 'L'] then
            case komento of
               'j', 'J' : Lisays;
               'p', 'P' : Palvelu;
               'l', 'L' : ;
            end;
      until komento in ['l', 'L'];
      Turvaan;
   end.

