import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.String;
import java.io.*;

public class PassControl{
    PassView passView;
    PassModel passModel;
    long[][] userData;
    String userName;
    File userFile;
    PrintWriter sec;
    
    public PassControl(PassView v, PassModel m){
        this.passView = v;
        this.passModel = m;

        //for now assume 1 user
        //to extend later, create a list or table of users
        //and have 2-D arrays for each to store biometric data
        userData = new long[26][26];
        String userName = new String();
        
        passView.getPFrame().addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent evt){
                    System.exit(0);}});
        passView.getUserText().addKeyListener(new getUserName());
        passView.getInputText().addKeyListener(new reactTime());
    }

    class getUserName implements KeyListener{
        
        public getUserName(){
        }

        /* Known bug
         * if user hits enter and does not delete the enter,
         * there will be a '\n' in the username
         */
        void getName(){
            JFrame err = new JFrame("Invalid username");
            try{
                userName = passView.getUserText().getText();
                if (userName.length() != 0){
                    passView.getDisplayText().setEnabled(true);
                    passView.getChallengeText().setEnabled(true);

                    passView.getInputText().setEnabled(true);
                    passView.getInputText().setEditable(true);

                    passView.getLoginText().setEnabled(false);
                    passView.getUserText().setEditable(false);
                    passView.getUserText().setEnabled(false);
                    userFile = new File(userName + ".p");

                    try{
                        sec = new PrintWriter(new FileWriter(userFile));
                    }
                    catch( IOException ie){
                        System.out.println("File does not exist.");
                    }
                }
                else{
                    passView.getUserText().setText(null);
                    JOptionPane.showMessageDialog(err, "Please enter a valid username","Invalid username", JOptionPane.ERROR_MESSAGE);
                }
            }
            catch(NullPointerException n){
                JOptionPane.showMessageDialog(err, "Please enter a username", "Invalid username", JOptionPane.ERROR_MESSAGE);
            }
            System.out.println("Username : " + userName);
        }
        
        public void keyPressed(KeyEvent e){
            if (e.getKeyChar() == '\n'){
                getName();
            }
        }

        public void keyTyped(KeyEvent e){
        }

        public void keyReleased(KeyEvent e){
        }
    }
    
    class reactTime implements KeyListener{
        long startTime;
        long endTime;
        String challenge;
        
        //to iterate through challenge string
        int i;
        int j;
        
        public reactTime(){
            startTime = 0;
            endTime = 0;
            i = 0;
            j = 0;
            challenge = passView.getChallengeText().getText();
        }

        void typoReset(){
            passView.getDisplayText().setText("Typographical error.  Please retype the string below.");
            i = 0;
            startTime = 0;
            endTime = 0;
        }

  
        
        public void keyPressed( KeyEvent e){
            char expectedChar = ' ';
            long timeInterval; //how long between keystrokes
  
            if (startTime == 0 && (i < challenge.length())){
                expectedChar = challenge.charAt(i);
                startTime = passModel.startClock(expectedChar, e.getKeyChar());
                if (startTime != 0) //correct char was typed
                    i++;
                else{
                    //redraw and display typographical error text
                    typoReset();
                }
            }
            else if (startTime != 0 && (i < challenge.length())){
                endTime = 0;
                expectedChar = challenge.charAt(i);
                System.out.println("Expected Char: " + expectedChar);
                endTime = passModel.stopClock(expectedChar, e.getKeyChar());

                if (endTime != 0){ //correct character typed
                    //calculate time elapsed
                    timeInterval = passModel.timeElapsed(startTime, endTime);
                    //store time elapsed in 2-D array
                    userData[((int)challenge.charAt(i-1))-97][((int)challenge.charAt(i))-97] = timeInterval;
                    i++;
                    
                    //reset start time for extensibility reasons
                    //in case want to time triples etc.
                    startTime = endTime;
                }
                else{
                //redraw window, and restart
                typoReset();
                }
            }
            System.out.println("Key pressed : " + ((int)e.getKeyChar()));
        }

        public void keyReleased( KeyEvent e){
            int a, b;
            String tempString;
            if (i == 0)
                passView.getInputText().setText(null);
            else if (i == challenge.length()){//finished typing in text
                //write out biometric data to file
                //end program
                for (a = 0; a < 26; a++){
                    for (b = 0; b < 26; b++){
                        sec.println(userData[a][b]);
                    }
                }
                sec.close();
                System.exit(0);
            }
            System.out.println("Key released : " + e.getKeyChar());
        }
        

        public void keyTyped( KeyEvent e){
            System.out.println("Key typed : " + e.getKeyChar()); 
        }
    }

    public static void main(String[] args){
        int i, j;
        long[][] ud;
        PassView pv = new PassView();
        PassModel pm = new PassModel();
        PassControl c = new PassControl(pv, pm);
    }
    
}
