"""
CLI principal pentru instrumentele de ingestie Data Hub.

Utilizare:
    datahub-ingest geometry prepare --source ... --level county --output ...
    datahub-ingest dataset add --id ... --source ... --level ... --join-key ...
    datahub-ingest dataset list
    datahub-ingest dataset validate --id ...
    datahub-ingest db init
"""
import typer
from rich.console import Console
from rich.table import Table

app = typer.Typer(
    name="datahub-ingest",
    help="Instrumente de ingestie pentru platforma Data Hub",
    no_args_is_help=True,
)

geometry_app = typer.Typer(help="Gestionare geometrii administrative")
dataset_app = typer.Typer(help="Gestionare seturi de date statistice")
db_app = typer.Typer(help="Operațiuni bază de date DuckDB")

app.add_typer(geometry_app, name="geometry")
app.add_typer(dataset_app, name="dataset")
app.add_typer(db_app, name="db")

console = Console()


# =============================================================
# Geometry commands
# =============================================================

@geometry_app.command("prepare")
def geometry_prepare(
    source: str = typer.Option(..., help="Calea către fișierul sursă (Parquet/GeoPackage/GeoJSON)"),
    level: str = typer.Option(..., help="Nivelul administrativ: region, county, lau"),
    output: str = typer.Option(None, help="Calea fișierului de ieșire (default: data/geometries/<level>.parquet)"),
    simplified: bool = typer.Option(False, help="Pregătește și versiunea simplificată"),
):
    """Pregătește geometriile administrative pentru un nivel dat."""
    from datahub_ingest.geometry import prepare_geometry

    if output is None:
        output = f"../data/geometries/{level}.parquet"

    prepare_geometry(source, level, output, simplified)
    console.print(f"[green]✓[/green] Geometrie pregătită: {output}")


@geometry_app.command("prepare-all")
def geometry_prepare_all(
    base_dir: str = typer.Option(
        "../../administrative_boundaries",
        help="Directorul de bază cu limitele administrative",
    ),
    output_dir: str = typer.Option(
        "../data/geometries",
        help="Directorul de ieșire",
    ),
):
    """Pregătește toate geometriile din directorul administrative_boundaries."""
    from datahub_ingest.geometry import prepare_all_geometries

    prepare_all_geometries(base_dir, output_dir)
    console.print("[green]✓[/green] Toate geometriile au fost pregătite!")


# =============================================================
# Dataset commands
# =============================================================

@dataset_app.command("add")
def dataset_add(
    id: str = typer.Option(..., help="Identificatorul unic al setului de date"),
    source: str = typer.Option(..., help="Calea fișierului sursă (CSV/XLSX/Parquet)"),
    level: str = typer.Option(..., help="Nivelul geometric: region, county, lau"),
    join_key: str = typer.Option(..., help="Coloana de join cu geometriile"),
    name: str = typer.Option(None, help="Numele setului de date"),
    description: str = typer.Option("", help="Descrierea setului de date"),
    source_name: str = typer.Option("", help="Numele sursei de date"),
    license: str = typer.Option("", help="Licența datelor"),
    output_dir: str = typer.Option("../data/statistics", help="Directorul de ieșire"),
    catalog_path: str = typer.Option("../data/catalog.json", help="Calea catalogului"),
):
    """Adaugă un set de date statistice în platformă."""
    from datahub_ingest.ingest import ingest_dataset

    ingest_dataset(
        dataset_id=id,
        source_path=source,
        level=level,
        join_key=join_key,
        name=name or id,
        description=description,
        source_name=source_name,
        license_name=license,
        output_dir=output_dir,
        catalog_path=catalog_path,
    )
    console.print(f"[green]✓[/green] Set de date adăugat: {id} (nivel: {level})")


@dataset_app.command("list")
def dataset_list(
    catalog_path: str = typer.Option("../data/catalog.json", help="Calea catalogului"),
):
    """Listează toate seturile de date disponibile."""
    from datahub_ingest.catalog import load_catalog

    catalog = load_catalog(catalog_path)

    if not catalog["datasets"]:
        console.print("[yellow]Nu există seturi de date înregistrate.[/yellow]")
        return

    table = Table(title="Seturi de date disponibile")
    table.add_column("ID", style="cyan")
    table.add_column("Nume", style="white")
    table.add_column("Niveluri", style="green")
    table.add_column("Coloane", justify="right")
    table.add_column("Perioadă")
    table.add_column("Sursă", style="dim")

    for ds in catalog["datasets"]:
        temporal = ""
        if ds.get("temporal", {}).get("type"):
            vals = ds["temporal"].get("values", [])
            temporal = f"{ds['temporal']['type']}: {', '.join(vals[:3])}"
            if len(vals) > 3:
                temporal += f" (+{len(vals) - 3})"

        table.add_row(
            ds["id"],
            ds["name"],
            ", ".join(ds.get("geometry_levels", [])),
            str(len(ds.get("columns", []))),
            temporal,
            ds.get("source", ""),
        )

    console.print(table)


@dataset_app.command("validate")
def dataset_validate(
    id: str = typer.Option(..., help="ID-ul setului de date"),
    level: str = typer.Option(None, help="Nivelul geometric de validat"),
    catalog_path: str = typer.Option("../data/catalog.json", help="Calea catalogului"),
    stats_dir: str = typer.Option("../data/statistics", help="Directorul cu date statistice"),
    geom_dir: str = typer.Option("../data/geometries", help="Directorul cu geometrii"),
):
    """Validează un set de date: verifică join keys, completitudine, tipuri."""
    from datahub_ingest.validate import validate_dataset

    validate_dataset(
        dataset_id=id,
        level=level,
        catalog_path=catalog_path,
        stats_dir=stats_dir,
        geom_dir=geom_dir,
    )


# =============================================================
# DB commands
# =============================================================

@db_app.command("init")
def db_init(
    db_path: str = typer.Option("../data/datahub.duckdb", help="Calea bazei de date DuckDB"),
):
    """Inițializează baza de date DuckDB cu extensiile necesare."""
    from datahub_ingest.db import init_db

    init_db(db_path)
    console.print(f"[green]✓[/green] Baza de date inițializată: {db_path}")


if __name__ == "__main__":
    app()
