import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import com.fazecast.jSerialComm.*;
import javax.swing.text.*;
import java.sql.*;
import java.net.URI;
import javax.websocket.*;
import arduino.Arduino;

class Program {
    public static void main(String[] args) {
        Gui scherm = new Gui();
        scherm.arduinoListener();
        scherm.frameInstellingen();
        scherm.scherm1();
        scherm.scherm2();
        scherm.scherm3();
        scherm.scherm4();
        scherm.opneemPaneel();
        scherm.bonScherm();
        scherm.toevoegenBijPaneel();
    }
}

class Gui extends JFrame {
    /* private fields */
    private JFrame frame;
    private JPanel homeScreenPanel, scanPasPanel, pincodePanel, ingelogdPanel, opnemenPanel, incorrectPinMelding;
    private JPanel meldingBlokkeren, passNotFoundMelding, bonPanel;
    private JPanel showBalanceMelding, SKMMelding, pasBlokerrenBijPinnen, nietGenoegGeldMelding;
    private JButton btnNaarScanPasPanel, btnNaarHome, btnLogin, btnSKM, showMoneyButton;
    private JButton btnNaarOpnemen, opneemButton, opnemenNaarP4;
    private JButton plus10, min10, plus20, min20, plus50, min50, jaOptie, neeOptie, afbrekenBijBonOptie;
    private JLabel welkomLabel, scanPasLabel, labelWW, opneemLabel, pinClearen, incorrectInloggenLabel, labelBlokkeren;
    private JLabel labelBlokkerenBijPinnen, passNotFoundLabel, showBalanceLabel;
    private JLabel char1, char2, char3, char4, plus, min, biljet10, biljet20, biljet50, nietGenoegGeldTekst;
    private JLabel biljet10Counter, biljet20Counter, biljet50Counter, totalCounter, SKMLabel, bonTekst;
    private int aantalTienEuroBiljetten, aantalTwintigEuroBiljetten, aantalVijftigEuroBiljetten;
    private int lengteVanPincode = 1;
    private int incorrecteInlogPogingen, aantalTienEuroBiljetteninDatabase, aantalTwintigEuroBiljetteninDatabase;
    private int aantalVijftigEuroBiljetteninDatabase;
    private int totaalPrijsVanBiljet, totaalPrijsVanBiljet2, totaalPrijsVanBiljet3, gekozenBedrag;
    private String pin1, pin2, pin3, pin4, pincode, aantalTienEuroBiljettenTekst, aantalTwintigEuroBiljettenTekst;
    private String aantalVijftigEuroBiljettenTekst, totaalBedrag;
    private Double balance;
    private String gescandePas;
    private Connection conn;
    private Boolean connected = false;
    private String serialData;
    private SerialPort comPort;
    private String ingevoerdePin;

