program Tehtava834(input, output);

{---------------------------------------------------------------
Komennot ovat:
     V  "vie varastoon", komentorivillä on V-kirjaimen lisäksi
        varastoon lisättävän tuotteen numero ja  lukumäärä,
     O  "ota varastosta", rivillä on tuotteen numero ja lukumäärä
        (jos varastossa ei ole pyydettyä määrää, annetaan mitä 
         voidaan ja ilmoitetaan tuotten loppumisesta; ohjelman 
         suoritus ei silti pääty, voihan jo seuraava komento olla V),
     T  "tulosta varastotilanne",
     L  "lopeta ohjelman suoritus".

  LAAJENNETAAN VÄHÄN:
     H tai ?  "anna apua", ts. 'helppi'
     ' '      "tyhjä komento" 

  SALLITAAN MYÖS PIENET KIRJAIMET KOMENTOINA

  Kokonaisluvut luetaan turvallisesti tehtävän 6.4
  välineellä, etumerkki kuitenkin estetty
------------------------------------------------------------------}

  const ALA = 1000;
        YLA = 1099;

  var varasto: array[ALA..YLA] of integer;
      komento: char;
      loppuu: boolean;

procedure LuePosInteger(var OK: boolean; var arvo: integer);
  var merkki: char;
begin
  OK := false;
  arvo := 0;
  if not eof then
    begin
      read(merkki);
      while (merkki = ' ') and not eof do
        read(merkki);
      if merkki in ['0'..'9'] then
        begin
          OK := true;
          repeat
            arvo := 10*arvo + (ord(merkki)-ord('0'));
            read(merkki)
          until not(merkki in ['0'..'9']);
        end;
    end;
end;

procedure LueArvot(var tuote, maara: integer);
  var tuoteOK, maaraOK: boolean;
begin
  repeat
    maaraOK := false; {jää muuten epämäär., jos jo tuote väärin}
    LuePosInteger(tuoteOK, tuote);
    if not tuoteOK or (tuote < ALA) or (tuote > YLA)then
      begin 
        readln;
        writeln('Tuotenumero väärin! Syötä molemmat uudelleen.');
      end
    else
      begin
        LuePosInteger(maaraOK, maara);
        if not maaraOK then
          begin
            readln;
            writeln('Määrä väärin! Syötä molemmat uudelleen.');
          end;
      end;
  until tuoteOK and maaraOK;
end;

procedure Vienti;
  var tuote, maara: integer;
begin
  LueArvot(tuote, maara);
  writeln('Lisätään varastoon ', maara:1, 
          ' kappaletta tuotetta ', tuote:1, '.');
  varasto[tuote] := varasto[tuote] + maara;
end {Vienti};


procedure Otto;
  var tuote, maara: integer;
 begin
  LueArvot(tuote, maara);
  if maara <= varasto[tuote] then 
    begin
      writeln('Otetaan varastosta ', maara:1, 
              ' kappaletta tuotetta ', tuote:1, '.');
      varasto[tuote] := varasto[tuote] - maara;
    end
  else
    begin
      writeln('Varastossa ei ole tarpeeksi tuotetta ', tuote:1,'!');
      writeln('Otetaan varastosta vain ', varasto[tuote]:1, 
              ' kappaletta tuotetta ', tuote:1,'.');
      varasto[tuote] := 0;
    end;
end; {Otto}

procedure Tilanne;
  var i: integer;
begin
  readln;
  writeln;
  writeln('Varastotilanne (vain tuotteet, joita on):');
  writeln('==============');
  writeln;
  writeln('tuote     määrä');
  for i := ALA to YLA do
    if varasto[i] <> 0 then
      writeln(i:5,  varasto[i]:10);
  writeln;
end; {Tilanne}

procedure Loppu;
begin 
  readln;
  writeln('Näkemiin!');  {myöhemmin tallennet. tiedostoon!}
  loppuu := true;
end; {Loppu}

procedure Apua;
begin 
  readln;
  writeln;
  writeln('Komennot ovat: V määrä, O määrä, T, L ja H');
  writeln;
  writeln('               V t m    lisää varastoon tuotetta t m kappaletta');
  writeln('               O t m    ottaa varastosta tuotetta t m kappaletta');
  writeln('               T        tulostaa varastotilanteen');
  writeln('               L        lopettaa ohjelman');
  writeln('               H ja ?   tulostaa tämän ohjeen');
  writeln('               (myös pienet kirjaimet kelpaavat)');
  writeln;
end {Apua};

procedure Alkutoimet;
  var i: integer;
begin
  writeln;
  writeln('Varastokirjanpito-ohjelma');
  writeln('*************************');
  writeln;
  writeln('Komennolla H (tai h tai ?) saat apua.');
  writeln;
  for i := ALA to YLA do
    varasto[i] := 0;   {myöhemmin luetaan tiedostosta!}
end {Alkutoimet};

function Oikein(kom: char): boolean;
begin
  if kom in [' ','V','v','O','o','T','t','L','l','H','h','?'] then 
    Oikein := true
  else
    begin
      writeln('         ^--- Virheellinen komento! ');
      Apua;
      Oikein := false
    end;      
end {Oikein};


begin
  Alkutoimet;
  loppuu := false;
  repeat 
    write('varasto> ');
    read(komento);
    if Oikein(komento) then
      case komento of
        'V', 'v'    : Vienti;
        'O', 'o'    : Otto;
        'T', 't'    : Tilanne;
        'L', 'l'    : Loppu;
        'H','h','?' : Apua;
        ' '         : {tyhjä komento!};
      end {case};
  until loppuu;
end.

