package tourplaner.business;

import java.awt.*;
import java.io.File;
import java.io.IOException;

/**
 * Zuständig für das besorgen der Map für die UI und PDF-Reports und für die Berechneten infos der Tour (Dauer, Strecke)
 */
public class DirectionMap {
    private double dauer, strecke;
    private String sessionId;

    /**
     * Holt die Map als image und alle Daten zur berechneten Route
     *
     * @param start Startpunkt
     * @param ende Endpunkt
     * @param tourname Name der Aktuellen Tour
     * @throws IOException Fehler beim Image der Map
     */
    public DirectionMap (String start, String ende, String tourname) throws IOException {
        getDirections(start, ende);
        Image map = getMap(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "size"));
        Image mappdf = getMap(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "sizePdf"));
        String file = ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + tourname + ".jpg";
        String filepdf = ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + tourname + "_pdf.jpg";
        FileHelper.saveImage(map, "jpg", new File(file));
        FileHelper.saveImage(mappdf, "jpg", new File(filepdf));
        if(ConfigHelper.getIniInt(ConfigHelper.getStandartConfig(), "settings", "openmap") == 1) {
            FileHelper.openDefault(file);
        }
    }

    /**
     * Get berechnete Dauer in Minuten
     * @return Berechnete Dauer der Tour
     */
    public double getDauer() {
        return dauer;
    }

    /**
     * Get berechnete Strecke
     * @return Berechnete Strecke der Tour
     */
    public double getStrecke() {
        return strecke;
    }

    /**
     * Downloadet die Map von Mapquest
     * @param start Startpunkt
     * @param ende Endpunkt
     * @return Image von der Map
     * @throws IOException Fehler beim Get der Map
     */
    private Image getMap(String size) throws IOException {
        System.out.println("URL: " + "https://www.mapquestapi.com/staticmap/v5/map?session="+this.sessionId+"&size="+size+"&key="+ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "key"));
        return HttpHelper.httpGetImage("https://www.mapquestapi.com/staticmap/v5/map?session="+this.sessionId+"&size="+size+"&key="+ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "key"));
    }

    /**
     * Besorgt die Infos der Tour von Mapquest Directions
     * @param start Start der Tour
     * @param ende Ende der Tour
     * @throws IOException Fehler beim besorgen der infos über die Tour
     */
    private void getDirections(String start, String ende) throws IOException {
        String json = HttpHelper.httpGetJsonString("https://www.mapquestapi.com/directions/v2/route?key="+ ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "key")+"&from="+start+"&to="+ende+"&outFormat=json&ambiguities=ignore&routeType=fastest&doReverseGeocode=false&enhancedNarrative=false&avoidTimedConditions=false");
        this.strecke = JsonHelper.getDoubleFromJson(json, "distance");
        this.dauer = formatetTimeToMinutes(JsonHelper.getStingFromJson(json, "formattedTime"));
        this.sessionId = JsonHelper.getStingFromJson(json, "sessionId");
    }

    /**
     * Formatet time HH:MM:SS in Minuten umwandeln
     * @param formatetTime Formatet time HH:MM:SS
     * @return Zeit in Minuten
     */
    private double formatetTimeToMinutes(String formatetTime){
        double minutes = 0;
        String[] result = formatetTime.split(":");
        minutes += Double.parseDouble(result[0]) * 60;
        minutes += Double.parseDouble(result[1]);
        minutes += Double.parseDouble(result[2]) / 60;
        return minutes;
    }
}
