package sample;

import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.stage.Modality;
import javafx.stage.Stage;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLNonTransientConnectionException;
import java.sql.Statement;
import java.time.LocalDate;

/**
 * Created by urankajtazaj on 11/10/16.
 */

public class ShtoPunetor {
    Stage stage = new Stage();
    TextField emri = new TextField();
    TextField mbiemri = new TextField();
    TextField komuna = new TextField();
    TextField paga = new TextField();
    PasswordField pw = new PasswordField();
    Hyperlink shfaq = new Hyperlink();
    Label lblPw = new Label();
    TextField user = new TextField();
    DatePicker data = new DatePicker();
    TextField pjesa = new TextField();
    Button btnOk = new Button("Ne rregull");
    Button btnAnulo = new Button("Anulo");

    private static final String CON_STR = "jdbc:h2:file:~/db/auto";

    public ShtoPunetor(){
        stage.getIcons().add(new Image(getClass().getResourceAsStream("/sample/foto/icon.png")));
        stage.setTitle("Shtimi i punetoreve");
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.setResizable(false);
        HBox btn = new HBox(5);
        btn.setAlignment(Pos.CENTER_RIGHT);
        btn.getChildren().addAll(btnOk, btnAnulo);
        data.setValue(LocalDate.now());

        GridPane root = new GridPane();
        root.add(new Label("Emri"), 0, 0);
        root.add(emri, 1, 0);
        root.add(new Label("Mbiemri"), 0, 1);
        root.add(mbiemri, 1, 1);
        root.add(new Label("Fjalekalimi"), 0, 2);
        root.add(pw, 1, 2);
        root.add(new Label("Komuna"), 0, 3);
        root.add(komuna, 1, 3);
        root.add(new Label("Pozita"), 0, 4);
        root.add(pjesa, 1, 4);
        root.add(new Label("Paga mujore"), 0, 5);
        root.add(paga, 1, 5);
        root.add(new Label("Data e regjistrimit"), 0, 6);
        root.add(data, 1, 6);
        root.add(btn, 1, 7);

        btnOk.setOnAction(e -> {
            shtoPunetoreMethod();
        });
        btnAnulo.setOnAction(e -> stage.close());

        data.setOnKeyPressed(e -> {
            if (e.getCode().equals(KeyCode.ENTER)) shtoPunetoreMethod();
            else if (e.getCode().equals(KeyCode.ESCAPE)) stage.close();
        });
        emri.setOnKeyPressed(e -> {
            if (e.getCode().equals(KeyCode.ENTER)) shtoPunetoreMethod();
            else if (e.getCode().equals(KeyCode.ESCAPE)) stage.close();
        });
        mbiemri.setOnKeyPressed(e -> {
            if (e.getCode().equals(KeyCode.ENTER)) shtoPunetoreMethod();
            else if (e.getCode().equals(KeyCode.ESCAPE)) stage.close();
        });
        komuna.setOnKeyPressed(e -> {
            if (e.getCode().equals(KeyCode.ENTER)){shtoPunetoreMethod(); }});
        pjesa.setOnKeyPressed(e -> {
            if (e.getCode().equals(KeyCode.ENTER)) shtoPunetoreMethod();
            else if (e.getCode().equals(KeyCode.ESCAPE)) stage.close();
        });
        paga.setOnKeyPressed(e -> {
            if (e.getCode().equals(KeyCode.ENTER)) shtoPunetoreMethod();
            else if (e.getCode().equals(KeyCode.ESCAPE)) stage.close();
        });

        root.setVgap(7);
        root.setHgap(5);
        root.setAlignment(Pos.CENTER);

        Scene scene = new Scene(root, 360, 370);
        scene.getStylesheets().add(getClass().getResource("/sample/style.css").toExternalForm());
        stage.setScene(scene);
        stage.show();
    }

