import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Locale;

/**
 * Lösningsförslag till Codebeans väderuppgift.
 * Använd tillsammans med LoadData.java och vaderdata.csv från programskelettet.
 * Kompilera: javac -encoding UTF-8 LoadData.java VaderdataLosning.java
 * Kör: java VaderdataLosning vaderdata.csv
 */
public class VaderdataLosning {
    public static int maxIndex(ArrayList<Double> values) {
        if (values.isEmpty()) throw new IllegalArgumentException("Listan är tom");
        int best = 0;
        for (int i = 1; i < values.size(); i++) {
            if (values.get(i) > values.get(best)) best = i;
        }
        return best;
    }

    public static int minIndex(ArrayList<Double> values) {
        if (values.isEmpty()) throw new IllegalArgumentException("Listan är tom");
        int best = 0;
        for (int i = 1; i < values.size(); i++) {
            if (values.get(i) < values.get(best)) best = i;
        }
        return best;
    }

    public static double sum(ArrayList<Double> values) {
        double total = 0;
        for (double value : values) total += value;
        return total;
    }

    public static double mean(ArrayList<Double> values) {
        if (values.isEmpty()) throw new IllegalArgumentException("Listan är tom");
        return sum(values) / values.size();
    }

    public static String timestamp(String seconds) {
        // Svensk lokal tid inkluderar automatiskt sommar- och vintertid.
        return Instant.ofEpochSecond(Long.parseLong(seconds))
            .atZone(ZoneId.of("Europe/Stockholm"))
            .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
    }

    public static void main(String[] args) {
        String filename = args.length > 0 ? args[0] : "vaderdata.csv";
        LoadData data = new LoadData(filename);
        ArrayList<Double> temperatures = data.getTemp();
        if (temperatures.isEmpty()) {
            throw new IllegalArgumentException("Ingen väderdata kunde läsas från " + filename);
        }
        int hottest = maxIndex(temperatures);
        int lowestPressure = minIndex(data.getBarometer());
        Locale swedish = Locale.forLanguageTag("sv-SE");
        System.out.println("Antal mätpunkter: " + temperatures.size());
        System.out.printf(swedish, "Maxtemperatur: %.2f%n", temperatures.get(hottest));
        System.out.println("Datum för maxtemperatur: " + timestamp(data.getTimestamps().get(hottest)));
        System.out.printf(swedish, "Total nederbörd: %.2f%n", sum(data.getRain()));
        System.out.println("Datum för lägsta lufttryck: " + timestamp(data.getTimestamps().get(lowestPressure)));
        System.out.printf(swedish, "Medeltemperatur: %.2f%n", mean(temperatures));
    }
}
