import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.String;
import java.io.*;

public class LoginControl{
    LoginView loginView;
    LoginModel loginModel;
    long[][] userInput;
    String userName;
    File userFile;
    PrintWriter sec;

    public LoginControl(LoginView v, LoginModel m){
        this.loginView = v;
        this.loginModel = m;

        userInput = new long[26][26];
        String userName = new String();

        loginView.getPFrame().addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent evt){
                    System.exit(0);}});

        loginView.getUserText().addKeyListener(new getUserName());
        loginView.getInputText().addKeyListener(new reactTime());
        loginView.getVerify().addKeyListener(new verUser());
        loginView.getVerify().addActionListener(new verUser());
    }

    class getUserName implements KeyListener{
        
        public getUserName(){
        }
        
        void getName(){
            JFrame err = new JFrame("Invalid username");
            try{
                userName = loginView.getUserText().getText();
                if (userName.length() != 0){
                    loginView.getDisplayText().setEnabled(true);
                    loginView.getChallengeText().setEnabled(true);
                    
                    loginView.getInputText().setEnabled(true);
                    loginView.getInputText().setEditable(true);
                    
                    loginView.getLoginText().setEnabled(false);
                    loginView.getUserText().setEditable(false);
                    loginView.getUserText().setEnabled(false);
                    userFile = new File(userName + ".a");
                    
                    try{
                        sec = new PrintWriter(new FileWriter(userFile));
                    }
                    catch( IOException ie){
                        System.out.println("File does not exist.");
                    }
                }
                else{
                    loginView.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 = loginView.getChallengeText().getText();
        }
        
        void typoReset(){
            loginView.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 = loginModel.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 = loginModel.stopClock(expectedChar, e.getKeyChar());
                
                if (endTime != 0){ //correct character typed
                    //calculate time elapsed
                    timeInterval = loginModel.timeElapsed(startTime, endTime);
                    //store time elapsed in 2-D array
                    userInput[((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)
                loginView.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(userInput[a][b]);
                    }
                }
                sec.close();
                loginView.getInputText().setEditable(false);
                loginView.getInputText().setEnabled(false);
            }
            System.out.println("Key released : " + e.getKeyChar());
        }
        
        
        public void keyTyped( KeyEvent e){
            System.out.println("Key typed : " + e.getKeyChar()); 
        }
    }

    class verUser implements ActionListener, KeyListener{
        JFrame result = new JFrame();
        public void actionPerformed(ActionEvent e){
            boolean authorized = loginModel.verify(userName);
            if (authorized){
                JOptionPane.showMessageDialog(result, "LOGIN SUCCESSFUL","User Authenticated", JOptionPane.INFORMATION_MESSAGE);}
            else{
                JOptionPane.showMessageDialog(result, "LOGIN FAILED", "Failed Authentication", JOptionPane.INFORMATION_MESSAGE);
            }
            System.exit(0);
        }
        
        public void keyPressed(KeyEvent e){}
        public void keyReleased(KeyEvent e){}
        public void keyTyped(KeyEvent e){}
    }


    public static void main(String[] args){
        int i, j;
        long[][] ud;
        LoginView lv = new LoginView();
        LoginModel lm = new LoginModel();
        LoginControl c = new LoginControl(lv, lm);
    }
}
