"""
Package degli exporter — generazione report in vari formati.

Contiene la ExporterFactory per creare automaticamente l'exporter
corretto in base al formato richiesto.
"""

from .base import BaseExporter
from .markdown import MarkdownExporter
from .json_exporter import JsonExporter
from .html import HtmlExporter
from dataprofiler.exceptions import UnsupportedFormatError


class ExporterFactory:
    """Factory per creare l'exporter appropriato in base al formato.

    Esempio::

        exporter = ExporterFactory.create("md")    # → MarkdownExporter
        exporter = ExporterFactory.create("json")  # → JsonExporter
        exporter = ExporterFactory.create("html")  # → HtmlExporter
    """

    _registry: dict[str, type[BaseExporter]] = {
        "md": MarkdownExporter,
        "markdown": MarkdownExporter,
        "json": JsonExporter,
        "html": HtmlExporter,
    }

    @classmethod
    def create(cls, fmt: str) -> BaseExporter:
        """Crea un exporter basato sul formato richiesto.

        Args:
            fmt: Formato di output ("md", "json", "html").

        Returns:
            Istanza dell'exporter appropriato.

        Raises:
            UnsupportedFormatError: Se il formato non è supportato.
        """
        fmt = fmt.lower().strip(".")
        exporter_class = cls._registry.get(fmt)
        if exporter_class is None:
            supported = ", ".join(sorted(set(
                k for k in cls._registry.keys()
                if len(k) <= 4  # mostra solo le abbreviazioni
            )))
            raise UnsupportedFormatError(
                f"Formato export '{fmt}' non supportato. "
                f"Formati validi: {supported}"
            )
        return exporter_class()

    @classmethod
    def register(cls, fmt: str, exporter_class: type[BaseExporter]) -> None:
        """Registra un nuovo exporter per un formato.

        Args:
            fmt: Identificatore del formato (es. "csv", "pdf").
            exporter_class: Classe exporter da associare.
        """
        cls._registry[fmt.lower()] = exporter_class

    @classmethod
    def supported_formats(cls) -> list[str]:
        """Restituisce la lista dei formati supportati."""
        return sorted(set(k for k in cls._registry.keys() if len(k) <= 4))


__all__ = [
    "BaseExporter",
    "MarkdownExporter",
    "JsonExporter",
    "HtmlExporter",
    "ExporterFactory",
]
