package sms.view.controller;

import com.jfoenix.controls.JFXButton;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.design.JRDesignQuery;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import sms.db.DBConnection;
import sms.dbController.StaffController;
import sms.dbController.StudentController;
import sms.model.Staff;
import sms.model.Student;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author Safnaj on 11/1/2018
 * @project School Management System
 **/
public class ManageStaffsController implements Initializable {

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }

    @FXML
    private AnchorPane root;

    @FXML
    private TextField empNoField;

    @FXML
    private TextField teacherNameField;

    @FXML
    private TextField nicField;

    @FXML
    private TextField dobField;

    @FXML
    private TextField doaField;

    @FXML
    private TextField phoneField;

    @FXML
    private TextField addressField;

    @FXML
    private TextField emailField;

    @FXML
    private TextField asmOfDutyField;

    @FXML
    private TextField incDateField;

    @FXML
    private TextField prsntGradeField;

    @FXML
    private TextField empNoOld;

    @FXML
    private JFXButton deleteStaff;

    @FXML
    private JFXButton update;

    @FXML
    private TextField genderField;

    @FXML
    private TextField EmpNo;

    @FXML
    private JFXButton searchStaff;

    @FXML
    private TextField empName;

    @FXML
    private JFXButton searchByName;

    @FXML
    private JFXButton searchOldStaff;

    @FXML
    private JFXButton printStaff;

    @FXML
    private JFXButton Back;

    @FXML
    void Back(ActionEvent event) {
        try {
            AnchorPane studentMgmt = FXMLLoader.load(getClass().getResource(("/sms/view/fxml/StaffManagement.fxml")));
            root.getChildren().setAll(studentMgmt);
        }catch(IOException e){
            System.out.println(e);
        }
    }

    @FXML
    void searchByName(ActionEvent event) {
        try {
            String teacherName = empName.getText();
            Staff s = StaffController.searchStaffByName(teacherName);
            if (s != null) {
                empNoField.setText(String.valueOf(s.getEmpNo()));
                teacherNameField.setText(s.getTeacherName());
                nicField.setText(s.getNic());
                dobField.setText(s.getDob());
                doaField.setText(s.getDoa());
                genderField.setText(s.getGender());
                emailField.setText(s.getEmail());
                asmOfDutyField.setText(s.getAssumpOfDuties());
                phoneField.setText(s.getPhone());
                addressField.setText(s.getAddress());
                incDateField.setText(s.getIncDate());
                prsntGradeField.setText(s.getPrsntGrade());


            } else {
                Alert alert = new Alert(Alert.AlertType.ERROR);
                alert.setTitle("Staff Search");
                alert.setHeaderText(null);
                alert.setContentText("Staff Not Found");
                alert.showAndWait();

                empNoField.setText(null);
                teacherNameField.setText(null);
                nicField.setText(null);
                dobField.setText(null);
                doaField.setText(null);
                emailField.setText(null);
                asmOfDutyField.setText(null);
                nicField.setText(null);
                genderField.setText(null);
                phoneField.setText(null);
                addressField.setText(null);
                incDateField.setText(null);
                prsntGradeField.setText(null);
                empName.setText(null);
                empNoOld.setText(null);
                EmpNo.setText(null);
            }
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(StaffController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @FXML
    void searchOldStaff(ActionEvent event) {
        try {
            int EmpNo2 = Integer.parseInt(empNoOld.getText());
            Staff s = StaffController.searchOldStaff(EmpNo2);
            if (s != null) {
                empNoField.setText(String.valueOf(s.getEmpNo()));
                teacherNameField.setText(s.getTeacherName());
                nicField.setText(s.getNic());
                dobField.setText(s.getDob());
                doaField.setText(s.getDoa());
                genderField.setText(s.getGender());
                emailField.setText(s.getEmail());
                asmOfDutyField.setText(s.getAssumpOfDuties());
                phoneField.setText(s.getPhone());
                addressField.setText(s.getAddress());
                incDateField.setText(s.getIncDate());
                prsntGradeField.setText(s.getPrsntGrade());


            } else {
                Alert alert = new Alert(Alert.AlertType.ERROR);
                alert.setTitle("Staff Search");
                alert.setHeaderText(null);
                alert.setContentText("Staff Not Found");
                alert.showAndWait();

                empNoField.setText(null);
                teacherNameField.setText(null);
                nicField.setText(null);
                dobField.setText(null);
                doaField.setText(null);
                emailField.setText(null);
                asmOfDutyField.setText(null);
                nicField.setText(null);
                genderField.setText(null);
                phoneField.setText(null);
                addressField.setText(null);
                incDateField.setText(null);
                prsntGradeField.setText(null);
                empName.setText(null);
                empNoOld.setText(null);
                EmpNo.setText(null);
            }
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(StaffController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @FXML
    void searchStaff(ActionEvent event) {
        try {
            int empNo = Integer.parseInt(EmpNo.getText());
            Staff s = StaffController.searchStaff(empNo);
            if (s != null) {
                empNoField.setText(String.valueOf(s.getEmpNo()));
                teacherNameField.setText(s.getTeacherName());
                nicField.setText(s.getNic());
                dobField.setText(s.getDob());
                doaField.setText(s.getDoa());
                genderField.setText(s.getGender());
                emailField.setText(s.getEmail());
                asmOfDutyField.setText(s.getAssumpOfDuties());
                phoneField.setText(s.getPhone());
                addressField.setText(s.getAddress());
                incDateField.setText(s.getIncDate());
                prsntGradeField.setText(s.getPrsntGrade());


            } else {
                Alert alert = new Alert(Alert.AlertType.ERROR);
                alert.setTitle("Staff Search");
                alert.setHeaderText(null);
                alert.setContentText("Staff Not Found");
                alert.showAndWait();

                empNoField.setText(null);
                teacherNameField.setText(null);
                nicField.setText(null);
                dobField.setText(null);
                doaField.setText(null);
                emailField.setText(null);
                asmOfDutyField.setText(null);
                nicField.setText(null);
                genderField.setText(null);
                phoneField.setText(null);
                addressField.setText(null);
                incDateField.setText(null);
                prsntGradeField.setText(null);
                empName.setText(null);
                empNoOld.setText(null);
                EmpNo.setText(null);
            }
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(StaffController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @FXML
    void deleteStaff(ActionEvent event) {
        try {
            int empNo = Integer.parseInt(empNoField.getText());
            Staff s = new Staff(Integer.parseInt(empNoField.getText()), teacherNameField.getText(), nicField.getText(), dobField.getText(), doaField.getText(),
                    genderField.getText(), emailField.getText(), asmOfDutyField.getText(), phoneField.getText(), addressField.getText(), incDateField.getText(),prsntGradeField.getText());

            int moveStaff = StaffController.moveStaff(s);
            if (moveStaff > 0) {

                int deleteStaff = StaffController.deleteStaff(empNo);
                if (deleteStaff > 0) {

                    Alert alert = new Alert(Alert.AlertType.INFORMATION);
                    alert.setTitle("Staff Management");
                    alert.setHeaderText(null);
                    alert.setContentText("Staff " + empNo + " Has Been Deleted Sucessfully..!");
                    alert.showAndWait();

                    empNoField.setText(null);
                    teacherNameField.setText(null);
                    nicField.setText(null);
                    dobField.setText(null);
                    doaField.setText(null);
                    emailField.setText(null);
                    genderField.setText(null);
                    asmOfDutyField.setText(null);
                    nicField.setText(null);
                    phoneField.setText(null);
                    addressField.setText(null);
                    incDateField.setText(null);
                    prsntGradeField.setText(null);


                } else {
                    Alert alert = new Alert(Alert.AlertType.ERROR);
                    alert.setTitle("Staff Management");
                    alert.setHeaderText(null);
                    alert.setContentText("There is an error deleting Staff..!");
                    alert.showAndWait();
                }
            }
        } catch(ClassNotFoundException | SQLException ex){
            Logger.getLogger(StaffController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @FXML
    void printStaff(ActionEvent event) {
        try {
            String empNo = empNoField.getText();

            InputStream report1 = getClass().getResourceAsStream("/sms/Reports/StaffInfo.jrxml");
            InputStream report2 = getClass().getResourceAsStream("/sms/Reports/StaffInfoPast.jrxml");

            JRDesignQuery query = new JRDesignQuery();

            if(empNoOld.getText().isEmpty()){

                JasperDesign jd = JRXmlLoader.load(report1);
                query.setText("select * from staffs where empNo = '" + empNo + "'");
                jd.setQuery(query);
                ReportViewController r = new ReportViewController();
                r.viewReport(jd);
            }
            else{

                JasperDesign jd2 = JRXmlLoader.load(report2);
                query.setText("select * from oldstaffs where empNo = '" + empNo + "'");
                jd2.setQuery(query);
                ReportViewController r = new ReportViewController();
                r.viewReport(jd2);
            }

        } catch (JRException e) {
            e.printStackTrace();
        }
    }

    @FXML
    void update(ActionEvent event) {
        try {

            ValidationController v = new ValidationController();

            if(v.validateEmpty(empNoField)&& v.validateEmpty(teacherNameField)&& v.validateEmpty(nicField)&& v.validateEmpty(dobField)
                    && v.validateEmpty(doaField)&& v.validateEmpty(phoneField)&& v.validateDate(dobField)&& v.validateDate(doaField)&& v.validateDate(asmOfDutyField)
                    && v.validateDate(incDateField)&& v.validateNIC(nicField)&& v.validatePhone(phoneField)&& v.numbersOnly(empNoField)&& v.numbersOnly(phoneField)){


                int empNo = Integer.parseInt(empNoField.getText());
                String teacherName = teacherNameField.getText();
                String nic = nicField.getText();
                String dob = dobField.getText();
                String doa = doaField.getText();
                String gender = genderField.getText();
                String email = emailField.getText();
                String assumpOfDuties = asmOfDutyField.getText();
                String phone = phoneField.getText();
                String address = addressField.getText();
                String incDate = incDateField.getText();
                String prsntGrade = prsntGradeField.getText();

                Staff s = new Staff(empNo, teacherName, nic, dob, doa, gender, email, assumpOfDuties, phone, address, incDate, prsntGrade);
                int i = StaffController.updateStaff(s);
                int d = StaffController.updateOldStaff(s);

                if (i > 0){

                    Alert alert = new Alert(Alert.AlertType.INFORMATION);
                    alert.setTitle("Staff Management");
                    alert.setHeaderText(null);
                    alert.setContentText("Staff Informations Updated Successfully..!");
                    alert.showAndWait();

                    empNoField.setText(null);
                    teacherNameField.setText(null);
                    nicField.setText(null);
                    dobField.setText(null);
                    doaField.setText(null);
                    emailField.setText(null);
                    genderField.setText(null);
                    asmOfDutyField.setText(null);
                    nicField.setText(null);
                    phoneField.setText(null);
                    addressField.setText(null);
                    incDateField.setText(null);
                    prsntGradeField.setText(null);

                }
                else if (d > 0) {

                    Alert alert = new Alert(Alert.AlertType.INFORMATION);
                    alert.setTitle("Staff Management");
                    alert.setHeaderText(null);
                    alert.setContentText("Staff Informations Updated Successfully..!");
                    alert.showAndWait();

                    empNoField.setText(null);
                    teacherNameField.setText(null);
                    nicField.setText(null);
                    dobField.setText(null);
                    doaField.setText(null);
                    emailField.setText(null);
                    genderField.setText(null);
                    asmOfDutyField.setText(null);
                    nicField.setText(null);
                    phoneField.setText(null);
                    addressField.setText(null);
                    incDateField.setText(null);
                    prsntGradeField.setText(null);

                } else {
                    Alert alert = new Alert(Alert.AlertType.ERROR);
                    alert.setTitle("Staff Management");
                    alert.setHeaderText(null);
                    alert.setContentText("OOPS there is an error updating Staff..!");
                    alert.showAndWait();
                }
            }
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(StaffController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}