"""
ErrorCollector - Gemeinsame Klasse zum Sammeln von Fehlern und Warnungen

Diese Klasse wird von getpositions.py und drawdxf.py verwendet, um Fehler
und Warnungen während der Verarbeitung zu sammeln und zu verwalten.
"""

import json
from pathlib import Path


class ErrorCollector:
    """Sammelt alle Fehler und Warnungen während der Verarbeitung."""

    def __init__(self):
        self.errors = {}
        self.warnings = {}

    def add_errors(self, error_dict):
        """Fügt Fehler aus einem Dictionary hinzu."""
        for key, value in error_dict.items():
            if key in self.errors:
                # Key existiert bereits - Verhalten hängt vom Typ ab
                existing = self.errors[key]

                if isinstance(existing, dict) and isinstance(value, dict):
                    # Beide sind Dictionaries → Merge/Update
                    existing.update(value)
                elif isinstance(existing, list):
                    # Existierender Wert ist Liste
                    if isinstance(value, list):
                        existing.extend(value)
                    else:
                        existing.append(value)
                else:
                    # Existierender Wert ist weder dict noch list → Mache Liste daraus
                    if isinstance(value, list):
                        self.errors[key] = [existing] + value
                    else:
                        self.errors[key] = [existing, value]
            else:
                # Neuer Key - behalte Typ des Wertes
                if isinstance(value, (dict, list)):
                    # Dictionary oder Liste → direkt speichern
                    self.errors[key] = value
                else:
                    # Primitiver Wert (String, etc.) → als Liste speichern
                    self.errors[key] = [value]

    def add_warnings(self, warning_dict):
        """Fügt Warnungen aus einem Dictionary hinzu."""
        for key, value in warning_dict.items():
            if key in self.warnings:
                # Key existiert bereits - Verhalten hängt vom Typ ab
                existing = self.warnings[key]

                if isinstance(existing, dict) and isinstance(value, dict):
                    # Beide sind Dictionaries → Merge/Update
                    existing.update(value)
                elif isinstance(existing, list):
                    # Existierender Wert ist Liste
                    if isinstance(value, list):
                        existing.extend(value)
                    else:
                        existing.append(value)
                else:
                    # Existierender Wert ist weder dict noch list → Mache Liste daraus
                    if isinstance(value, list):
                        self.warnings[key] = [existing] + value
                    else:
                        self.warnings[key] = [existing, value]
            else:
                # Neuer Key - behalte Typ des Wertes
                if isinstance(value, (dict, list)):
                    # Dictionary oder Liste → direkt speichern
                    self.warnings[key] = value
                else:
                    # Primitiver Wert (String, etc.) → als Liste speichern
                    self.warnings[key] = [value]

    def has_errors_or_warnings(self):
        """Prüft ob Fehler oder Warnungen vorhanden sind."""
        return bool(self.errors) or bool(self.warnings)

    def has_errors(self):
        """Prüft ob Fehler vorhanden sind."""
        return bool(self.errors)

    def get_all_issues(self):
        """Gibt alle Fehler und Warnungen als Dictionary zurück."""
        result = {}
        if self.errors:
            result["errors"] = self.errors
        if self.warnings:
            result["warnings"] = self.warnings
        return result

    def write_errorfile(self, work_dir: Path, filename: str):
        """Schreibt Fehlerdatei nur wenn Fehler oder Warnungen vorhanden sind."""
        if self.has_errors():
            print("Fehler gefunden. Schreibe Error-Datei.")
            all_issues = self.get_all_issues()
            write_json_file(all_issues, work_dir, filename)
        else:
            print("Keine Fehler gefunden. Keine Error-Datei geschrieben.")


def write_json_file(data: dict, out_dir: Path, filename: str) -> None:
    """
    Schreibt Daten in eine JSON-Datei.

    Args:
        data: Dictionary mit zu schreibenden Daten
        out_dir: Ausgabeverzeichnis
        filename: Dateiname für die JSON-Datei
    """
    print("writing data to a json file ...")
    outfile = out_dir / filename if isinstance(out_dir, Path) else Path(out_dir) / filename
    with open(outfile, 'w', encoding='utf-8') as fh:
        json.dump(data, fh, indent=2, ensure_ascii=False, default=str)
    print("done")
