package sample;

import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
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.Text;
import javafx.stage.Modality;
import javafx.stage.Stage;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.HashMap;

/**
 * Created by urankajtazaj on 13/10/16.
 */
public class ShikoPunetPunetoret {
    Stage stage = new Stage();
    TableView<TabelaTeDhenatPunetore> table = new TableView<>();
    TextField txtPuna = new TextField();
    TextField txtKons = new TextField();
    Label lblEmri = new Label();
    Button btnRaporti = new Button("Krijo raport");
    Button btnStatusi = new Button("Statusi");

    int id = -1;
    boolean kryer;

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

    String raportiPunetor = "/RaportiPunetor.jrxml";
    String folderi;

    public ShikoPunetPunetoret(String emri, String mbiemri){

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    BufferedReader br = new BufferedReader(new FileReader(new File(System.getProperty("user.home") + "/db/raportet.txt")));
                    raportiPunetor = br.readLine() + raportiPunetor;
                    folderi = br.readLine();
                    br.close();
                }catch (Exception ex){ex.printStackTrace();}
            }
        });
        t.start();

        stage.initModality(Modality.APPLICATION_MODAL);
        stage.setResizable(false);
        stage.setTitle("Te dhenat");
        GridPane root = new GridPane();
        HBox pyet = new HBox(5);
        txtPuna.setPromptText("Puna e kryer");
        txtKons.setPromptText("Konsumatori");
        Button btnKerko = new Button("Kerko");
        pyet.getChildren().addAll(txtPuna, txtKons, btnKerko);
        pyet.setAlignment(Pos.CENTER_RIGHT);
        lblEmri.setText(emri.toLowerCase() + mbiemri.toLowerCase());

        krijoRaport(emri.toLowerCase() + mbiemri.toLowerCase());

        TableColumn colId = new TableColumn("ID");
        TableColumn colPuna = new TableColumn("Puna e kryer");
        TableColumn colKons = new TableColumn("Konsumatori");
        TableColumn colQmimi = new TableColumn("Pagesa");
        TableColumn colData = new TableColumn("Data");
        TableColumn colStatusi = new TableColumn("Statusi");
        TableColumn colMakina = new TableColumn("Makina");

        colId.setMaxWidth(50);
        colId.setMinWidth(50);
        colPuna.setMinWidth(220);
        colPuna.setMaxWidth(240);
        colQmimi.setMaxWidth(60);
        colQmimi.setMinWidth(60);

        colMakina.setCellValueFactory(new PropertyValueFactory("makina"));
        colId.setCellValueFactory(new PropertyValueFactory("id"));
        colPuna.setCellValueFactory(new PropertyValueFactory("puna"));
        colKons.setCellValueFactory(new PropertyValueFactory("konsumatori"));
        colQmimi.setCellValueFactory(new PropertyValueFactory("qmimi"));
        colData.setCellValueFactory(new PropertyValueFactory("data"));
        colStatusi.setCellValueFactory(new PropertyValueFactory("kryer"));
        colStatusi.setMaxWidth(65);
        colStatusi.setMinWidth(60);
        colStatusi.setStyle("-fx-alignment: center center");
        colStatusi.setCellFactory(e -> {
            return new TableCell<punetTbl, String>(){
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (item == null || empty){
                    }else {
                        if (item.equals("po")){
                            setGraphic(new ImageView(new Image("/sample/foto/green.png")));
                        }else setGraphic(new ImageView(new Image("/sample/foto/red.png")));
                    }
                }
            };
        });

        HBox hb = new HBox(5);
        hb.getChildren().addAll(btnRaporti, btnStatusi);

        btnRaporti.setGraphic(new ImageView(new Image("/sample/foto/report.png")));

        table.getColumns().addAll(colId, colPuna, colKons, colMakina, colQmimi, colData, colStatusi);
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
        table.setPlaceholder(new Label("Nuk ka te dhena"));
        mbush(emri.toLowerCase() + mbiemri.toLowerCase());

        table.setMinWidth(770);

        table.getSelectionModel().selectedItemProperty().addListener((o, ov, nv) -> {
            if (nv != null){
                id = nv.getId();
                if (nv.getKryer().equals("po")) kryer = true;
                else kryer = false;
            }else id = -1;
        });

        btnStatusi.setOnAction(e -> {
            if (id > -1)
                new RregulloPunen(id, this, kryer);
        });

        root.add(pyet, 0, 0);
        root.add(table, 0, 1);
        root.add(hb, 0, 2);

        root.setVgap(10);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(10));

        btnKerko.setOnAction(e -> filtroTabelen(emri.toLowerCase() + mbiemri.toLowerCase()));
        txtKons.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER))filtroTabelen(emri.toLowerCase() + mbiemri.toLowerCase());});
        txtPuna.setOnKeyPressed(e -> {if (e.getCode().equals(KeyCode.ENTER))filtroTabelen(emri.toLowerCase() + mbiemri.toLowerCase());});

        Scene scene = new Scene(root, 780, 475);
        scene.getStylesheets().add(getClass().getResource("/sample/style.css").toExternalForm());
        scene.setOnKeyPressed(e -> {
            if (e.getCode().equals(KeyCode.ESCAPE)) stage.close();
        });
        stage.setScene(scene);
        stage.show();
    }

    public void mbush(String emri){
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String sql = "select * from Punet where punetori = '" + emri + "' order by id asc";
                    Connection conn = DriverManager.getConnection(CON_STR, "test", "test");
                    Statement stmt = conn.createStatement();
                    ResultSet rs = stmt.executeQuery(sql);
                    ObservableList<TabelaTeDhenatPunetore> data = FXCollections.observableArrayList();
                    Format format = new SimpleDateFormat("dd/MM/yyyy");
                    String s = "";
                    while (rs.next()) {
                        s = format.format(rs.getDate("data"));
                        data.add(new TabelaTeDhenatPunetore(rs.getInt("id"), rs.getString("lloji"), s,
                                rs.getFloat("qmimi"), rs.getString("konsumatori"), rs.getString("pershkrimi"), rs.getString("kryer"), rs.getString("makina")));
                    }

                    rs.close();
                    stmt.close();
                    conn.close();
                    table.setItems(data);
                }catch (Exception ex){ex.printStackTrace();}
            }
        });
        t.start();
    }

    public void mbushNgaStatusi(String emri){
        try {
            String sql = "select * from Punet where punetori = '" + emri + "' order by id asc";
            Connection conn = DriverManager.getConnection(CON_STR, "test", "test");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            ObservableList<TabelaTeDhenatPunetore> data = FXCollections.observableArrayList();
            Format format = new SimpleDateFormat("dd/MM/yyyy");
            String s = "";
            while (rs.next()) {
                s = format.format(rs.getDate("data"));
                data.add(new TabelaTeDhenatPunetore(rs.getInt("id"), rs.getString("lloji"), s,
                        rs.getFloat("qmimi"), rs.getString("konsumatori"), rs.getString("pershkrimi"), rs.getString("kryer"), rs.getString("makina")));
            }

            rs.close();
            stmt.close();
            conn.close();
            table.setItems(data);
        }catch (Exception ex){ex.printStackTrace();}
    }

    private void krijoRaport(String pnt){
        btnRaporti.setOnAction(e -> {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Connection conn = DriverManager.getConnection(CON_STR, "test", "test");
                        HashMap hm = new HashMap();
                        hm.put("Folderi", folderi);
                        hm.put("punetori", pnt);
                        JasperReport jreport = JasperCompileManager.compileReport(raportiPunetor);
                        JasperPrint jprint = JasperFillManager.fillReport(jreport, hm, conn);
                        JasperViewer.viewReport(jprint, false);
                        conn.close();
                    }catch (Exception ex){ex.printStackTrace();}
                }
            });
            t.start();
        });
    }

    private void filtroTabelen(String pnt){
        try {
            StringBuilder sql = new StringBuilder("select * from Punet where");
            StringBuilder newSql = new StringBuilder("select * from Punet");

            if (!txtPuna.getText().equals(""))
                sql.append(" lower(lloji) like lower('%" + txtPuna.getText() + "%') and");
            if (!txtKons.getText().equals(""))
                sql.append(" lower(konsumatori) like ('%" + txtKons.getText() + "%') and");

            if (sql.substring(sql.length()-3, sql.length()).equals("and")){
                StringBuilder ns = new StringBuilder(sql.substring(0, sql.length()-3) + "and punetori = '" + pnt + "' order by id asc");
                newSql = ns;
            }else if (sql.substring(sql.length()-5, sql.length()).equals("where")){
                StringBuilder ns = new StringBuilder(sql.substring(0, sql.length()-5) + "and punetori = '" + pnt + "' order by id asc");
                newSql = ns;
                if(sql.substring(14, sql.length()-6).equals("Punet")){
                    StringBuilder nss = new StringBuilder(sql.substring(0, sql.length()-6) + " where punetori = '" + pnt + "' order by id asc");
                    newSql = nss;
                }
            }

            Connection conn = DriverManager.getConnection(CON_STR, "test", "test");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(newSql.toString());
            ObservableList<TabelaTeDhenatPunetore> data = FXCollections.observableArrayList();
            Format format = new SimpleDateFormat("dd/MM/yyyy");
            String s = "";
            while (rs.next()) {
                s = format.format(rs.getDate("data"));
                data.add(new TabelaTeDhenatPunetore(rs.getInt("id"), rs.getString("lloji"), s,
                        rs.getFloat("qmimi"), rs.getString("konsumatori"), rs.getString("pershkrimi"), rs.getString("kryer"), rs.getString("makina")));
            }

            rs.close();
            stmt.close();
            conn.close();
            table.setItems(data);
        }catch (Exception ex){ex.printStackTrace();}
    }
}