import java.awt.*;
import java.lang.*;
import java.io.*;
import java.util.*;

public class ManagerList
{
  protected long managerNo, PIN, cardNo;

  private static String fileName = new String ("managers.rpt");

  private FileInputStream	fileIn;
  private FileOutputStream	fileOut;
  private FilterInputStream	filterIn;
  private FilterOutputStream	filterOut;
  private DataInputStream	dataIn;
  private DataOutputStream	dataOut;
  private BufferedInputStream	bufferedIn;
  private BufferedOutputStream	bufferedOut;


  public ManagerList ()
  {
    this (0, 0, 0);
  }

  public ManagerList (long managerNo, long cardNo, long PIN)
  {
    this.managerNo = managerNo;
    this.cardNo = cardNo;
    this.PIN = PIN;
  }

  public String toString ()
  {
    String out = new String();

    out += managerNo +"\t";
    out += cardNo +"\t";
    out += PIN +"\t";

    out.trim();
    return out;
  }

  public void addManager ()
  {
    try
    {
      fileOut = new FileOutputStream (fileName, true);
      bufferedOut = new BufferedOutputStream (fileOut);
      dataOut = new DataOutputStream (bufferedOut);

      try
      {
        dataOut.writeUTF (this.toString()+"\n");
      }
      catch (IOException e)
      {
        System.out.println ("Could not write manager "+ this.toString());
      }
    }
    catch (FileNotFoundException e)
    {
      System.out.println ("Could not open file to write manager "+ this.toString());
    }
    finally
    {
      try
      {
        dataOut.close();
        bufferedOut.close();
        fileOut.close();
      }
      catch (IOException e)
      {
        System.out.println ("Could not close dataOut, bufferedOut or fileOut during manager "+ this.toString());
      }
    }
  }

  public void setManager (String manager)
  {
    String tempPIN = new String();
    String tempCardNo = new String();
    String tempManagerNo = new String();

    int i, flag = 0, start = 0;
    boolean add = true;

    while (!(Character.isDigit(manager.charAt(start))) && !(Character.isLetter(manager.charAt(start))))
      start++;

    for (i = start; i < manager.length(); i++)
    {
      if (!(Character.isDigit(manager.charAt(i))) && !(Character.isLetter(manager.charAt(i))))
      {
        add = false;
        flag++;
      }
      else
        add = true;

//System.out.println ("i == "+ i +"\tmanager.charAt(i) == "+ manager.charAt(i) +"\tflag == "+ flag +"\tadd == "+ add);
      if (add)
      {
        switch (flag)
        {
          case (0):
            tempManagerNo += manager.charAt(i);
            break;
          case (1):
            tempCardNo += manager.charAt(i);
            break;
          case (2):
            tempPIN += manager.charAt(i);
            break;
        }
      }
    }

    this.managerNo = Long.decode(tempManagerNo).longValue();
    this.cardNo = Long.decode(tempCardNo).longValue();
    this.PIN = Long.decode(tempPIN).longValue();
  }


  public boolean authorizeManager (long inputManagerNo, long inputPIN)
  {
    this.searchManager (inputManagerNo);
    return (this.PIN == inputPIN);
  }

  public boolean authorizeCard (long inputCardNo, long inputPIN)
  {
    this.searchCard (inputCardNo);
    return (this.PIN == inputPIN);
  }


  public void searchManager (long managerNo)
  {
    String managerFromFile = new String();

    try
    {
      fileIn = new FileInputStream (fileName);
      bufferedIn = new BufferedInputStream (fileIn);
      dataIn = new DataInputStream (bufferedIn);

      /*  read mgrLst from file  */
      /*  while not EOF  */

      try
      {
        managerFromFile = dataIn.readUTF();
        while (managerFromFile != null)
        {
          this.setManager (managerFromFile);
          if (this.managerNo == managerNo)
            break;
          managerFromFile = dataIn.readUTF();
        }
        System.out.println ("\n");
      }
      catch (IOException e)
      {
        System.out.println ("\n");
        //System.out.println ("Could not read dataIn...");
      }
    }
    catch (FileNotFoundException e)
    {
      System.out.println ("Could not open file to read manager "+ this.toString());
    }
    finally
    {
      try
      {
        dataIn.close();
        bufferedIn.close();
        fileIn.close();
      }
      catch (IOException e)
      {
        System.out.println ("Could not close dataIn, bufferedIn or fileIn during manager "+ this.toString());
      }
    }
  }


  public void searchCard (long cardNo)
  {
    String managerFromFile = new String();

    try
    {
      fileIn = new FileInputStream (fileName);
      bufferedIn = new BufferedInputStream (fileIn);
      dataIn = new DataInputStream (bufferedIn);

      /*  read mgrLst from file  */
      /*  while not EOF  */

      try
      {
        managerFromFile = dataIn.readUTF();
        while (managerFromFile != null)
        {
          this.setManager (managerFromFile);
          if (this.cardNo == cardNo)
            break;
          managerFromFile = dataIn.readUTF();
        }
        System.out.println ("\n");
      }
      catch (IOException e)
      {
        System.out.println ("\n");
        //System.out.println ("Could not read dataIn...");
      }
    }
    catch (FileNotFoundException e)
    {
      System.out.println ("Could not open file to read manager "+ this.toString());
    }
    finally
    {
      try
      {
        dataIn.close();
        bufferedIn.close();
        fileIn.close();
      }
      catch (IOException e)
      {
        System.out.println ("Could not close dataIn, bufferedIn or fileIn during manager "+ this.toString());
      }
    }
  }


}
