package inf.unideb.kresz.Controllers;

import inf.unideb.kresz.MainApp;
import inf.unideb.kresz.Model.Kerdes;
import inf.unideb.kresz.Model.Sor;
import inf.unideb.kresz.Model.ValaszFeldolgozo;
import inf.unideb.kresz.Model.XMLFeldolgozo;
import inf.unideb.kresz.Model.XMLTorles;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Optional;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * Az alkalmazás kérdések kezelés {@code Scene}-jének a {@code Controller} osztálya.
 */
public class KerdesekKezeleseController implements Initializable {

    private static final Logger logger = LoggerFactory.getLogger(KerdesekKezeleseController.class);
    
    @FXML
    private TableColumn KerdesekKezeleseKerdes;

    @FXML
    private TableColumn KerdesekKezeleseA;

    @FXML
    private TableColumn KerdesekKezeleseB;

    @FXML
    private TableColumn KerdesekKezeleseC;

    @FXML
    private TableColumn KerdesekKezeleseD;

    @FXML
    private TableColumn KerdesekKezeleseHelyesValasz;

    @FXML
    private Button KerdesekKezeleseMegtekint;

    @FXML
    private Button KerdesekKezeleseVissza;

    @FXML
    private Button KerdesekKezeleseUjKerdes;

    @FXML
    private Button KerdesekKezeleseKerdesSzerkesztese;

    @FXML
    private Button KerdesekKezeleseKerdesTorlese;

    @FXML
    private Label KerdesekKezeleseOssz;

    @FXML
    private TableView<Sor> KerdesekKezeleseTableView = new TableView<>();

