import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import com.fazecast.jSerialComm.*;
import javax.swing.text.*;
import java.sql.*;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;




 class Gui  {
	public static void main(String[] args)  {    

Scherm scherm = new Scherm();   
scherm.arduinoListener();
scherm.frameInstellingen();
scherm.paneel1();  
scherm.paneel2();
scherm.paneel3();
scherm.paneel4();
scherm.opneemPaneel();
scherm.toevoegenBijPaneel();
    }
}

class Scherm  extends JFrame  {

private JFrame f1;
private JPanel p1, p2,p3,p4,pOpnemen,incorrectPinMelding,meldingBlokkeren;
private JButton btnNaarP2,btnNaarP1,btnLogin,btnSKM,showMoneyButton;
private JButton btnNaarOpnemen,opneemButton,opnemenNaarP4,closeMelding,closeMelding2;
private JButton plus10,min10,plus20,min20,plus50,min50; 
private JLabel label1,label2,labelWW,opneemLabel,pinClearen,incorrectInloggenCounter,labelBlokkeren;
private JLabel char1,char2,char3,char4,plus,min,biljet10,biljet20,biljet50;
private JLabel biljet10Counter,biljet20Counter,biljet50Counter,totalCounter; 
private Boolean blocked;
private int num1=0,num2=0,num3=0;
private int number=1;
private int count;
private String correctPass;
private int intResultPrice,intResultPrice2,intResultPrice3,intTotaal;
private String pin1,pin2,pin3,pin4,result,result2,result3,resultTotal;
private Double balance;
private String pas;



public void frameInstellingen(){
f1 = new JFrame("GUI");
f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f1.setSize(1900,1000);
System.out.println("");
}

public void paneel1(){ 

p1= new JPanel();
p1.setBackground(Color.CYAN);
f1.add(p1);
p1.setVisible(true);

//button gemaakt met een coordinaat,grootte,style.
btnNaarP2 = new JButton("( # ) Verder");
btnNaarP2.setBounds(750,350,240, 40);   
btnNaarP2.setFont(new Font("Calibri",Font.PLAIN,30));

//label gemaakt met een coordinaat,grootte,style.
label1=new JLabel();     
label1.setText("Welkom bij de bank");
label1.setBounds(700, 300, 500, 50);
label1.setFont(new Font("Serif",Font.ITALIC,40));

f1.setVisible(true);

}

public void paneel2(){
 
    p2 = new JPanel();
p2.setBackground(Color.CYAN);
f1.add(p2);

//button gemaakt met een coordinaat,grootte,style.
btnNaarP1= new JButton(" ( * ) HOMESCREEN");   
btnNaarP1.setBounds(100,900,300,40);   
btnNaarP1.setFont(new Font("Calibri",Font.PLAIN,30));


label2=new JLabel("Scan uw pas");     
label2.setBounds(800, 300, 500, 50);
label2.setFont(new Font("Serif",Font.ITALIC,40));

   p2.setVisible(false);
}


public void paneel3(){  //Paneel 3

    p3 = new JPanel();
p3.setBackground(Color.CYAN);

btnLogin= new JButton("( # )Login");
btnLogin.setBounds(1000,340,200, 40);
btnLogin.setFont(new Font("Serif",Font.BOLD,30));


labelWW = new JLabel();
labelWW.setText("pincode: ");
labelWW.setBounds(690,340,200, 40);
labelWW.setFont(new Font("Serif",Font.BOLD,30));

pinClearen = new JLabel();
pinClearen.setText("C = Clear pin");
pinClearen.setBounds(1200,500,200, 40);
pinClearen.setFont(new Font("Serif",Font.BOLD,30));


char1= new JLabel();
char2=new JLabel();
char3=new JLabel();
char4=new JLabel();

        char1.setBounds(810,340,50,50);char1.setFont(new Font("Calibri", Font.BOLD,50));
		char1.setText("_");
		char2.setBounds(860,340,50,50);char2.setFont(new Font("Calibri", Font.BOLD,50));
		char2.setText("_");
		char3.setBounds(910,340,50,50);char3.setFont(new Font("Calibri", Font.BOLD,50));
		char3.setText("_");
		char4.setBounds(960,340,50,50);char4.setFont(new Font("Calibri", Font.BOLD,50));
		char4.setText("_");

        closeMelding=new JButton("(A) close");
        closeMelding2=new JButton("(A) close");

        incorrectPinMelding=new JPanel();
        incorrectPinMelding.setBounds(800,500,200,100);

        meldingBlokkeren=new JPanel();
        meldingBlokkeren.setBounds(800,500,200,100);

        incorrectInloggenCounter= new JLabel();
        labelBlokkeren=new JLabel();

      

        meldingBlokkeren.setVisible(false);
        incorrectPinMelding.setVisible(false);
        p3.setVisible(false);
}


public void paneel4(){
p4= new JPanel();
p4.setBackground(Color.CYAN);

btnSKM= new JButton("(B) Snel 50 euro opnemen");
btnSKM.setBounds(100,840,400, 40);
btnSKM.setFont(new Font("Serif",Font.BOLD,30));

showMoneyButton = new JButton("(A) Check Balance");
showMoneyButton.setBounds(100,740,340, 40);
showMoneyButton.setFont(new Font("Serif",Font.BOLD,30));

btnNaarOpnemen= new JButton("(C) geld opnemen");
btnNaarOpnemen.setBounds(1300,740,340, 40);
btnNaarOpnemen.setFont(new Font("Serif",Font.BOLD,30));

p4.setVisible(false);
}


public void opneemPaneel(){

pOpnemen = new JPanel();
opneemLabel = new JLabel(" Hoeveel geld wil je opnemen?");
plus = new JLabel();
min= new JLabel();
biljet10 = new JLabel();
biljet20 = new JLabel();
biljet50 = new JLabel();
plus10=new JButton("(1)");
min10=new JButton("(2)");
plus20=new JButton("(4)");
min20=new JButton("(5)");
plus50=new JButton("(7)");
min50=new JButton("(8)");
opneemButton = new JButton("(#) opnemen");
opnemenNaarP4 = new JButton("(*) terug");
biljet10Counter = new JLabel();
biljet20Counter = new JLabel();
biljet50Counter = new JLabel();
totalCounter= new JLabel();

pOpnemen.setBackground(Color.CYAN);


opneemLabel.setBounds(800, 200, 500, 50);
plus.setBounds(750,250,50,50);
min.setBounds(820,250,50,50);
biljet10.setBounds(600,300,200,50);
biljet20.setBounds(600,350,200,50);
biljet50.setBounds(600,400,200,50);
plus10.setBounds(750,300,50,50);
min10.setBounds(800,300,50,50);
plus20.setBounds(750,350,50,50);
min20.setBounds(800,350,50,50);
plus50.setBounds(750,400,50,50);
min50.setBounds(800,400,50,50);
opneemButton.setBounds(800,500,240, 40);
opnemenNaarP4.setBounds(700,850,340, 40);
biljet10Counter.setBounds(900,300,50,50);
biljet20Counter.setBounds(900,350,50,50);
biljet50Counter.setBounds(900,400,50,50);
totalCounter.setBounds(900,450,500,50);

opneemLabel.setFont(new Font("Serif",Font.ITALIC,40));
plus.setFont(new Font("Serif",Font.BOLD,40));
min.setFont(new Font("Serif",Font.BOLD,40));
biljet10.setFont(new Font("Serif",Font.BOLD,40));
biljet20.setFont(new Font("Serif",Font.BOLD,40));
biljet50.setFont(new Font("Serif",Font.BOLD,40));
opneemButton.setFont(new Font("Serif",Font.BOLD,30));
opnemenNaarP4.setFont(new Font("Serif",Font.BOLD,30));
biljet10Counter.setFont(new Font("Serif",Font.ITALIC,40));
biljet20Counter.setFont(new Font("Serif",Font.ITALIC,40));
biljet50Counter.setFont(new Font("Serif",Font.ITALIC,40));
totalCounter.setFont(new Font("Serif",Font.ITALIC,40));



result = String.valueOf(num1);
result2 = String.valueOf(num2);
result3 = String.valueOf(num3);

min.setText("-");
plus.setText("+");
biljet10.setText("10 Euro");
biljet20.setText("20 Euro");
biljet50.setText("50 Euro");
biljet10Counter.setText(result);
biljet20Counter.setText(result2);
biljet50Counter.setText(result3);


pOpnemen.setVisible(false);
}


public void toevoegenBijPaneel(){ //alles wordt hier bij de panelen toegevoegd.
    
p1.setLayout(null);
p2.setLayout(null);
p3.setLayout(null);
p4.setLayout(null);
pOpnemen.setLayout(null);
p1.add(label1);
p1.add(btnNaarP2);
p2.add(label2);
p3.add(labelWW);
p3.add(btnLogin);
p3.add(char1);
p3.add(char2); 
p3.add(char3);
p3.add(char4);
p3.add(pinClearen);
p3.add(incorrectPinMelding);
p3.add(meldingBlokkeren);
incorrectPinMelding.add(closeMelding);
incorrectPinMelding.add(incorrectInloggenCounter);
meldingBlokkeren.add(closeMelding2);
meldingBlokkeren.add(labelBlokkeren);
p4.add(btnSKM);
p4.add(showMoneyButton);
p4.add(btnNaarOpnemen);
pOpnemen.add(opneemLabel);
pOpnemen.add(opneemButton);
pOpnemen.add(opnemenNaarP4);
pOpnemen.add(biljet10);
pOpnemen.add(biljet20);
pOpnemen.add(biljet50);
pOpnemen.add(plus10);
pOpnemen.add(min10);
pOpnemen.add(plus20);
pOpnemen.add(min20);
pOpnemen.add(plus50);
pOpnemen.add(min50);
pOpnemen.add(plus);
pOpnemen.add(min);
pOpnemen.add(biljet10Counter);  
pOpnemen.add(biljet20Counter);
pOpnemen.add(biljet50Counter);
pOpnemen.add(totalCounter);
}





public void arduinoListener(){
		SerialPort comPort = SerialPort.getCommPort("COM7");
		
		comPort.setBaudRate(9600);
		
		//open the port
		comPort.openPort();
		System.out.println("port open");
		//create a listener and start listening
		comPort.addDataListener(new SerialPortDataListener() {
			@Override
			public int getListeningEvents() { 
				return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; 
			}
			@Override
			public void serialEvent(SerialPortEvent event)
			{
				if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE)
				return; //wait until we receive data
			
				byte[] newData = new byte[comPort.bytesAvailable()]; //receive incoming bytes
				comPort.readBytes(newData, newData.length); //read incoming bytes
		String serialData = new String(newData); //convert bytes to string
              
                
        try{
            String myDriver = "org.gjt.mm.mysql.Driver";
            String myUrl = "jdbc:mysql://localhost/projectdatabase";
            Class.forName(myDriver);
            Connection conn = DriverManager.getConnection(myUrl, "root", "");




			  if( p1.isVisible() && serialData.equals("#") ){
                p1.setVisible(false);
                 p3.setVisible(false);
                 f1.validate();
                 f1.repaint();
                 f1.invalidate();
                 p2.setVisible(true);
                 p2.add(btnNaarP1);
              }
       
if(p2.isVisible() && serialData.length()!=8){
    BufferedReader reader =
    new BufferedReader(new InputStreamReader(System.in));
String name = reader.readLine();
serialData=name;
}

if(serialData.length()==8 && p2.isVisible()){
    pas= serialData;
    String query = ("SELECT * FROM accounts WHERE Pasnummer ='"+ pas +"' " ); //+serialData);
    
    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery(query);

    if (rs.next() ){

    correctPass = rs.getString("Pincode");
  balance= rs.getDouble("Balance");
  
  p1.setVisible(false);
  p2.setVisible(false);
  f1.validate();
  f1.repaint();
  f1.invalidate(); 
  p3.add(btnNaarP1);
  f1.getContentPane().add(p3);
  p3.setVisible(true);     
    } 
}

        
  if((p2.isVisible() || p3.isVisible() || p4.isVisible() ) && serialData.equals("*") ){// als het op Paneel2 of 3 is. En er wordt op * gedrukt. Ga terug naar Home
p2.setVisible(false);
p3.setVisible(false);
p4.setVisible(false);
f1.validate();
f1.repaint();
f1.invalidate();
p1.setVisible(true);
}
    if(p3.isVisible()){
        String query = ("SELECT * FROM accounts WHERE Pasnummer ='"+ pas +"' " ); //+serialData);
    
    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery(query);
 
    if (rs.next() ){
    
  count=rs.getInt("aantalfouten");
  System.out.format("Pincode: %s, %s, %s\n", correctPass, balance, count);
            if(count==3){
             blocked=true;
                 }else{
                 blocked=false;
            }
        }
    }


     if(serialData.equals("1") && p3.isVisible()  ){
         if(number==1) {char1.setText("X");pin1="1";}
			if(number==2) {char2.setText("X");pin2="1";}
			if(number==3) {char3.setText("X");pin3="1";}
			if(number==4) {char4.setText("X");pin4="1";}
			number++;
     }
         if(serialData.equals("2") && p3.isVisible()){
            if(number==1) {char1.setText("X");pin1="2";}
			if(number==2) {char2.setText("X");pin2="2";}
			if(number==3) {char3.setText("X");pin3="2";}
			if(number==4) {char4.setText("X");pin4="2";}
			number++;
        }
         if(serialData.equals("3") && p3.isVisible() ){
            if(number==1) {char1.setText("X");pin1="3";}
			if(number==2) {char2.setText("X");pin2="3";}
			if(number==3) {char3.setText("X");pin3="3";}
			if(number==4) {char4.setText("X");pin4="3";}
			number++;
        }
         if(serialData.equals("4") && p3.isVisible() ){
            if(number==1) {char1.setText("X");pin1="4";}
			if(number==2) {char2.setText("X");pin2="4";}
			if(number==3) {char3.setText("X");pin3="4";}
			if(number==4) {char4.setText("X");pin4="4";}
			number++;
        }
         if(serialData.equals("5") && p3.isVisible() ){
            if(number==1) {char1.setText("X");pin1="5";}
			if(number==2) {char2.setText("X");pin2="5";}
			if(number==3) {char3.setText("X");pin3="5";}
			if(number==4) {char4.setText("X");pin4="5";}
			number++;
        }
         if(serialData.equals("6") && p3.isVisible()){
            if(number==1) {char1.setText("X");pin1="6";}
			if(number==2) {char2.setText("X");pin2="6";}
			if(number==3) {char3.setText("X");pin3="6";}
			if(number==4) {char4.setText("X");pin4="6";}
			number++;
        }
         if(serialData.equals("7") && p3.isVisible() ){
            if(number==1) {char1.setText("X");pin1="7";}
			if(number==2) {char2.setText("X");pin2="7";}
			if(number==3) {char3.setText("X");pin3="7";}
			if(number==4) {char4.setText("X");pin4="7";}
			number++;
        }
         if(serialData.equals("8") && p3.isVisible()){
            if(number==1) {char1.setText("X");pin1="8";}
			if(number==2) {char2.setText("X");pin2="8";}
			if(number==3) {char3.setText("X");pin3="8";}
			if(number==4) {char4.setText("X");pin4="8";}
			number++;
        }
         if(serialData.equals("9") && p3.isVisible()){
            if(number==1) {char1.setText("X");pin1="9";}
			if(number==2) {char2.setText("X");pin2="9";}
			if(number==3) {char3.setText("X");pin3="9";}
			if(number==4) {char4.setText("X");pin4="9";}
			number++;
        }
         if(serialData.equals("0") && p3.isVisible()){
            if(number==1) {char1.setText("X");pin1="0";}
			if(number==2) {char2.setText("X");pin2="0";}
			if(number==3) {char3.setText("X");pin3="0";}
			if(number==4) {char4.setText("X");pin4="0";}
			number++;
        }

        if(serialData.equals("C") && p3.isVisible()){ // iemand druk op C en is op de pin paneel.
            char1.setText("_");     //reset de karakters
            char2.setText("_");
            char3.setText("_");
            char4.setText("_");
            number=0;               //pin weer leegmaken.
        }

        	  
String ingevoerdePin = String.valueOf(pin1 + pin2 + pin3 + pin4);
    


         
	if(!p3.isVisible()){
    char1.setText("_");
    char2.setText("_");
    char3.setText("_");
    char4.setText("_");
    ingevoerdePin="____";
    number=1;
    incorrectPinMelding.setVisible(false);
    meldingBlokkeren.setVisible(false);
    }	


if(p3.isVisible() && ingevoerdePin.equals(correctPass) && number==5 && serialData.equals("#") && blocked==false){//Het staat op paneel 3. ingevoerdePin is correct en number is 5. En je drukt op #. En pas is niet geblokeerd.
    p1.setVisible(false);
    p2.setVisible(false);
    p3.setVisible(false);
    pOpnemen.setVisible(false);
    f1.validate();
    f1.repaint();
    f1.invalidate();
    p4.add(btnNaarP1);
    f1.getContentPane().add(p4);
    p4.setVisible(true);
    count=0;
    String query = ("UPDATE accounts SET aantalfouten=" + count + " WHERE Pasnummer='"+ pas +"' ");
    Statement st = conn.createStatement(); 
     st.executeUpdate(query);
}

if(number>=5){
    number=5;
}


if(p3.isVisible() && !ingevoerdePin.equals(correctPass)  && serialData.equals("#") && blocked==false){
    count+=1;
    String query = ("UPDATE accounts SET aantalfouten=" + count + " WHERE Pasnummer='"+ pas +"' ");
    Statement st = conn.createStatement(); 
     st.executeUpdate(query);

    incorrectInloggenCounter.setText("incorrecte inlogpogingen: " + count);
     incorrectPinMelding.setVisible(true);
        }

        if((incorrectPinMelding.isVisible() || meldingBlokkeren.isVisible()) && serialData.equals("A") ){
            incorrectPinMelding.setVisible(false);
            meldingBlokkeren.setVisible(false);
        }




if(blocked==true && p3.isVisible() && serialData.equals("#")){

    labelBlokkeren.setText("Pas is geblokkeerd");
    meldingBlokkeren.setVisible(true);
}

if(p4.isVisible() && serialData.equals("C")){
    p1.setVisible(false);
    p2.setVisible(false);
    p3.setVisible(false);
    p4.setVisible(false);
    f1.validate();
    f1.repaint();
    f1.invalidate();
    f1.getContentPane().add(pOpnemen);
    pOpnemen.setVisible(true);
}
if(p4.isVisible() && serialData.equals("A")){
    JOptionPane.showMessageDialog(null,"Jouw balance = " +balance);
}

if(p4.isVisible() && serialData.equals("B")){
    if(balance>=50){
        JOptionPane.showMessageDialog(null, "U krijgt nu 50 euro");
        balance-=50;
        p2.setVisible(false);
         p3.setVisible(false);
         p4.setVisible(false);
         f1.validate();
         f1.repaint();
         f1.invalidate();
         p1.setVisible(true);
            }
            if(balance<50){
            JOptionPane.showMessageDialog(null, "U heeft geen geld meer om 50 euro op te nemen.");
            }
}

if(pOpnemen.isVisible() && serialData.equals("*")){
    p1.setVisible(false);
    p2.setVisible(false);
    p3.setVisible(false);
    pOpnemen.setVisible(false);
    f1.validate();
    f1.repaint();
    f1.invalidate();
    f1.getContentPane().add(p4);
    p4.setVisible(true);
}

///////////////////////////////////////////
if(pOpnemen.isVisible() && serialData.equals("1")){
    num1++;
    result=String.valueOf(num1);
    biljet10Counter.setText(result);
    
    intResultPrice=Integer.valueOf(result)*10;
  
  
}
if(pOpnemen.isVisible() && serialData.equals("2")){
    num1--;
    
    if(num1<0){
        num1=0;
    }
    result=String.valueOf(num1);
    biljet10Counter.setText(result);
    
    intResultPrice=Integer.valueOf(result)*10;
}
if(pOpnemen.isVisible() && serialData.equals("4")){
    num2++;
    result2=String.valueOf(num2);
    biljet20Counter.setText(result2);
    intResultPrice2=Integer.valueOf(result2) * 20;
}
if(pOpnemen.isVisible() && serialData.equals("5")){
    num2--;
    
    if(num2<0){
        num2=0;
    }
    result2=String.valueOf(num2);
    biljet20Counter.setText(result2);
   intResultPrice2=Integer.valueOf(result2) * 20;
}



if(pOpnemen.isVisible() && serialData.equals("7")){
    num3++;
    result3=String.valueOf(num3);
    biljet50Counter.setText(result3);
    intResultPrice3=Integer.valueOf(result3)*50;
}
if(pOpnemen.isVisible() && serialData.equals("8")){
    num3--;
    
    if(num3<0){
        num3=0;
    }
    result3=String.valueOf(num3);
    biljet50Counter.setText(result3);
    intResultPrice3=Integer.valueOf(result3) * 50;
}
intTotaal=intResultPrice+intResultPrice2+intResultPrice3;
resultTotal=String.valueOf(intTotaal);
totalCounter.setText(resultTotal);

if(pOpnemen.isVisible() && serialData.equals("#")){

    if(balance>=intTotaal){
    balance-=intTotaal;
//////////////////////////////////////////
String query = ("UPDATE accounts SET Balance=" + balance + " WHERE Pasnummer='"+ pas +"' ");
Statement st = conn.createStatement(); 
 st.executeUpdate(query);

    System.out.println("opnemen gelukt. balance = " + balance);
    p2.setVisible(false);
    p3.setVisible(false);
    p4.setVisible(false);
    pOpnemen.setVisible(false);
    f1.validate();
    f1.repaint();
    f1.invalidate();
    p1.setVisible(true);
    }else {
        JOptionPane.showMessageDialog(null, "niet genoeg geld");
    }
}
///////////////////////////////////////////////////////////

//st.close();
}
catch (Exception e)
{
System.err.println("Got an exception! ");
System.err.println(e.getMessage());
}



			}
		});
 }




}




