import java.awt.*;
import java.awt.event.*;
import java.io.*;

/* 
 * ATM automata egyenlegmodosito osztalya
 */
class EgyenlegModositasAblak extends Frame 
                             implements ActionListener, 
                                        MouseListener,
                                        Runnable
{
   Button visszaButton,  /* vissza az automatahoz */
          kiveszButton,  /* gyurun levo egyenleg csokkentese, es a szamla novelese*/
          hozzaadButton, /* gyurun levo egyenleg novelese, es a szamla csokkentese*/
          feltoltButton, /* a valtoztatasok elvegzese */
          melyikButton;  /* a szamla es egyenleg valtoztatasahoz kell */
   Label szamlaLabel,    /* a szamlan levo penz */
         egyenlegLabel;  /* a gyurun levo penz */
   Thread thread;        /* a gyurut figyelo szal */
   String iButtonID = new String("");    /* a legelso gyuru azonositoja (ATM-tol kapja) */
   String ATMazonosito = new String(""); /* az ATM automata azonositoja */

   int Szamla = 0;       /* kesobb lekerdezzuk a valodi erteket */
   int Egyenleg = Gyuru.eszkoz.egyenlegKerdez();

   public EgyenlegModositasAblak(String azonosito, String ID) 
   {
      iButtonID = ID;
      ATMazonosito = azonosito;
      Szamla = Gyuru.bank.szamlaKerdez(ATMazonosito,iButtonID);

      setLayout(new BorderLayout());
      
      setSize(400, 200);
      setResizable(false);
      setLocation(250,200);

      Panel gombPanel = new Panel();
      {
       gombPanel.setLayout(new FlowLayout());
       visszaButton = new Button("Vissza az ATM automat\u00e1hoz");
       {
        gombPanel.add(visszaButton);
        visszaButton.addActionListener(this);
       }
       add("South",gombPanel);
      }

      Panel szovegPanel = new Panel();
      {
       szovegPanel.setLayout(new BorderLayout());
       Panel penzPanel = new Panel();
       {
        penzPanel.setLayout(new FlowLayout());
        Panel egyenlegPanel = new Panel();
        {
         egyenlegPanel.setLayout(new BorderLayout());
         {
          egyenlegPanel.add("North",new Label("Egyenleg: "));
          egyenlegLabel = new Label(Integer.toString(Egyenleg));
          {
           egyenlegPanel.add("South",egyenlegLabel);
          }
         }
         penzPanel.add("Center",egyenlegPanel);
        }
        kiveszButton = new Button("-");
        {
         penzPanel.add(kiveszButton);
         kiveszButton.addActionListener(this);
         kiveszButton.addMouseListener(this);
        }
        hozzaadButton = new Button("+");
        {
         penzPanel.add(hozzaadButton);
         hozzaadButton.addActionListener(this);
         hozzaadButton.addMouseListener(this);
        }
        Panel szamlaPanel = new Panel();
        {
         szamlaPanel.setLayout(new BorderLayout());
         {
          szamlaPanel.add("North",new Label("Sz\u00e1mla: "));
          szamlaLabel = new Label(Integer.toString(Szamla));
          {
           szamlaPanel.add("South",szamlaLabel);
          }
         }
         penzPanel.add("Center",szamlaPanel);
        }
        szovegPanel.add("North",penzPanel);
       }
        Panel feltoltPanel = new Panel();
        {
         feltoltPanel.setLayout(new BorderLayout());
         feltoltButton = new Button("Felt\u00f6lt\u00e9s!");
         {
          feltoltPanel.add("Center",feltoltButton);
          feltoltButton.addActionListener(this);
         }
         szovegPanel.add("South",feltoltPanel);
        }
       add("Center",szovegPanel);
      }
      thread = new Thread(this);
      thread.start();
   }

   public void run()
   {
      boolean haveiButton = !(Gyuru.eszkoz.eszkozJelen()&&
                              Gyuru.eszkoz.appletJelen());
      while (true)
      {
         try
         {
            Thread.sleep(250);
         }
         catch (InterruptedException e)
         {
         }

         try
         {
            if (haveiButton&& 
                !(Gyuru.eszkoz.eszkozJelen()&&
                  Gyuru.eszkoz.appletJelen()))
            {
               haveiButton = false;
               setTitle("Egyenleg m\u00f3dos\u00edt\u00e1sa az "+
                        "eszk\u00f6z\u00f6n (nincs eszk\u00f6z jelen)");
               kiveszButton.setEnabled(false);
               hozzaadButton.setEnabled(false);
               egyenlegLabel.setVisible(false);
               szamlaLabel.setVisible(false);
               feltoltButton.setEnabled(false);
            }
            else if (!haveiButton&& 
                     (Gyuru.eszkoz.eszkozJelen()&&
                      Gyuru.eszkoz.appletJelen()))
            {
               haveiButton = true;
               if(!iButtonID.equals(Gyuru.eszkoz.getiButtonID()))
               {
                  setTitle("Egyenleg m\u00f3dos\u00edt\u00e1sa az "+
                           "eszk\u00f6z\u00f6n "+
                           "(eszk\u00f6z megv\u00e1ltozott)");
                  kiveszButton.setEnabled(false);
                  hozzaadButton.setEnabled(false);
                  egyenlegLabel.setVisible(false);
                  szamlaLabel.setVisible(false);
                  feltoltButton.setEnabled(false);
               }
               else
               {
                  Egyenleg = Gyuru.eszkoz.egyenlegKerdez();
                  Szamla = Gyuru.bank.szamlaKerdez(ATMazonosito,iButtonID);
                  egyenlegLabel.setText(Integer.toString(Egyenleg));
                  szamlaLabel.setText(Integer.toString(Szamla));
                  setTitle("Egyenleg m\u00f3dos\u00edt\u00e1sa az "+
                           "eszk\u00f6z\u00f6n "+
                           "(eszk\u00f6z el\u00e9rhet\u00f4)");
                  kiveszButton.setEnabled(true);
                  hozzaadButton.setEnabled(true);
                  egyenlegLabel.setVisible(true);
                  szamlaLabel.setVisible(true);
                  feltoltButton.setEnabled(true);
               }
            }
         }
         catch(NullPointerException e)
         {
         }
         if(melyikButton==hozzaadButton)
         {
            /* Egyenleg novelese */
            if(Szamla>0)
            {
               Szamla-=1;
               Egyenleg+=1;
               egyenlegLabel.setText(Integer.toString(Egyenleg));
               szamlaLabel.setText(Integer.toString(Szamla));
            }
         }
         else if(melyikButton==kiveszButton)
         {
            /* Egyenleg csokkentese */
            if(Egyenleg>0)
            {
               Szamla+=1;
               Egyenleg-=1;
               egyenlegLabel.setText(Integer.toString(Egyenleg));
               szamlaLabel.setText(Integer.toString(Szamla));
             }
         }
      }
   }

   /* 
    * a modositasok lejegyzese (log)
    */
   private void write(int elozoEgyenleg)
   {
      try
      {
         String s;
         RandomAccessFile raf = new RandomAccessFile(new File("egyenleg.txt"),"rw");
         /* a file vegere irunk */
         raf.seek(raf.length());
         /* formatum: <gyuruazonosito> $<elozo egyenleg a gyurun> $<modositott egyenleg><ujsor> */
         s = kodol(Gyuru.eszkoz.getiButtonID()+" $"+elozoEgyenleg+" $"+Egyenleg+"\n");
         raf.writeBytes(s);
      }
      catch(IOException e)
      {
         System.out.println("\u00cdr\u00e1si hiba: egyenleg.txt");
      }
      catch(SecurityException e)
      {
         System.out.println("Hozz\u00e1f\u00e9r\u00e9si hiba: egyenleg.txt");
      }
   }
   
   /*
    * a logfile-ba kerulo adatok kodolasa (erdemes idotol fuggo kodolsat alkalmazni)
    */
   private String kodol(String s)
   {
      return(s);
   }

   public void mouseClicked(MouseEvent evt)
   {
   }

   public void mousePressed(MouseEvent evt)
   {
      if(evt.getSource()==hozzaadButton)
      {
         melyikButton=hozzaadButton;
      }
      else if(evt.getSource()==kiveszButton)
      {
         melyikButton=kiveszButton;
      }
   }

   public void mouseReleased(MouseEvent evt)
   {
      melyikButton=null;
   }

   public void mouseEntered(MouseEvent evt)
   {
   }

   public void mouseExited(MouseEvent evt)
   {
   }

   public void actionPerformed(ActionEvent evt)
   {
      if(evt.getSource()==visszaButton)
      {
         /* Vissza */
         dispose();
         thread.stop();
         Gyuru.atmablak = new ATMAblak();
         Gyuru.atmablak.show();
      }
      else if(evt.getSource()==hozzaadButton)
      {
         /* Egyenleg novelese */
         if(Szamla>0)
         {
            Szamla-=1;
            Egyenleg+=1;
            egyenlegLabel.setText(Integer.toString(Egyenleg));
            szamlaLabel.setText(Integer.toString(Szamla));
         }
      }
      else if(evt.getSource()==kiveszButton)
      {
         /* Egyenleg csokkentese */
         if(Egyenleg>0)
         {
            Szamla+=1;
            Egyenleg-=1;
            egyenlegLabel.setText(Integer.toString(Egyenleg));
            szamlaLabel.setText(Integer.toString(Szamla));
          }
       }
       else if(evt.getSource()==feltoltButton)
       {
          /* A modositasok elvegzese */
          int elozoEgyenleg = Gyuru.eszkoz.egyenlegKerdez();
          int mennyivel = Egyenleg-elozoEgyenleg;
          if(Gyuru.eszkoz.egyenlegModosit(
                true,
                Gyuru.bank.jelszoKerdez(ATMazonosito, iButtonID),
                mennyivel))
          {
             /* lejegyezzuk a valtoztatasokat */
             write(elozoEgyenleg);
             dispose();
             thread.stop();
             Gyuru.atmablak = new ATMAblak();
             Gyuru.atmablak.show();
          }
          else
          {
             Egyenleg = Gyuru.eszkoz.egyenlegKerdez();
             egyenlegLabel.setText(Integer.toString(Egyenleg));
          }
       }
   }

}