    public void frameInstellingen() {
        frame = new JFrame("GUI");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1900, 1000);
        System.out.println("");
    }

    public void scherm1() {

        homeScreenPanel = new JPanel();
        homeScreenPanel.setBackground(Color.CYAN);
        frame.add(homeScreenPanel);
        homeScreenPanel.setVisible(true);

        // button gemaakt met een coordinaat,grootte,style.
        btnNaarScanPasPanel = new JButton("( # ) Verder ");
        btnNaarScanPasPanel.setBounds(750, 350, 240, 40);
        btnNaarScanPasPanel.setFont(new Font("Calibri", Font.PLAIN, 30));

        // label gemaakt met een coordinaat,grootte,style.
        welkomLabel = new JLabel();
        welkomLabel.setText("Welkom bij de bank");
        welkomLabel.setBounds(700, 300, 500, 50);
        welkomLabel.setFont(new Font("Serif", Font.ITALIC, 40));

        frame.setVisible(true);

    }

    public void scherm2() {

        /* nieuwe paneel aangemaakt */
        scanPasPanel = new JPanel();
        scanPasPanel.setBackground(Color.CYAN);

        // componenten gemaakt met een coordinaat,grootte,style.
        btnNaarHome = new JButton(" ( * ) AFBREKEN");
        btnNaarHome.setBounds(100, 900, 300, 40);
        btnNaarHome.setFont(new Font("Calibri", Font.PLAIN, 30));

        scanPasLabel = new JLabel("Scan uw pas");
        scanPasLabel.setBounds(800, 300, 500, 50);
        scanPasLabel.setFont(new Font("Serif", Font.ITALIC, 40));

        passNotFoundMelding = new JPanel();
        passNotFoundMelding.setBounds(800, 500, 200, 100);

        meldingBlokkeren = new JPanel();
        meldingBlokkeren.setBounds(800, 500, 200, 100);

        passNotFoundLabel = new JLabel();
        labelBlokkeren = new JLabel();

        /* zet alle panels op false */
        meldingBlokkeren.setVisible(false);
        passNotFoundMelding.setVisible(false);
        scanPasPanel.setVisible(false);
    }

    public void scherm3() { // Paneel 3

        pincodePanel = new JPanel();
        pincodePanel.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));

        /*    nieuwe labels aangemaakt om te tonen hoeveel cijfers van de pin je al hebt ingevult. */
        char1 = new JLabel();
        char2 = new JLabel();
        char3 = new JLabel();
        char4 = new JLabel();

        /* Locatie,style en grootte aanpassen. De tekst van de labels naar _ veranderen.     */
     
        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("_");

        /* Panelen met locatie en grootte van component */
        incorrectPinMelding = new JPanel();
        incorrectPinMelding.setBounds(800, 500, 200, 100);
        pasBlokerrenBijPinnen = new JPanel();
        pasBlokerrenBijPinnen.setBounds(800, 500, 200, 100);

        /* Labels bij de meldingen */
        incorrectInloggenLabel = new JLabel();
        labelBlokkerenBijPinnen = new JLabel();

        /* Alle panelen op false zetten */
        pasBlokerrenBijPinnen.setVisible(false);
        incorrectPinMelding.setVisible(false);
        pincodePanel.setVisible(false);
    }

    public void scherm4() {
        /* componenten gemaakt met een coordinaat,grootte,style */
        ingelogdPanel = new JPanel();
        ingelogdPanel.setBackground(Color.CYAN);

        btnSKM = new JButton("(B) Snel \u20ac50  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));

        showBalanceMelding = new JPanel();
        showBalanceMelding.setBounds(800, 500, 300, 100);

        showBalanceLabel = new JLabel();
        showBalanceLabel.setFont(new Font("Serif", Font.BOLD, 30));

        SKMMelding = new JPanel();
        SKMMelding.setBounds(800, 500, 300, 100);

        SKMLabel = new JLabel();
        SKMLabel.setFont(new Font("Serif", Font.BOLD, 30));

        SKMMelding.setVisible(false);
        showBalanceMelding.setVisible(false);
        ingelogdPanel.setVisible(false);
    }

    public void opneemPaneel() {
        /* Objecten gemaakt bij de opneemPaneel */
        opnemenPanel = 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("(D) terug");
        biljet10Counter = new JLabel();
        biljet20Counter = new JLabel();
        biljet50Counter = new JLabel();
        totalCounter = new JLabel();
        nietGenoegGeldMelding = new JPanel();
        nietGenoegGeldTekst = new JLabel();
   
        opnemenPanel.setBackground(Color.CYAN); // kleur van achtergrond

        /* locatie en grootte van componenten */
        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, 900, 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);
        incorrectPinMelding.setBounds(800, 500, 200, 100);
        nietGenoegGeldMelding.setBounds(800, 550, 200, 100);

        /* schrijfstijl en grootte van tekst */
        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));

        /* int wordt omgezet naar String */
        aantalTienEuroBiljettenTekst = String.valueOf(aantalTienEuroBiljetten);
        aantalTwintigEuroBiljettenTekst = String.valueOf(aantalTwintigEuroBiljetten);
        aantalVijftigEuroBiljettenTekst = String.valueOf(aantalVijftigEuroBiljetten);

        /* tekst van labels aanpassen */
        min.setText("-");
        plus.setText("+");
        biljet10.setText("\u20ac 10 ");
        biljet20.setText("\u20ac 20 ");
        biljet50.setText("\u20ac 50 ");
        biljet10Counter.setText(aantalTienEuroBiljettenTekst);
        biljet20Counter.setText(aantalTwintigEuroBiljettenTekst);
        biljet50Counter.setText(aantalVijftigEuroBiljettenTekst);

        // op false zetten
        nietGenoegGeldMelding.setVisible(false);
        opnemenPanel.setVisible(false);
    }

    public void bonScherm() {
        /* een nieuwe panel aanmaken */
        bonPanel = new JPanel();
        bonPanel.setBackground(Color.CYAN);
        /* buttons aanmaken */
        jaOptie = new JButton("(A) JA");
        neeOptie = new JButton("(B) NEE");
        afbrekenBijBonOptie = new JButton("(C) AFBREKEN");

        /* een label aangemaakt met een tekst,locatie,grootte */
        bonTekst = new JLabel();
        bonTekst.setText("Wilt u een bon?");
        bonTekst.setBounds(700, 300, 500, 50);
        bonTekst.setFont(new Font("Serif", Font.ITALIC, 40));

        /* grootte,locatie,style van de buttons */
        jaOptie.setBounds(550, 350, 120, 40);
        jaOptie.setFont(new Font("Calibri", Font.PLAIN, 30));
        neeOptie.setBounds(700, 350, 140, 40);
        neeOptie.setFont(new Font("Calibri", Font.PLAIN, 30));
        afbrekenBijBonOptie.setBounds(880, 350, 240, 40);
        afbrekenBijBonOptie.setFont(new Font("Calibri", Font.PLAIN, 30));

        bonPanel.setVisible(false);
    }

    public void toevoegenBijPaneel() { // alles wordt hier bij de panelen toegevoegd.

        /* setLayout(null) om de locatie van alle componenten zelf te bepalen. */
        homeScreenPanel.setLayout(null);
        scanPasPanel.setLayout(null);
        pincodePanel.setLayout(null);
        ingelogdPanel.setLayout(null);
        opnemenPanel.setLayout(null);
        bonPanel.setLayout(null);

        /* eerste scherm */
        homeScreenPanel.add(welkomLabel);
        homeScreenPanel.add(btnNaarScanPasPanel);

        /* tweede scherm */
        scanPasPanel.add(scanPasLabel);
        scanPasPanel.add(passNotFoundMelding);
        scanPasPanel.add(meldingBlokkeren);
        meldingBlokkeren.add(labelBlokkeren);
        passNotFoundMelding.add(passNotFoundLabel);

        /* derde scherm */
        pincodePanel.add(labelWW);
        pincodePanel.add(btnLogin);
        pincodePanel.add(char1);
        pincodePanel.add(char2);
        pincodePanel.add(char3);
        pincodePanel.add(char4);
        pincodePanel.add(pinClearen);
        pincodePanel.add(incorrectPinMelding);
        pincodePanel.add(pasBlokerrenBijPinnen);
        pasBlokerrenBijPinnen.add(labelBlokkerenBijPinnen);
        incorrectPinMelding.add(incorrectInloggenLabel);

        /* vierde scherm */
        ingelogdPanel.add(btnSKM);
        ingelogdPanel.add(showMoneyButton);
        ingelogdPanel.add(btnNaarOpnemen);
        ingelogdPanel.add(showBalanceMelding);
        ingelogdPanel.add(SKMMelding);
        SKMMelding.add(SKMLabel);
        showBalanceMelding.add(showBalanceLabel);

        /* de geld opnemen scherm */
        opnemenPanel.add(opneemLabel);
        opnemenPanel.add(opneemButton);
        opnemenPanel.add(opnemenNaarP4);
        opnemenPanel.add(biljet10);
        opnemenPanel.add(biljet20);
        opnemenPanel.add(biljet50);
        opnemenPanel.add(plus10);
        opnemenPanel.add(min10);
        opnemenPanel.add(plus20);
        opnemenPanel.add(min20);
        opnemenPanel.add(plus50);
        opnemenPanel.add(min50);
        opnemenPanel.add(plus);
        opnemenPanel.add(min);
        opnemenPanel.add(biljet10Counter);
        opnemenPanel.add(biljet20Counter);
        opnemenPanel.add(biljet50Counter);
        opnemenPanel.add(totalCounter);
        opnemenPanel.add(nietGenoegGeldMelding);
        nietGenoegGeldMelding.add(nietGenoegGeldTekst);

        /* Bon scherm */
        bonPanel.add(jaOptie);
        bonPanel.add(neeOptie);
        bonPanel.add(afbrekenBijBonOptie);
        bonPanel.add(bonTekst);
    }

    public void cleaningFrame() {// de frame opschonen
        frame.validate();
        frame.repaint();
        frame.invalidate();
    }

    public void gaNaarScanPasPanel() {
        if (homeScreenPanel.isVisible() && serialData.equals("#")) {// Als homeScreenPanel is visible en er wordt op de
                                                                    // # knop gedrukt.
            homeScreenPanel.setVisible(false); // sluit homeScreenPanel
            cleaningFrame();
            frame.getContentPane().add(scanPasPanel);
            scanPasPanel.setVisible(true); // open scanPasPanel
            scanPasPanel.add(btnNaarHome); // scanPasPanel krijgt een button die terug naar homeScreenPanel kan.
        }
    }

    public void terugNaarHomeScreenPanel() {
        // als scanPasPanel,pincodePanel of ingelogdPanel zichtbaar is en er wordt op * gedrukt.
        if ((scanPasPanel.isVisible() || pincodePanel.isVisible() || ingelogdPanel.isVisible() || opnemenPanel.isVisible()) && serialData.equals("*")) {
            /* Sluit de panelen */
            scanPasPanel.setVisible(false);
            pincodePanel.setVisible(false);
            ingelogdPanel.setVisible(false);
            opnemenPanel.setVisible(false);
            cleaningFrame();
            homeScreenPanel.setVisible(true);// ga terug naar de eerste panel.
        }
    }

    public void pasLezen() throws Exception {
/* als scanPasPanel visible is en er wordt iets gelezen dat 8 karakters lang zijn. */
        if (serialData.length() == 8 && scanPasPanel.isVisible()) { 
            gescandePas = serialData;// serialdata wordt opgeslagen in gescandePas
            System.out.println("\n\n\n De pasnummer die net werd gescant = " + gescandePas + "\n\n\n");
            String query = ("SELECT * FROM accounts WHERE Pasnummer ='" + gescandePas + "' ");

            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(query);

            if (rs.next()) { // als het bestaat in de database
                /*pakt de gegevens van de database en sla het op in de fields */
                pincode = rs.getString("Pincode");
                balance = rs.getDouble("Balance");

                if (incorrecteInlogPogingen < 3) {  //als de incorrecte inlog pogingen nog onder de 3 zijn.
                    scanPasPanel.setVisible(false);
                    cleaningFrame();
                    pincodePanel.add(btnNaarHome);
                    frame.getContentPane().add(pincodePanel);   //ga naar de pincodePanel
                    pincodePanel.setVisible(true);  
                } else {//als de incorrecte inlog pogingen boven de 2 zijn.
                    labelBlokkeren.setText("Pas is geblokkeerd");
                    meldingBlokkeren.setVisible(true);  //een melding wordt geopend met als tekst : pas is geblokkeerd.
                   delay(2000);
                    meldingBlokkeren.setVisible(false);
                }

            } else { // als het niet bestaat in de database
                passNotFoundLabel.setText("Pas niet gevonden");
                passNotFoundMelding.setVisible(true);   //melding openen
                delay(2000);
                passNotFoundMelding.setVisible(false); // melding sluit zich
            }
        }
    }
    public void delay(int delay){   //hier worden de delays gemaakt
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
        }
    }


    public void pakBiljettenVanDatabase() throws Exception {

        String query = ("SELECT * FROM Biljetten");
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery(query);
        /*pakt de biljetten van de database en sla het op in de fields */
        if (rs.next()) {
            aantalTienEuroBiljetteninDatabase = rs.getInt("TienEuro");
            aantalTwintigEuroBiljetteninDatabase = rs.getInt("TwintigEuro");
            aantalVijftigEuroBiljetteninDatabase = rs.getInt("VijftigEuro");
        }
    }

    public void pinCodeInvullen() {  /* Dit wordt gebruikt om de pincode, die 4 karakters lang is te lezen */

      /* Dit wordt gebruikt om de pincode, die 4 karakters lang is te lezen */
      if(serialData.equals("1") && pincodePanel.isVisible()  ){
        if(lengteVanPincode==1) {char1.setText("X");pin1="1";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="1";}
        if(lengteVanPincode==3) {char3.setText("X");pin3="1";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="1";}
        lengteVanPincode++;//Elke keer als je een getal invoerd,de lengteVanPincode groter.
    }
     if(serialData.equals("2") && pincodePanel.isVisible()){
        if(lengteVanPincode==1) {char1.setText("X");pin1="2";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="2";}
        if(lengteVanPincode==3) {char3.setText("X");pin3="2";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="2";}
        lengteVanPincode++;
    }
     if(serialData.equals("3") && pincodePanel.isVisible() ){
        if(lengteVanPincode==1) {char1.setText("X");pin1="3";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="3";}
        if(lengteVanPincode==3) {char3.setText("X");pin3="3";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="3";}
        lengteVanPincode++;
    }
     if(serialData.equals("4") && pincodePanel.isVisible() ){
        if(lengteVanPincode==1) {char1.setText("X");pin1="4";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="4";}
        if(lengteVanPincode==3) {char3.setText("X");pin3="4";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="4";}
        lengteVanPincode++;
    }
     if(serialData.equals("5") && pincodePanel.isVisible() ){
        if(lengteVanPincode==1) {char1.setText("X");pin1="5";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="5";}
        if(lengteVanPincode==3) {char3.setText("X");pin3="5";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="5";}
        lengteVanPincode++;
    }
     if(serialData.equals("6") && pincodePanel.isVisible()){
        if(lengteVanPincode==1) {char1.setText("X");pin1="6";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="6";}
        if(lengteVanPincode==3) {char3.setText("X");pin3="6";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="6";}
        lengteVanPincode++;
    }
     if(serialData.equals("7") && pincodePanel.isVisible() ){
        if(lengteVanPincode==1) {char1.setText("X");pin1="7";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="7";}
        if(lengteVanPincode==3) {char3.setText("X");pin3="7";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="7";}
        lengteVanPincode++;
    }
     if(serialData.equals("8") && pincodePanel.isVisible()){
        if(lengteVanPincode==1) {char1.setText("X");pin1="8";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="8";}
        if(lengteVanPincode==3) {char3.setText("X");pin3="8";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="8";}
        lengteVanPincode++;
    }
     if(serialData.equals("9") && pincodePanel.isVisible()){
        if(lengteVanPincode==1) {char1.setText("X");pin1="9";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="9";}
        if(lengteVanPincode==3) {char3.setText("X");pin3="9";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="9";}
        lengteVanPincode++;
    }
     if(serialData.equals("0") && pincodePanel.isVisible()){
        if(lengteVanPincode==1) {char1.setText("X");pin1="0";}
        if(lengteVanPincode==2) {char2.setText("X");pin2="0";} 
        if(lengteVanPincode==3) {char3.setText("X");pin3="0";}
        if(lengteVanPincode==4) {char4.setText("X");pin4="0";}
        lengteVanPincode++;
    }
    if(serialData.equals("C") && pincodePanel.isVisible()){ // iemand druk op C en het is op de pincodepaneel.
        char1.setText("_");                //reset de karakters
        char2.setText("_");
        char3.setText("_");
        char4.setText("_");
        lengteVanPincode=0;               //pin weer leegmaken.
    }

        ingevoerdePin = String.valueOf(pin1 + pin2 + pin3 + pin4);// alle 4 Strings worden samen 1 String
    }

    public void correctePinCode() throws Exception {
        if (pincodePanel.isVisible() && ingevoerdePin.equals(pincode) && lengteVanPincode == 5 && serialData.equals("#")
                && incorrecteInlogPogingen < 3) {// Het staat op paneel 3. ingevoerdePin is correct en lengteVanPincode
                                                 // is 5. En je drukt op #. En gescandePas is niet geblokeerd.
            pincodePanel.setVisible(false);
            cleaningFrame();
            ingelogdPanel.add(btnNaarHome);
            frame.getContentPane().add(ingelogdPanel);
            ingelogdPanel.setVisible(true);
            incorrecteInlogPogingen = 0;
            String query = ("UPDATE accounts SET aantalfouten=" + incorrecteInlogPogingen + " WHERE Pasnummer='"  + gescandePas + "' ");
            Statement st = conn.createStatement();
            st.executeUpdate(query);
        }

        if (lengteVanPincode >= 5) { //als de pincode lengte groter of gelijk is aan 5
            lengteVanPincode = 5; //lengteVanPincode is 5. 5, omdat ik begin met tellen bij 1.                              
        }
    }
  
    public void incorrectePincode() throws Exception {  /*pincodePanel is zichtbaar,pincode is verkeerd, er wordt op # gedrukt en de incorrecteInlogpogingen is onder de 3 */
        if (pincodePanel.isVisible() && !ingevoerdePin.equals(pincode) && serialData.equals("#") && incorrecteInlogPogingen < 3) {
            incorrecteInlogPogingen += 1;   //increment incorrecteInlogPogingen.
            String query = ("UPDATE accounts SET aantalfouten=" + incorrecteInlogPogingen + " WHERE Pasnummer='" + gescandePas + "' ");
            Statement st = conn.createStatement();
            st.executeUpdate(query);/*de incorrecteInlogPogingen worden verstuurd naar de Database,zodat de database geupdate kan worden */

            incorrectInloggenLabel.setText("incorrecte inlogpogingen: " + incorrecteInlogPogingen);
            incorrectPinMelding.setVisible(true);   //een melding verschijnt zich.
             delay(2000); 
            incorrectPinMelding.setVisible(false);
            /*reset alles van pincodes */
            char1.setText("_");
            char2.setText("_");
            char3.setText("_");
            char4.setText("_");
            ingevoerdePin = "____";
            lengteVanPincode = 1;
        }
    }

    public void passBlokkeren() {/*meer dan 2 keer verkeerd, pincodePanel is zichtbaar en er wordt op # gedrukt. */
        if (incorrecteInlogPogingen > 2 && pincodePanel.isVisible() && serialData.equals("#")) {

            labelBlokkerenBijPinnen.setText("Pas is geblokkeerd");
            pasBlokerrenBijPinnen.setVisible(true); //melding verschijnt zich.
            delay(2000);
            pasBlokerrenBijPinnen.setVisible(false);
        }
    }

    public void pinCodeClearen() {
        if (!pincodePanel.isVisible()) { // Als pincodePanel niet zichtbaar is.
            /* De pincode wordt omgezet naar streepjes om te laten zien dat de pin leeg is. */
            char1.setText("_");
            char2.setText("_");
            char3.setText("_");
            char4.setText("_");
            ingevoerdePin = "____";
            lengteVanPincode = 1; // lengteVanPincode wordt weer naar 1 geplaats.
        }
    }

    public void gaNaarOpnemenPanel() {
        if (ingelogdPanel.isVisible() && serialData.equals("C")) {  //ingelogdPanel is zichtbaar en er wordt op C gedrukt.
            ingelogdPanel.setVisible(false); //sluit de huidige Panel
            cleaningFrame();
            frame.getContentPane().add(opnemenPanel);
            opnemenPanel.add(btnNaarHome);  //neem de afbreken Knop mee.
            opnemenPanel.setVisible(true);//ga naar de opnemenPanel.
        }
    }

    public void showBalance() {
        if (ingelogdPanel.isVisible() && serialData.equals("A")) {  //er wordt op A gedrukt en de ingelogdPanel is zichtbaar.

            showBalanceLabel.setText("Balance = \u20ac " + balance);
            showBalanceMelding.setVisible(true);    //melding openen.
           delay(2000);
            showBalanceMelding.setVisible(false);// melding sluit zich

        }
    }

    public void knopjesVanBiljettenVerbergen() {    
        /* hier worden de knopjes van de biljetten verborgen 
        Als de biljetten van de database kleiner of gelijk is aan de biljetten van de gebruiker.
        Dan worden de buttons onzichtbaar. En als dat niet zo is, dan zijn de buttons zichtbaar.
        */
        if (aantalTienEuroBiljetteninDatabase <= aantalTienEuroBiljetten) {
            plus10.setVisible(false);
        } else {
            plus10.setVisible(true);
        }

        if (aantalTwintigEuroBiljetteninDatabase <= aantalTwintigEuroBiljetten) {
            plus20.setVisible(false);
        } else {
            plus20.setVisible(true);
        }

        if (aantalVijftigEuroBiljetteninDatabase <= aantalVijftigEuroBiljetten) {
            plus50.setVisible(false);
        } else {
            plus50.setVisible(true);
        }
    }

    public void snelKeuzeMenu() throws Exception {
        if (ingelogdPanel.isVisible() && serialData.equals("B")) {
            if (balance >= 50 && aantalVijftigEuroBiljetteninDatabase > 0) {
                /*als balance groter of gelijk is aan 50 en de 50euroBiljetten uit de database groter dan 0 is. */
                aantalVijftigEuroBiljetteninDatabase -= 1;  //decrement
                String query = ("UPDATE Biljetten SET TienEuro=" + aantalVijftigEuroBiljetteninDatabase);
                Statement st = conn.createStatement();
                st.executeUpdate(query);//update de 50 euro biljetten van de database.

                SKMLabel.setText("U krijgt nu \u20ac 50 ");
                SKMMelding.setVisible(true);            //een melding verschijnt zich.
                delay(2000);
                SKMMelding.setVisible(false);           //sluit melding.
                aantalVijftigEuroBiljetten = 1;
                stuurGegevensNaarGelddispenserZonderBon();

                ingelogdPanel.setVisible(false);    //sluit huidige paneel
                cleaningFrame();
                homeScreenPanel.setVisible(true);   //ga terug naar startscherm
                balance -= 50;  //balance wordt met 50 vermindert.
                String query2 = ("UPDATE accounts SET Balance=" + balance + " WHERE Pasnummer='" + gescandePas + "' ");
                Statement st2 = conn.createStatement();
                st.executeUpdate(query2);   //update balance van Database.

            }
            if (balance < 50) {
                SKMLabel.setText("Niet genoeg geld");
                SKMMelding.setVisible(true);        //melding verschijnt
               delay(2000);
                SKMMelding.setVisible(false);       //sluit melding
            }
        }
    }

    public void terugNaarIngelogdPanel() {
        if (opnemenPanel.isVisible() && serialData.equals("D")) {//opnemenPanel is zichtbaar en er wordt op D gedrukt.
            opnemenPanel.setVisible(false);
            resetWaardes();
            cleaningFrame();
            ingelogdPanel.add(btnNaarHome);
            frame.getContentPane().add(ingelogdPanel);
            ingelogdPanel.setVisible(true);
        }
    }

    public void opnemen() throws Exception {
        /*opnemenPanel is zichtbaar,er wordt op 1 gedrukt en de plus10 knopje is nog zichtbaar */
        if (opnemenPanel.isVisible() && serialData.equals("1") && plus10.isVisible()) {
            aantalTienEuroBiljetten++;  //increment
            aantalTienEuroBiljettenTekst = String.valueOf(aantalTienEuroBiljetten); //van integer naar String omzetten
            biljet10Counter.setText(aantalTienEuroBiljettenTekst);      //string op de label plaatsen
            totaalPrijsVanBiljet = Integer.valueOf(aantalTienEuroBiljettenTekst) * 10; //String omzetten naar Integer en dan * 10.

        }
        if (opnemenPanel.isVisible() && serialData.equals("2")) {
            aantalTienEuroBiljetten--;  //decrement

            if (aantalTienEuroBiljetten < 0) {  //dit zorgt ervoor dat je niet onder de 0 biljetten kan komen.
                aantalTienEuroBiljetten = 0;
            }
            aantalTienEuroBiljettenTekst = String.valueOf(aantalTienEuroBiljetten);
            biljet10Counter.setText(aantalTienEuroBiljettenTekst);

            totaalPrijsVanBiljet = Integer.valueOf(aantalTienEuroBiljettenTekst) * 10;  //keer 10
        }
        if (opnemenPanel.isVisible() && serialData.equals("4") && plus20.isVisible()) {
            aantalTwintigEuroBiljetten++;
            aantalTwintigEuroBiljettenTekst = String.valueOf(aantalTwintigEuroBiljetten);
            biljet20Counter.setText(aantalTwintigEuroBiljettenTekst);
            totaalPrijsVanBiljet2 = Integer.valueOf(aantalTwintigEuroBiljettenTekst) * 20; //keer 20
        }
        if (opnemenPanel.isVisible() && serialData.equals("5")) {
            aantalTwintigEuroBiljetten--;

            if (aantalTwintigEuroBiljetten < 0) {  //dit zorgt ervoor dat je niet onder de 0 biljetten kan komen.
                aantalTwintigEuroBiljetten = 0;
            }
            aantalTwintigEuroBiljettenTekst = String.valueOf(aantalTwintigEuroBiljetten);
            biljet20Counter.setText(aantalTwintigEuroBiljettenTekst);
            totaalPrijsVanBiljet2 = Integer.valueOf(aantalTwintigEuroBiljettenTekst) * 20;  //keer 20
        }

        if (opnemenPanel.isVisible() && serialData.equals("7") && plus50.isVisible()) {
            aantalVijftigEuroBiljetten++;
            aantalVijftigEuroBiljettenTekst = String.valueOf(aantalVijftigEuroBiljetten);
            biljet50Counter.setText(aantalVijftigEuroBiljettenTekst);
            totaalPrijsVanBiljet3 = Integer.valueOf(aantalVijftigEuroBiljettenTekst) * 50;  //keer 50
        }
        if (opnemenPanel.isVisible() && serialData.equals("8")) {
            aantalVijftigEuroBiljetten--;

            if (aantalVijftigEuroBiljetten < 0) {  //dit zorgt ervoor dat je niet onder de 0 biljetten kan komen.
                aantalVijftigEuroBiljetten = 0;
            }
            aantalVijftigEuroBiljettenTekst = String.valueOf(aantalVijftigEuroBiljetten);
            biljet50Counter.setText(aantalVijftigEuroBiljettenTekst);
            totaalPrijsVanBiljet3 = Integer.valueOf(aantalVijftigEuroBiljettenTekst) * 50;  //keer 50
        }




        if (opnemenPanel.isVisible() || bonPanel.isVisible()) { //als opnemenPanel of bonPanel zichtbaar zijn.
            gekozenBedrag = totaalPrijsVanBiljet + totaalPrijsVanBiljet2 + totaalPrijsVanBiljet3;   //alle biljetprijzen worden 1 bedrag
            totaalBedrag = String.valueOf(gekozenBedrag);//int naar string
            totalCounter.setText(totaalBedrag); //plaats de totale bedrag op de label

        } else {// als het niet op de opnemenPanel of bonPanel staat, reset dan alle waardes.
            totaalPrijsVanBiljet = 0;
            totaalPrijsVanBiljet2 = 0;
            totaalPrijsVanBiljet3 = 0;
            gekozenBedrag = 0;
        }

        if (opnemenPanel.isVisible() && serialData.equals("#")) {   //opnemenPanel is zichtbaar en er wordt op # gedrukt.

            if (balance >= gekozenBedrag) { //als je meer geld hebt dan jouw gekozenbedrag.
                opnemenPanel.setVisible(false);
                cleaningFrame();
                frame.getContentPane().add(bonPanel);
                bonPanel.setVisible(true);
            } else {    //en anders krijg je een melding
                nietGenoegGeldTekst.setText("Niet genoeg geld");
                nietGenoegGeldMelding.setVisible(true);
               delay(2000);
        
                nietGenoegGeldMelding.setVisible(false);
                
            }

        }
    }

    public void resetWaardes() {
        if (!opnemenPanel.isVisible() && !bonPanel.isVisible() ) {//als opnemenPanel en bonPanel onzichtbaar zijn.
            /* de waardes weer naar 0 veranderen. */
            aantalTienEuroBiljetten = 0;
            aantalTwintigEuroBiljetten = 0;
            aantalVijftigEuroBiljetten = 0;
            aantalTienEuroBiljettenTekst = String.valueOf(aantalTienEuroBiljetten);
            biljet10Counter.setText(aantalTienEuroBiljettenTekst);
            aantalTwintigEuroBiljettenTekst = String.valueOf(aantalTwintigEuroBiljetten);
            biljet20Counter.setText(aantalTwintigEuroBiljettenTekst);
            aantalVijftigEuroBiljettenTekst = String.valueOf(aantalVijftigEuroBiljetten);
            biljet50Counter.setText(aantalVijftigEuroBiljettenTekst);
            totalCounter.setText("0");
           
        }
    }

    public void bonMenu() throws Exception {

        if (bonPanel.isVisible() && serialData.equals("A")) {       //er wordt op A gedrukt
            balance -= gekozenBedrag;   //gekozenBedrag wordt van balance afgetrokken.

            String query = ("UPDATE accounts SET Balance=" + balance + " WHERE Pasnummer='" + gescandePas + "' ");
            Statement st = conn.createStatement();
            st.executeUpdate(query);    //update jouw nieuwe balance naar de database

            updateDatabase();   
            stuurGegevensNaarGelddispenser();

            bonPanel.setVisible(false);
            cleaningFrame();
            homeScreenPanel.setVisible(true);   //ga weer terug naar startscherm.
        }

        if (bonPanel.isVisible() && serialData.equals("B")) {   //als je op B drukt.
            balance -= gekozenBedrag; //gekozenBedrag wordt van balance afgetrokken.

            updateDatabase();
            stuurGegevensNaarGelddispenserZonderBon();

            String query = ("UPDATE accounts SET Balance=" + balance + " WHERE Pasnummer='" + gescandePas + "' ");
            Statement st = conn.createStatement();
            st.executeUpdate(query);  //update jouw nieuwe balance naar de database

            bonPanel.setVisible(false);
            cleaningFrame();
            homeScreenPanel.setVisible(true);   //terug naar startscherm
        }

        if (bonPanel.isVisible() && serialData.equals("C")) {   //er wordt op C gedrukt. transactie wordt afgebroken
            bonPanel.setVisible(false);
            cleaningFrame();
            homeScreenPanel.setVisible(true);   //direct naar startscherm.
        }

    }

    public void updateDatabase() throws Exception {
        /*biljetten van database minus de gekozenBiljetten van gebruiker.
        Update alle biljetten van de database */
        aantalTienEuroBiljetteninDatabase -= aantalTienEuroBiljetten;
        String query = ("UPDATE Biljetten SET TienEuro=" + aantalTienEuroBiljetteninDatabase);
        Statement st = conn.createStatement();
        st.executeUpdate(query);

        aantalTwintigEuroBiljetteninDatabase -= aantalTwintigEuroBiljetten;
        String query2 = ("UPDATE Biljetten SET TwintigEuro=" + aantalTwintigEuroBiljetteninDatabase);
        Statement st2 = conn.createStatement();
        st2.executeUpdate(query2);

        aantalVijftigEuroBiljetteninDatabase -= aantalVijftigEuroBiljetten;
        String query3 = ("UPDATE Biljetten SET VijftigEuro=" + aantalVijftigEuroBiljetteninDatabase);
        Statement st3 = conn.createStatement();
        st3.executeUpdate(query3);
    }

    public void stuurGegevensNaarGelddispenserZonderBon() throws Exception {
        Arduino arduino = new Arduino("COM15", 9600); // enter the port name here, and ensure that Arduino is connected,
                                                      // otherwise exception will be thrown.
        arduino.openConnection();   //connectie openen met arduino
        delay(2000);

        arduino.serialWrite("1" + (String.valueOf(aantalTienEuroBiljetten)) + "."); // stuur aantal tientjes
        System.out.println("1" + (String.valueOf(aantalTienEuroBiljetten)) + ".");
        arduino.serialWrite("2" + (String.valueOf(aantalTwintigEuroBiljetten)) + "."); // stuur aantal twintigjes
        System.out.println("2" + (String.valueOf(aantalTwintigEuroBiljetten)) + ".");
        arduino.serialWrite("3" + (String.valueOf(aantalVijftigEuroBiljetten)) + "."); // stuur aantal vijftigjes
        System.out.println("3" + (String.valueOf(aantalVijftigEuroBiljetten)) + ".");
        arduino.serialWrite("8.");  // 8 is de commando voor zonder bon.
        arduino.closeConnection();
        System.out.println("Port closed.");

    }

    public void stuurGegevensNaarGelddispenser() throws Exception {
        System.out.println(aantalTienEuroBiljetten);
        System.out.println(aantalTwintigEuroBiljetten);
        System.out.println(aantalVijftigEuroBiljetten);

        Arduino arduino = new Arduino("COM15", 9600); // enter the port name here, and ensure that Arduino is connected,
                                                      // otherwise exception will be thrown.
        arduino.openConnection();
        delay(2000);
        arduino.serialWrite("1" + (String.valueOf(aantalTienEuroBiljetten)) + "."); // stuur aantal tientjes
        System.out.println("1" + (String.valueOf(aantalTienEuroBiljetten)) + ".");
        arduino.serialWrite("2" + (String.valueOf(aantalTwintigEuroBiljetten)) + "."); // stuur aantal twintigjes
        System.out.println("2" + (String.valueOf(aantalTwintigEuroBiljetten)) + ".");
        arduino.serialWrite("3" + (String.valueOf(aantalVijftigEuroBiljetten)) + "."); // stuur aantal vijftigjes
        System.out.println("3" + (String.valueOf(aantalVijftigEuroBiljetten)) + ".");
        arduino.serialWrite("5" + gescandePas + ".");
        System.out.println("5" + gescandePas + ".");
        arduino.serialWrite("7.");          //7 is de commando voor bon
        arduino.closeConnection();
        System.out.println("Port closed.");

    }

    public void arduinoListener() {

        comPort = SerialPort.getCommPort("COM7");

        comPort.setBaudRate(9600);
        comPort.openPort(); // open the portcom

        // 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
                serialData = new String(newData); // convert bytes to string

                try {
                    if (!connected) {
                        /* Database connectie */
                        String myDriver = "org.gjt.mm.mysql.Driver";
                       // String myUrl = "jdbc:mysql://localhost/projectdatabase";      lokaledatabase
                         String myUrl = "jdbc:mysql://145.24.222.203/projectDatabase";  //schooldatabase
                        Class.forName(myDriver);
                        //conn = DriverManager.getConnection(myUrl, "root", "");         lokale database
                        conn = DriverManager.getConnection(myUrl, "kaas", "pinguin");   //schooldatabase
                        connected = true;
                    }

                    gaNaarScanPasPanel();
                    terugNaarHomeScreenPanel();
                    pasLezen();
                    pakBiljettenVanDatabase();
                    knopjesVanBiljettenVerbergen();
                    pinCodeInvullen();
                    pinCodeClearen();
                    correctePinCode();
                    incorrectePincode();
                    passBlokkeren();
                    gaNaarOpnemenPanel();
                    resetWaardes();
                    showBalance();
                    snelKeuzeMenu();
                    terugNaarIngelogdPanel();
                    opnemen();
                    bonMenu();

                } catch (Exception e) {
                    System.err.println("Got an exception! ");
                    System.err.println(e.getMessage());
                }

            }
        });

    }

}