    private int szamlalo = 1;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        Feltoltes();
        KerdesekKezeleseTableView.requestFocus();
        KerdesekKezeleseTableView.getSelectionModel().select(0);
        KerdesekKezeleseTableView.getFocusModel().focus(0);
    }

    @FXML
    private void KerdesekKezeleseVisszaKezeles() throws IOException {
        Stage stage;
        Parent root;

        stage = (Stage) KerdesekKezeleseVissza.getScene().getWindow();

        FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminisztratoriBeallitasok.fxml"));
        root = loader.load();

        Scene scene = new Scene(root);
        scene.getStylesheets().add("/styles/Styles.css");
        stage.setScene(scene);
        stage.show();

        logger.info("Kilépve a kérdések kezeléséből");
        
        javafx.geometry.Rectangle2D primScreenBounds = Screen.getPrimary().getVisualBounds();
        stage.setX((primScreenBounds.getWidth() - stage.getWidth()) / 2);
        stage.setY((primScreenBounds.getHeight() - stage.getHeight()) / 2);

    }

    @FXML
    private void KerdesekKezeleseFrissitesKezelese() {
        KerdesekKezeleseTableView.getItems().clear();
        Feltoltes();
    }

    @FXML
    private void KerdesekKezeleseUjKerdesKezeles() throws IOException {
        Stage stage;
        Parent root;

        stage = (Stage) KerdesekKezeleseUjKerdes.getScene().getWindow();

        FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/XMLUjKerdes.fxml"));
        root = loader.load();

        Scene scene = new Scene(root);
        scene.getStylesheets().add("/styles/Styles.css");
        stage.setScene(scene);
        stage.show();
        
        logger.info("Új kérdés hozzáadása, megnyitva.");

        javafx.geometry.Rectangle2D primScreenBounds = Screen.getPrimary().getVisualBounds();
        stage.setX((primScreenBounds.getWidth() - stage.getWidth()) / 2);
        stage.setY((primScreenBounds.getHeight() - stage.getHeight()) / 2);
    }

    @FXML
    private void KerdesekKezeleseKerdesSzerkeszteseKezeles() throws IOException {

        Sor sor = KerdesekKezeleseTableView.getSelectionModel().getSelectedItem();

        MainApp.setId(sor.idProperty().getValue());
        MainApp.setKerdes(sor.kerdesProperty().getValue());
        MainApp.setA(sor.aProperty().getValue());
        MainApp.setB(sor.bProperty().getValue());
        MainApp.setC(sor.cProperty().getValue());
        MainApp.setD(sor.dProperty().getValue());
        MainApp.setHelyesValasz(sor.helyesValaszProperty().getValue());
        MainApp.setKep(sor.kepProperty().getValue());

        if (!sor.kepProperty().getValue().equals("null")) {
            File photo = new File(sor.kepProperty().getValue());
            MainApp.setFile(photo);
        } else {
            MainApp.setFile(null);
        }

        Stage stage;
        Parent root;

        stage = (Stage) KerdesekKezeleseKerdesSzerkesztese.getScene().getWindow();

        FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/XMLKerdesModositas.fxml"));
        root = loader.load();

        Scene scene = new Scene(root);
        scene.getStylesheets().add("/styles/Styles.css");
        stage.setScene(scene);
        stage.show();
        
        logger.info("Kérdés szerkesztése megnyitva.");

        javafx.geometry.Rectangle2D primScreenBounds = Screen.getPrimary().getVisualBounds();
        stage.setX((primScreenBounds.getWidth() - stage.getWidth()) / 2);
        stage.setY((primScreenBounds.getHeight() - stage.getHeight()) / 2);
    }

    @FXML
    private void KerdesekKezeleseMegtekintKezeles() {

        Sor sor = KerdesekKezeleseTableView.getSelectionModel().getSelectedItem();

        logger.info("Kérdés megtekintve.");
        
        Alert alert = new Alert(AlertType.INFORMATION);
        alert.initStyle(StageStyle.UTILITY);
        alert.setTitle("Megtekintés");
        alert.setHeaderText("Kérdés megtekintése");

        TextArea textArea = new TextArea(sor.idProperty().getValue().toString() + ". " + sor.kerdesProperty().getValue() + "\n\n"
                + "a.) " + sor.aProperty().getValue() + "\n"
                + "b.) " + sor.bProperty().getValue() + "\n"
                + "c.) " + sor.cProperty().getValue() + "\n"
                + "d.) " + sor.dProperty().getValue() + "\n\n"
                + "Helyes válasz: " + sor.helyesValaszProperty().getValue() + "\n"
                + "Kép: " + sor.kepProperty().getValue()
        );
        textArea.setEditable(false);
        textArea.setWrapText(true);

        textArea.setMaxWidth(Double.MAX_VALUE);
        textArea.setMaxHeight(Double.MAX_VALUE);
        GridPane.setVgrow(textArea, Priority.ALWAYS);
        GridPane.setHgrow(textArea, Priority.ALWAYS);

        GridPane expContent = new GridPane();
        expContent.setMaxWidth(Double.MAX_VALUE);
        expContent.add(textArea, 0, 1);

        alert.getDialogPane().setContent(expContent);

        alert.showAndWait();

    }

    @FXML
    private void KerdesekKezeleseKerdesTorleseKezeles() throws ParserConfigurationException, SAXException, IOException, Exception {

        Alert alert = new Alert(AlertType.CONFIRMATION);
        alert.initStyle(StageStyle.UTILITY);
        alert.setTitle("Kérdés");
        alert.setHeaderText("Biztos vagy benne, hogy törölni szeretnéd a kérdést?");
        alert.setContentText(null);

        Optional<ButtonType> result = alert.showAndWait();
        if (result.get() == ButtonType.OK) {

            Sor sor = KerdesekKezeleseTableView.getSelectionModel().getSelectedItem();
            int melyiket = sor.idProperty().getValue() - 1;

            XMLTorles delete = new XMLTorles(melyiket);
            delete.setKep(sor.kepProperty().getValue());
            delete.KerdesTorles();

            Alert alert2 = new Alert(AlertType.INFORMATION);
            alert2.initStyle(StageStyle.UTILITY);
            alert2.setTitle("Üzenet");
            alert2.setHeaderText(null);
            alert2.setContentText("A kérdés sikeresen törölve!");

            logger.info("Kérdés törölve.");
            
            alert2.showAndWait();

            KerdesekKezeleseTableView.getItems().clear();
            Feltoltes();
        }
    }

    private void Feltoltes() {
        XMLFeldolgozo xmlFeldolgozo = new XMLFeldolgozo();
        xmlFeldolgozo.kerdesek();

        logger.info("TableView feltöltve.");
        
        szamlalo = 1;

        for (Kerdes kerdes : xmlFeldolgozo.getKerdesek()) {
            ValaszFeldolgozo vF = new ValaszFeldolgozo(kerdes.getValasz());
            vF.FeldolgozSiman();

            KerdesekKezeleseTableView.getItems().add(new Sor(szamlalo, kerdes.getKerdes(), vF.getA(), vF.getB(), vF.getC(), vF.getD(), vF.getHelyesValasz().toUpperCase(), kerdes.getKep()));
            szamlalo++;

        }

        KerdesekKezeleseOssz.setText(Integer.toString(szamlalo - 1));

        KerdesekKezeleseTableView.requestFocus();
        KerdesekKezeleseTableView.getSelectionModel().select(0);
        KerdesekKezeleseTableView.getFocusModel().focus(0);

    }

}
