package at.vvo.omds.client.gui;

import at.vvo.omds.types.omds3.r2025_05.common.FahrzeugType;
import at.vvo.omds.types.omds3.r2025_05.common.VersichertesInteresseMitAttributMetadatenType;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Paint;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class RisikoobjektView {
    List<VersichertesInteresseMitAttributMetadatenType> risikoobjekte = new ArrayList<>();
    VBox objekteListe = new VBox();
    ScrollPane objekteScroll = new ScrollPane();
    GridPane main = new GridPane();

    public List<VersichertesInteresseMitAttributMetadatenType> getRisikoobjekte() {
        return risikoobjekte;
    }

    public GridPane risikoobjekte() {
        VBox createObjekt = createRisikoobjekt();

        objekteListe = risikoobjekteListe();

        objekteScroll.setContent(objekteListe);
        objekteScroll.setFitToWidth(true);
        objekteScroll.setFitToHeight(false);
        objekteScroll.setStyle("-fx-background-color:transparent;");

        main.add(createObjekt, 0, 0);
        main.add(objekteScroll, 1, 0);

        GridPane.setHgrow(createObjekt, Priority.ALWAYS);
        GridPane.setVgrow(createObjekt, Priority.ALWAYS);
        GridPane.setHgrow(objekteScroll, Priority.ALWAYS);
        GridPane.setVgrow(objekteScroll, Priority.ALWAYS);

        createObjekt.setPadding(new Insets(10, 10, 10, 5));
        createObjekt.setStyle("-fx-border-color: black; -fx-border-width: 1px;");

        objekteScroll.setPadding(new Insets(10, 10, 10, 5));
        objekteScroll.setStyle("-fx-border-color: black; -fx-border-width: 1px;");

        main.setAlignment(Pos.CENTER);
        main.setPadding(new Insets(10));
        main.setHgap(10);

        return main;
    }

    private VBox risikoobjekteListe() {
        VBox objekteListe = new VBox(10); // spacing
        objekteListe.setFillWidth(true);

        if (risikoobjekte != null && !risikoobjekte.isEmpty()) {
            for (VersichertesInteresseMitAttributMetadatenType r : risikoobjekte) {


                HBox singleRisikoobjekt = new HBox(10);
                singleRisikoobjekt.setPadding(new Insets(5));
                singleRisikoobjekt.setAlignment(Pos.CENTER);

                VBox objektInfo = new VBox(2);

                if (r instanceof FahrzeugType fahrzeug) {
                    Label handelsbezeichnung = new Label(fahrzeug.getHandelsbez());
                    handelsbezeichnung.setFont(Font.font("System", FontWeight.BOLD, 14));

                    Label baujahr = new Label(fahrzeug.getBaujahr().toString());
                    baujahr.setStyle("-fx-text-fill: #555555");

                    Label erstzulassung = new Label(fahrzeug.getErstzulassdat().toString()
                            .substring(0, fahrzeug.getErstzulassdat().toString().length()-1));
                    erstzulassung.setStyle("-fx-text-fill: #555555");

                    objektInfo.getChildren().addAll(handelsbezeichnung, baujahr, erstzulassung);

                    Pane separator = new Pane();
                    separator.setPrefWidth(2);
                    separator.setMaxWidth(2);
                    separator.setStyle("-fx-background-color: black;");

                    Label symbole = new Label("\u26DF");
                    symbole.setFont(Font.font(18));

                    VBox symbolBox = new VBox(symbole);

                    singleRisikoobjekt.getChildren().addAll(symbolBox, separator, objektInfo);
                    singleRisikoobjekt.setAlignment(Pos.CENTER_LEFT);
                }

                objekteListe.getChildren().add(singleRisikoobjekt);
            }
        }
        return objekteListe;
    }

    private VBox createRisikoobjekt() {
        VBox createForm = new VBox();
        ChoiceBox<String> choiceBox = new ChoiceBox<>();

        List<String> risikoobjektArten = new ArrayList<>();
        risikoobjektArten.add("Versichertes objekt SachPrivat");
        risikoobjektArten.add("Versicherte Liegenschaft");
        risikoobjektArten.add("Fahrzeug");
        risikoobjektArten.add("Risiko Gebaeude");
        risikoobjektArten.add("Versicherte Person");
        risikoobjektArten.add("Risiko Haushalt");

        choiceBox.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {
            if (newVal != null) {
                int a = createForm.getChildren().size();
                for (int i = 1; i < a; i++) {
                    createForm.getChildren().remove(i);
                }
                switch (newVal) {
                    case "Versichertes objekt SachPrivat": {
                        System.out.println("formular sach Privat");
                        break;
                    }
                    case "Versicherte Liegenschaft": {
                        System.out.println("create Versicherte Liegenschaft");
                        break;
                    }
                    case "Fahrzeug": {
                        FahrzeugType fahrzeug = new FahrzeugType();

                        VBox createFormBox = new VBox();

                        VBox baujahrBox = new VBox();
                        Label label1 = new Label("Baujahr");
                        TextField textField1 = new TextField();

                        textField1.setPromptText("Baujahr");
                        baujahrBox.setPadding(new Insets(5));
                        baujahrBox.getChildren().addAll(label1, textField1);

                        textField1.focusedProperty().addListener((observableValue, oldValue, newValue) -> {
                            if (!newValue) {
                                Label failedCheck = new Label("Es muss eine 4 stellige Jahreszahl mitgegeben werden");
                                failedCheck.setId("failedCheck");
                                failedCheck.setTextFill(Paint.valueOf("#DD0000"));
                                if (textField1.getText().length() != 4) {
                                    textField1.setStyle("-fx-border-color: #dd0000");
                                    baujahrBox.getChildren().addAll(failedCheck);
                                } else {
                                    textField1.setStyle("-fx-border-color: #555555");
                                    baujahrBox.getChildren().removeIf(c -> c.getId() != null && c.getId().equals("failedCheck"));
                                }
                            }
                        });

                        VBox handelsbezeichnungBox = new VBox();
                        Label label2 = new Label("Handelsbezeichnung");
                        TextField textField2 = new TextField();

                        textField2.setPromptText("Handelsbezeichnung");
                        handelsbezeichnungBox.setPadding(new Insets(5));
                        handelsbezeichnungBox.getChildren().addAll(label2, textField2);

                        VBox erstzulassungBox = new VBox();
                        Label label3 = new Label("Erstzulassung");
                        DatePicker datePicker = new DatePicker(LocalDate.now());

                        erstzulassungBox.setPadding(new Insets(5));
                        erstzulassungBox.getChildren().addAll(label3, datePicker);

                        Button createBtn = new Button("Create");

                        createBtn.setOnAction(e -> {
                            fahrzeug.setBaujahr(Integer.valueOf(textField1.getText()));
                            fahrzeug.setHandelsbez(textField2.getText());
                            try {
                                int day = datePicker.getValue().getDayOfMonth();
                                int month = datePicker.getValue().getMonthValue();
                                int year = datePicker.getValue().getYear();

                                XMLGregorianCalendar erstzulassung = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(year, month, day, 0);

                                fahrzeug.setErstzulassdat(erstzulassung);
                            } catch (DatatypeConfigurationException ex) {
                                throw new RuntimeException(ex);
                            }

                            risikoobjekte.add(fahrzeug);

                            objekteListe.getChildren().setAll(risikoobjekteListe().getChildren());

                            createFormBox.getChildren().clear();
                            String select = choiceBox.getSelectionModel().getSelectedItem();
                            choiceBox.getSelectionModel().clearSelection();
                            choiceBox.getSelectionModel().select(select);

                        });

                        createFormBox.getChildren().addAll(baujahrBox, handelsbezeichnungBox, erstzulassungBox, createBtn);
                        createForm.getChildren().add(createFormBox);
                        break;
                    }
                }
            }
        });

        choiceBox.getItems().addAll(risikoobjektArten);

        createForm.getChildren().addAll(choiceBox);
        return createForm;
    }
}
