package tourplaner.ui;

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

import java.awt.*;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.time.LocalDate;
import java.util.ResourceBundle;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;

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;
    //Log -> rechts unten
    public TableView<Log> logTableView;
    public TableColumn<Log, String> logDauerCol, logStreckeCol, logDatumCol, logAvgCol, logHightCol, logPauseCol, logGegangenCol, logBemerkungCol;

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


    @FXML
    private void editTourBtn(){
        this.viewModel.editTour();
        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().removeIf(s -> true); //Leert die Table View komplett
        beschreibungTableView.getItems().add(this.viewModel.getTour(selectedItem));
    }

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

    private void syncLogs(){
        logTableView.getItems().removeIf(s -> true);
        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){
        String selectedItem = TourListView.getSelectionModel().getSelectedItem();
        this.viewModel.selectTour(selectedItem);
        titleTextView.setText(selectedItem);
        syncTour(selectedItem);
        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().removeIf(s -> true);
        logTableView.setItems(this.viewModel.getLogData());
        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"));

    }

    /**
     * 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(){
        this.viewModel.addTour();
    }

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

    /**
     * Sucht eine Tour
     * Verbunden mit Button -> Suche
     */
    @FXML
    private void suche(){
        this.viewModel.suche(this.sucheInput.getText());
    }

    /**
     * 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();
        //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")));

    }

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

}