    public ShtoPunetor(DritarjaKryesore dk, String dump){
        stage.getIcons().add(new Image(getClass().getResourceAsStream("/sample/foto/icon.png")));
        stage.setTitle("Ndrysho fjalekalimin");
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.setResizable(false);
        HBox btn = new HBox(5);
        btn.setAlignment(Pos.CENTER_RIGHT);
        btn.getChildren().addAll(btnOk, btnAnulo);
        data.setValue(LocalDate.now());

        GridPane root = new GridPane();
        root.add(new Label("Emri"), 0, 0);
        root.add(user, 1, 0);
        root.add(new Label("Fjalekalimi"), 0, 1);
        root.add(pw, 1, 1);
        root.add(shfaq, 2, 1);
        root.add(lblPw, 1, 2);
        root.add(btn, 1, 4);

        shfaq.setGraphic(new ImageView(new Image("/sample/foto/eye.png")));
        shfaq.setOnMousePressed(e -> lblPw.setText(pw.getText()));
        shfaq.setOnMouseReleased(e -> lblPw.setText(""));

        user.setText(dk.log_user.getText());
        pw.setText(dk.log_pw.getText());
        user.setEditable(false);
        user.setTooltip(new Tooltip("Emri nuk mund te ndryshohet"));

        btnOk.setOnAction(e -> {
            if (pw.getText().length() > 5){
                rregullo(Integer.parseInt(dk.lblId.getText()));
            }else new Mesazhi("Info", "Fjalekalimi i shkurte", "Fjalekalimi duhet te jete mbi 5 karaktere i gjate.");
        });
        btnAnulo.setOnAction(e -> stage.close());

        pw.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER)){
            if (pw.getText().length() > 5)
                rregullo(Integer.parseInt(dk.lblId.getText()));
            else new Mesazhi("Info", "Fjalekalimi i shkurte", "Fjalekalimi duhet te jete mbi 5 karaktere i gjate.");
        }});
        emri.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER)){
            if (pw.getText().length() > 5)
                rregullo(Integer.parseInt(dk.lblId.getText()));
            else new Mesazhi("Info", "Fjalekalimi i shkurte", "Fjalekalimi duhet te jete mbi 5 karaktere i gjate.");
        }});

        root.setVgap(7);
        root.setHgap(5);
        root.setAlignment(Pos.CENTER);

        Scene scene = new Scene(root, 320, 210);
        scene.getStylesheets().add(getClass().getResource("/sample/style.css").toExternalForm());
        stage.setScene(scene);
        stage.show();
    }

    public ShtoPunetor(int id, String stremri, String strmbiemri, String strkomuna, String strpozita, float strpaga, ShikoPunetoret sp){
        stage.getIcons().add(new Image(getClass().getResourceAsStream("/sample/foto/icon.png")));
        System.out.println(id);
        stage.setTitle("Shtimi i punetoreve");
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.setResizable(false);
        HBox btn = new HBox(5);
        btn.setAlignment(Pos.CENTER_RIGHT);
        btn.getChildren().addAll(btnOk, btnAnulo);
        data.setValue(LocalDate.now());

        emri.setText(stremri);
        mbiemri.setText(strmbiemri);
        komuna.setText(strkomuna);
        pjesa.setText(strpozita);
        paga.setText(strpaga + "");

        GridPane root = new GridPane();
        root.add(new Label("Emri"), 0, 0);
        root.add(emri, 1, 0);
        root.add(new Label("Mbiemri"), 0, 1);
        root.add(mbiemri, 1, 1);
        root.add(new Label("Fjalekalimi"), 0, 2);
        root.add(pw, 1, 2);
        root.add(new Label("Komuna"), 0, 3);
        root.add(komuna, 1, 3);
        root.add(new Label("Pozita"), 0, 4);
        root.add(pjesa, 1, 4);
        root.add(new Label("Paga mujore"), 0, 5);
        root.add(paga, 1, 5);
        root.add(btn, 1, 6);

        pw.setPromptText("Mund te lihet i zbrazet");
        btnOk.setOnAction(e -> {
            shtoPunetoreMethod2(id, stremri.toLowerCase() + strmbiemri.toLowerCase());
            sp.mbushPunetoret();
        });
        btnAnulo.setOnAction(e -> stage.close());

        data.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER)){shtoPunetoreMethod2(id,stremri.toLowerCase() + strmbiemri.toLowerCase()); sp.mbushPunetoret();}});
        emri.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER)){shtoPunetoreMethod2(id,stremri.toLowerCase() + strmbiemri.toLowerCase()); sp.mbushPunetoret();}});
        mbiemri.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER)){shtoPunetoreMethod2(id,stremri.toLowerCase() + strmbiemri.toLowerCase()); sp.mbushPunetoret();}});
        komuna.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER)){shtoPunetoreMethod2(id,stremri.toLowerCase() + strmbiemri.toLowerCase()); sp.mbushPunetoret();}});
        pjesa.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER)){shtoPunetoreMethod2(id,stremri.toLowerCase() + strmbiemri.toLowerCase()); sp.mbushPunetoret();}});
        paga.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER)){shtoPunetoreMethod2(id,stremri.toLowerCase() + strmbiemri.toLowerCase()); sp.mbushPunetoret();}});

        root.setVgap(7);
        root.setHgap(5);
        root.setAlignment(Pos.CENTER);

        Scene scene = new Scene(root, 360, 350);
        scene.getStylesheets().add(getClass().getResource("/sample/style.css").toExternalForm());
        stage.setScene(scene);
        stage.show();
    }

    private void shtoPunetoreMethod(){
        try {
            if (!emri.getText().isEmpty() && !mbiemri.getText().isEmpty() && !komuna.getText().isEmpty() && !pjesa.getText().isEmpty() &&
                    !paga.getText().isEmpty() && !data.getEditor().getText().isEmpty() && !pw.getText().isEmpty()) {
                String em = emri.getText().substring(0, 1).toUpperCase() + emri.getText().substring(1, emri.getText().length()).toLowerCase();
                String mb = mbiemri.getText().substring(0, 1).toUpperCase() + mbiemri.getText().substring(1, mbiemri.getText().length()).toLowerCase();
                String sql = "insert into Punetoret (emri, mbiemri, komuna, pozita, paga, regjistrimi) values ('" +
                        em + "', '" + mb + "', '" + komuna.getText() + "', '" + pjesa.getText() + "', " +
                        Float.parseFloat(paga.getText()) + ", DATE '" + data.getValue() + "')";
                String adminSql = "insert into Admin (emri, fjalekalimi, lloji) values " +
                        "('" + emri.getText().toLowerCase() + mbiemri.getText().toLowerCase() + "', '" + pw.getText() + "', 0)";
                Connection conn = DriverManager.getConnection(CON_STR, "test", "test");
                Statement stmt = conn.createStatement();
                Statement AdminStmt = conn.createStatement();
                stmt.execute(sql);
                AdminStmt.execute(adminSql);
                conn.close();
                new Mesazhi("Sukses", em + " " + mb, "Punetori u shtua me sukses me daten " + data.getEditor().getText());
                stage.close();
            }else new Mesazhi("Info", "", "Fushat duhet te plotesohen para se te vazhdoni");
        }catch (SQLNonTransientConnectionException fu){}
        catch (NumberFormatException nfw){new Mesazhi("Info", "Gabim", "Fusha qmimi duhet te permbaj vetem numra.");}
        catch (Exception ex){ex.printStackTrace();}
    }

    private void shtoPunetoreMethod2(int id, String name){
        try {
            if (!emri.getText().isEmpty() && !mbiemri.getText().isEmpty() && !komuna.getText().isEmpty() && !pjesa.getText().isEmpty() &&
                    !paga.getText().isEmpty()) {
                String em = emri.getText().substring(0, 1).toUpperCase() + emri.getText().substring(1, emri.getText().length()).toLowerCase();
                String mb = mbiemri.getText().substring(0, 1).toUpperCase() + mbiemri.getText().substring(1, mbiemri.getText().length()).toLowerCase();
                String sql = "update Punetoret set emri = '" + em + "', mbiemri = '" + mb +
                        "', komuna = '" + komuna.getText() + "', pozita = '" + pjesa.getText() + "', paga = " +
                        Float.parseFloat(paga.getText()) + " where id = " + id;

                String adminSql = "";
                String punetSql = "update Punet set punetori = '" + emri.getText().toLowerCase() + mbiemri.getText().toLowerCase()
                        + "' where punetori = '" + name + "'";
                Connection conn = DriverManager.getConnection(CON_STR, "test", "test");
                if (pw.getText().isEmpty()){
                    adminSql = "update Admin set emri = '" + emri.getText().toLowerCase() + mbiemri.getText().toLowerCase() + "'" +
                            " where emri = '" + name + "'";
                }else {
                    adminSql = "update Admin set emri = '" + emri.getText().toLowerCase() + mbiemri.getText().toLowerCase() + "'" +
                            ", fjalekalimi = '" + pw.getText() + "' where emri = '" + name + "'";
                }
                Statement stmt = conn.createStatement();
                stmt.execute(sql);
                Statement adminStmt = conn.createStatement();
                adminStmt.execute(adminSql);
                Statement punetStmt = conn.createStatement();
                punetStmt.execute(punetSql);
                conn.close();
                new Mesazhi("Sukses", em + " " + mb, "Te dhenat u ruajten me sukses.");
                stage.close();
            }
            else new Mesazhi("Info", "", "Fushat duhet te plotesohen para se te vazhdoni");
        }catch (SQLNonTransientConnectionException fu){}
        catch (NullPointerException npe){new Mesazhi("Info", "Gabim", "Fusha qmimi duhet te permbaj vetem numra.");}
        catch (Exception ex){ex.printStackTrace();}
    }

    private void rregullo(int id){
        try {
            if (!user.getText().isEmpty() && !pw.getText().isEmpty()) {
                String sql = "update Admin set emri = '" + user.getText() + "', fjalekalimi = '" + pw.getText() +
                        "' where id = " + id;
                System.out.println("ID: " + id);
                Connection conn = DriverManager.getConnection(CON_STR, "test", "test");
                Statement stmt = conn.createStatement();
                stmt.execute(sql);
                conn.close();
                new Mesazhi("Sukses", "", "Te dhenat u ruajten me sukses. Ju lutem restartoni programin.");
                stage.close();
            }
            else new Mesazhi("Gabim", "", "Fushat duhet te plotesohen para se te vazhdoni");
        }catch (SQLNonTransientConnectionException fu){}
        catch (NullPointerException npe){new Mesazhi("Info", "Gabim", "Fusha qmimi duhet te permbaj vetem numra.");}
        catch (Exception ex){ex.printStackTrace();}
    }
}