package tourplaner.ui;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Orientation;
import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import tourplaner.business.ConfigHelper;
import tourplaner.business.LogHelper;
import tourplaner.object.Log;
import tourplaner.object.Tour;
import tourplaner.viewmodels.ViewModel;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class TourplanerController implements Initializable {
    //VM
    private final ViewModel viewModel = new ViewModel();
    //Tour list -> links
    public ListView<String> TourListView = new ListView<>();
    //Tabs zu Tour -> rechts oben
    public TabPane viewTabPane;
    public Tab kartenTab, beschreibungTab;
    public TableView<Tour> beschreibungTableView;
    public TableColumn<Tour, String> startCol, zielCol, dauerCol, streckeCol, nameCol;
    public TextField titleTextView, sucheInput;
    public ImageView mapImageView;
    //Log -> rechts unten
    public TableView<Log> logTableView;
    public TableColumn<Log, String> logDauerCol, logStreckeCol, logDatumCol, logAvgCol, logHightCol, logPauseCol, logGegangenCol, logBemerkungCol, logRatingCol1;
    //Menue
    public CheckMenuItem openmap, openpdf;
    public RadioMenuItem langenglisch, langdeutsch;
    private ToggleGroup langgroup;
    public Menu menueFile, menuebearbeiten, menueoptionen, menuesprachen, menuehilfe;
    public MenuItem reportsummary, tourreport, beendenButton;
    //Elemente
    public Button sucheButton, editBtn, editTourBtn;

    @FXML
    private void onlangenglisch(){
        ConfigHelper.setIniString(ConfigHelper.getStandartConfig(), "lang", "lang", "langen");
        langToFxml();
    }

    @FXML
    private void onlangdeutsch(){
        ConfigHelper.setIniString(ConfigHelper.getStandartConfig(), "lang", "lang", "langde");
        langToFxml();
    }

    @FXML
    private void tourReport(){
        this.viewModel.tourReport();
    }


    @FXML
    private void editTourBtn(){
        try {
            this.viewModel.editTour();
        } catch (IOException e) {
            LogHelper.error(e);
        }
        syncTour(this.viewModel.getSelectedTour().getName());
    }

    @FXML
    private void editLogBtn(){
        this.viewModel.editLog();
        syncLogs();
    }
    /**
     * Öffnet github im standart browser
     *
     */
    @FXML
    private void gitWebBrowser(){
       this.viewModel.gitWebBrowser();
    }

    /**
     * Öffnet Java Doc im standart browser
     *
     */
    @FXML
    private void javaDocBrowser(){
       this.viewModel.javaDocBrowser();
    }

    /**
     * Öffnet Doxygen Doc im standart browser
     *
     */
    @FXML
    private void doxygenDocBrowser(){
        this.viewModel.doxygenDocBrowser();
    }

    private void syncTour(String selectedItem){
        beschreibungTableView.getItems().clear(); //Leert die Table View komplett
        beschreibungTableView.getItems().add(this.viewModel.getTour(selectedItem));
        mapImageView.setImage(this.viewModel.getImage(selectedItem));
    }

    private void syncTourNamen(){
        TourListView.getItems().clear();
        TourListView.setItems(this.viewModel.getTourNamen());
    }

    private void syncLogs(){
        logTableView.getItems().clear();
        logTableView.setItems(this.viewModel.getLogData());
    }


    /**
     * Wird gestartet wenn eine Tour in der Tour listView ausgewählt wird
     * @param mouseEvent Triggered Event
     */
    @FXML
    private void tourListSelectedItem(MouseEvent mouseEvent){
        ProgressBar progressBar = new ProgressBar("Tour auswählen...");
        String selectedItem = TourListView.getSelectionModel().getSelectedItem();
        this.viewModel.selectTour(selectedItem);
        titleTextView.setText(selectedItem);
        progressBar.addProgress(10);
        syncTour(selectedItem);
        progressBar.addProgress(10);
        startCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("start"));
        zielCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("ziel"));
        dauerCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("dauer"));
        streckeCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("strecke"));
        nameCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("name"));

        //Log anzeigen
        logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinelogsvorhanden")));
        logTableView.getItems().clear();
        progressBar.addProgress(10);
        logTableView.setItems(this.viewModel.getLogData());
        progressBar.addProgress(10);
        logDauerCol.setCellValueFactory(new PropertyValueFactory<Log, String>("dauer"));
        logStreckeCol.setCellValueFactory(new PropertyValueFactory<Log, String>("strecke"));
        logDatumCol.setCellValueFactory(new PropertyValueFactory<Log, String>("datum"));
        logAvgCol.setCellValueFactory(new PropertyValueFactory<Log, String>("avgspeed"));
        logHightCol.setCellValueFactory(new PropertyValueFactory<Log, String>("hightmeter"));
        logPauseCol.setCellValueFactory(new PropertyValueFactory<Log, String>("pause"));
        logGegangenCol.setCellValueFactory(new PropertyValueFactory<Log, String>("gegangen"));
        logBemerkungCol.setCellValueFactory(new PropertyValueFactory<Log, String>("bemerkung"));
        logRatingCol1.setCellValueFactory(new PropertyValueFactory<Log, String>("rating"));
        progressBar.addProgress(10);
        mapImageView.setImage(this.viewModel.getImage(this.viewModel.getSelectedTour().getName()));
        if(this.viewModel.isSucheAktiv()){
            this.viewModel.setSucheAktiv(false);
            progressBar.addProgress(10);
            syncTourNamen();
            progressBar.setProgress(100);
            this.sucheInput.setText("");
        }
        progressBar.setProgress(100);
    }

    /**
     * Beendet die App
     * Verbunden mit dem Menu -> Datei -> Beenden
     */
    @FXML
    private void quitApp(){
        System.exit(0);
    }

    /**
     * Fügt eine Tour hinzu
     * Verbunden mit Button -> Tour -> +
     */
    @FXML
    private void addTour(){
        if(this.viewModel.addTour()) this.mapImageView.setImage(this.viewModel.getImage(this.viewModel.getSelectedTour().getName()));
    }

    /**
     * Entfernt eine ausgewählte Tour
     * Verbunden mit Button -> Tour -> -
     */
    @FXML
    private void delTour(){
        this.beschreibungTableView.getItems().clear(); //löscht alles aus der tabelle
        this.titleTextView.setText(ConfigHelper.getLangIniString("keinetourselected"));
        this.viewModel.delTour();
        logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected")));
        mapImageView.setImage(null);
    }

    /**
     * Sucht eine Tour
     * Verbunden mit Button -> Suche
     */
    @FXML
    private void suche(){
        ProgressBar progressBar = new ProgressBar("Suche");
        this.viewModel.suche(this.sucheInput.getText());
        progressBar.addProgress(100);
        progressBar.closeProgress();
    }

    /**
     * Fügt einen Log eintrag zu einer Tour hinzu.
     * Ist keine Tour ausgewählt, dann kommt eine Warnung an den User!
     */
    @FXML
    private void addLog(){
        this.viewModel.addLog();
        syncLogs();
    }

    @FXML
    private void delLog(){
        this.viewModel.delLog();
        syncLogs();
    }

    /**
     * Ein Log eintrag wurde ausgewählt
     * @param mouseEvent Aktuelles Mouse Event
     */
    @FXML
    private void logItemSelected(MouseEvent mouseEvent){
        this.viewModel.selectLog(logTableView.getSelectionModel().getSelectedItem().getId());
    }

    /**
     * Wird beim Start ausgeführt
     * @param url
     * @param resourceBundle
     */
    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        //Tour list -> links
        TourListView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
        TourListView.setOrientation(Orientation.VERTICAL);
        syncTourNamen();
        deselectAll();
        if(ConfigHelper.getIniInt(ConfigHelper.getStandartConfig(), "settings", "openpdf") == 1){
            this.openpdf.setSelected(true);
        }else {
            this.openpdf.setSelected(false);
        }
        if(ConfigHelper.getIniInt(ConfigHelper.getStandartConfig(), "settings", "openmap") == 1){
            this.openmap.setSelected(true);
        }else {
            this.openmap.setSelected(false);
        }
        this.langgroup = new ToggleGroup();
        this.langdeutsch.setToggleGroup(this.langgroup);
        this.langenglisch.setToggleGroup(this.langgroup);
        if(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "lang", "lang").equals("langde")){
            this.langdeutsch.setSelected(true);
            this.langenglisch.setSelected(false);
        }else if(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "lang", "lang").equals("langen")){
            this.langdeutsch.setSelected(false);
            this.langenglisch.setSelected(true);
        }

        langToFxml();
    }

    private void langToFxml(){
        this.kartenTab.setText(ConfigHelper.getLangIniString("fkarte"));
        this.beschreibungTab.setText(ConfigHelper.getLangIniString("fbeschreibung"));
        this.editBtn.setText(ConfigHelper.getLangIniString("fedit"));
        this.editTourBtn.setText(ConfigHelper.getLangIniString("fedit"));
        this.nameCol.setText(ConfigHelper.getLangIniString("fname"));
        this.streckeCol.setText(ConfigHelper.getLangIniString("fstrecke"));
        this.dauerCol.setText(ConfigHelper.getLangIniString("fdauer"));
        this.zielCol.setText(ConfigHelper.getLangIniString("fziel"));
        this.startCol .setText(ConfigHelper.getLangIniString("fstart"));
        this.logAvgCol.setText(ConfigHelper.getLangIniString("favg"));
        this.logBemerkungCol.setText(ConfigHelper.getLangIniString("fbemerkung"));
        this.logDatumCol.setText(ConfigHelper.getLangIniString("fdatum"));
        this.logDauerCol.setText(ConfigHelper.getLangIniString("fdauer"));
        this.logGegangenCol.setText(ConfigHelper.getLangIniString("fgegangen"));
        this.logHightCol.setText(ConfigHelper.getLangIniString("fhight"));
        this.logPauseCol.setText(ConfigHelper.getLangIniString("fpause"));
        this.logStreckeCol.setText(ConfigHelper.getLangIniString("fstrecke"));

        this.sucheButton.setText(ConfigHelper.getLangIniString("fsuche"));
        this.openmap.setText(ConfigHelper.getLangIniString("fopenmapsetting"));
        this.openpdf.setText(ConfigHelper.getLangIniString("fopenpdfsetting"));
        this.langenglisch.setText(ConfigHelper.getLangIniString("flangenglisch"));
        this.langdeutsch.setText(ConfigHelper.getLangIniString("flangdeutsch"));
        this.menueFile.setText(ConfigHelper.getLangIniString("fdatei"));
        this.menuebearbeiten.setText(ConfigHelper.getLangIniString("fbearbeiten"));
        this.menueoptionen.setText(ConfigHelper.getLangIniString("foptionen"));
        this.menuesprachen.setText(ConfigHelper.getLangIniString("fsprache"));
        this.menuehilfe.setText(ConfigHelper.getLangIniString("fhilfe"));
        this.reportsummary.setText(ConfigHelper.getLangIniString("freposum"));
        this.tourreport.setText(ConfigHelper.getLangIniString("frepotour"));
        this.beendenButton.setText(ConfigHelper.getLangIniString("fbeenden"));
        this.sucheInput.setPromptText(ConfigHelper.getLangIniString("fsuche")+ConfigHelper.getLangIniString("fpunkte"));

        this.logRatingCol1.setText("Rating");
    }

    @FXML
    private void openpdfaction(){
        int selected = 0;
        if(this.openpdf.isSelected()) selected = 1;
        ConfigHelper.setIniInt(ConfigHelper.getStandartConfig(), "settings", "openpdf", selected);
    }

    @FXML
    private void openmapaction(){
        int selected = 0;
        if(this.openmap.isSelected()) selected = 1;
        ConfigHelper.setIniInt(ConfigHelper.getStandartConfig(), "settings", "openmap", selected);
    }

    private void deselectAll(){
        //Tabs zu Tour -> rechts oben
        beschreibungTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected")));
        titleTextView.setText( ConfigHelper.getLangIniString("keinetourselected"));
        //Log -> rechts unten
        logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected")));
    }

    @FXML
    private void exportBtn(){
        this.viewModel.exportData();
    }

    @FXML
    private void importBtn(){
        deselectAll();
        this.viewModel.importData();
        syncTourNamen();
    }

    @FXML
    private void reportSum(){
        this.viewModel.sumReport();
    }

    /**
     * Funktion für noch nicht implementierte sachen wie im Menu der 'Bearbeiten' und 'Optionen' Knopf
     */
    @FXML
    private void nimpButton(){
        this.viewModel.nimpButton();
    }

}
