package tourplaner.business;

import org.apache.log4j.Logger;
import tourplaner.data.DbConnect;
import tourplaner.object.Log;
import tourplaner.object.Tour;
import tourplaner.ui.ProgressBar;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;

/**
 * Haupt Logik des Tourplaners
 */
public class TourPlaner{

    /**
     * Erstellt alle DB Tabellen falls nötig
     */
    public static void init(){
        new DbConnect().init();
    }

    /**
     * Holt alle touren aus der DB 
     * @return Alle touren als ArrayList
     */
    public static ArrayList<Tour> getAllTours(){
        return new DbConnect().getAllTouren();
    }

    /**
     * Bearbeitet eine Tour
     * @param oldname Alter Tourname
     * @param tour Neuer Tourname
     * @return false bei error
     * @throws IOException Fehler beim editieren der Tour
     */
    public static boolean editTour(String oldname, Tour tour) throws IOException {
        ProgressBar progressBar = new ProgressBar("Edit...");
        int step = progressBar.getProgressSize(3, 100);
        FileHelper.delFile(new File(getImagePath(oldname)));
        FileHelper.delFile(new File(getImagePdfPath(oldname)));
        progressBar.addProgress(step);
        DirectionMap directionMap = new DirectionMap(tour.getStart(), tour.getZiel(), tour.getName());
        progressBar.addProgress(step);
        tour.setDauer(directionMap.getDauer()+"");
        tour.setStrecke(directionMap.getStrecke());
        boolean ret = new DbConnect().editTour(oldname, tour);
        progressBar.setProgress(100);
        return ret;
    }

    /**
     * Löscht eine Tour
     * @param tourname Tourname
     * @return false bei error
     */
    public static boolean delTour(String tourname){
        FileHelper.delFile(new File(getImagePath(tourname)));
        FileHelper.delFile(new File(getImagePdfPath(tourname)));
        boolean ret = new DbConnect().delTour(tourname);
        return ret;
    }
    /**
     * Fügt eine Tour hinzu
     * @param newTour Neue Tour
     * @param progressBar Aktuelle Progressbar
     * @return false bei error
     * @throws IOException Fehler beim hinzufügen der Tour
     */
    public static boolean addTour(Tour newTour, ProgressBar progressBar) throws IOException {
        int step = progressBar.getProgressSize(2, 100);
        DirectionMap directionMap = new DirectionMap(newTour.getStart(), newTour.getZiel(), newTour.getName());
        progressBar.addProgress(step);
        newTour.setDauer(directionMap.getDauer()+"");
        newTour.setStrecke(directionMap.getStrecke());
        boolean ret = new DbConnect().addTour(newTour);
        progressBar.setProgress(100);
        return ret;
    }

    /**
     * Path zu dem Bild für die GUI
     * @param tourname Name der Tour
     * @return Path zu dem Bild für die GUI
     */
    public static String getImagePath(String tourname){
        return ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + tourname + ".jpg";
    }

    /**
     * Path zu dem Bild für die PDF
     * @param tourname Name der Tour
     * @return Path zu dem Bild für die PDF
     */
    public static String getImagePdfPath(String tourname){
        return ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + tourname + "_pdf.jpg";
    }


    /**
     * Holt alle Logs einer Tour
     * @param tourname Tourname
     * @return Alle Logs der Tour
     */
    public static ArrayList<Log> getLogs(String tourname){
        return new DbConnect().getLogs(tourname);
    }

    /**
     * Führt einen Rport aus
     * @param tourname Name der Tour die gereportet wird
     */
    public static void doReport(String tourname){
        Reporter.createTourReport(tourname);
    }

    /**
     * Holt eine Tour
     * @param tourname Name der zu holenden Tour
     * @return Tour die geholt werden soll
     */
    public static Tour getTour(String tourname){
        return new DbConnect().getTour(tourname);
    }

    /**
     * Fügt ein Log hinzu
     * @param tourname Name der Tour
     * @param log Neues Log
     * @return false bei error
     */
    public static boolean addLog(String tourname, Log log){
        if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0);
        return new DbConnect().addLog(tourname, log);
    }

    /**
     * Löscht ein Log
     * @param tourname Name der Tour
     * @param id Id des Logs
     * @return false bei error
     */
    public static boolean delLog(String tourname, String id){
        return new DbConnect().delLog(tourname, id);
    }

    /**
     * Editiert ein Log
     * @param tourname Name der Tour
     * @param log Neues Log
     * @return false bei error
     */
    public static boolean editLog(String tourname, Log log){
        if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0);
        return new DbConnect().editLog(tourname, log);
    }

    /**
     * Sucht alle touren die den gegebenen tournamen enthalten
     * @param tourname Name der zu suchen ist
     * @return Alle touren die auf den Suchterm passen
     */
    public static ArrayList<Tour> sucheTour(String tourname){
        ArrayList<Tour> touren = new ArrayList<>();
        getAllTours().forEach(t ->{
            if(t.getName().toLowerCase(Locale.ROOT).contains(tourname.toLowerCase())){
                touren.add(t);
            }
        });
        return touren;
    }

}
