package org.example;

import java.util.*;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class App {

    public static void main(String[] args) {
//        if (args.length != 1) {
//            System.out.println("Wywołanie: mvn exec:java -Dexec.mainClass=\"org.example.App\" -Dexec.args=\"natural\" lub none albo alt");
//            return;
//        }

//        String mode = args[0].toLowerCase();

        String mode = "alt";
        Set<Pracownik> data;
        try {
            data = TestDataFactory.createTestSet(mode);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
            return;
        }

        System.out.println("Struktura danych:");
        printStructure(data, 0);

        System.out.println("\nStatystyka liczby elementów podrzędnych:");
        Map<Pracownik, Integer> stats = generateStatistics(data, mode);
        printStatistics(stats);

        for (Pracownik pracownik : data) {
            pracownik.makeImageBlackAndWhite();
        }
    }

    public static void printStructure(Set<Pracownik> ogloszenia, int level) {
        for (Pracownik pracownik : ogloszenia) {
            System.out.println("  ".repeat(level) + "- " + pracownik);
            printStructure(pracownik.getChildren(), level + 1);
        }
    }

    public static Map<Pracownik, Integer> generateStatistics(Set<Pracownik> ogloszenia, String mode) {
        Map<Pracownik, Integer> result = createMap(mode);
        fillStatistics(ogloszenia, result);
        return result;
    }

    private static void fillStatistics(Set<Pracownik> ogloszenia, Map<Pracownik, Integer> result) {
        for (Pracownik pracownik : ogloszenia) {
            int count = countAllDescendants(pracownik);
            result.put(pracownik, count);
            fillStatistics(pracownik.getChildren(), result);
        }
    }

    // Rekursyjnie liczymy potomków
    private static int countAllDescendants(Pracownik pracownik) {
        int sum = 0;
        for (Pracownik child : pracownik.getChildren()) {
            sum += 1;
            sum += countAllDescendants(child);
        }
        return sum;
    }

    private static Map<Pracownik, Integer> createMap(String mode) {
        switch (mode.toLowerCase()) {
            case "none":
                return new HashMap<>();
            case "natural":
                return new TreeMap<>();
            case "alt":
                return new TreeMap<>(new PracownikAlternativeComparator());
            default:
                throw new IllegalArgumentException("Argument musi być none, natural lub alt");
        }
    }

    private static void printStatistics(Map<Pracownik, Integer> stats) {
        for (Map.Entry<Pracownik, Integer> entry : stats.entrySet()) {
            System.out.println(entry.getKey() + ", liczba wszystkich podrzędnych: " + entry.getValue());
        }
    }
}
