#!/usr/bin/env python3
"""
generator.py — DBML → Python SQLite generator
Pipeline: data/library.dbml → pydbml parser → helpers → Jinja2 → generated/library.py

Usage:
    python generator.py [--dbml PATH] [--out PATH]

Rules (generator-coding skill):
  - Never edit generated output; fix the data model or template instead.
  - StrictUndefined: missing template variables fail loudly.
  - trim_blocks + lstrip_blocks: output whitespace is clean.
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

from jinja2 import Environment, FileSystemLoader, StrictUndefined
from pydbml import PyDBML

# Project root is the directory containing this file
PROJECT_ROOT = Path(__file__).parent

DEFAULT_DBML = PROJECT_ROOT / "data" / "library.dbml"
DEFAULT_OUT  = PROJECT_ROOT / "generated" / "library.py"
TEMPLATES    = PROJECT_ROOT / "templates"


def parse_args() -> argparse.Namespace:
    p = argparse.ArgumentParser(description="DBML → Python SQLite generator")
    p.add_argument("--dbml", type=Path, default=DEFAULT_DBML,
                   help="Path to the DBML schema file")
    p.add_argument("--out",  type=Path, default=DEFAULT_OUT,
                   help="Output file path")
    return p.parse_args()


def build_jinja_env(template_dir: Path) -> Environment:
    """Jinja2 environment: StrictUndefined, clean whitespace."""
    return Environment(
        loader=FileSystemLoader(str(template_dir)),
        undefined=StrictUndefined,
        trim_blocks=True,
        lstrip_blocks=True,
        keep_trailing_newline=True,
    )


def main() -> None:
    args = parse_args()

    # ------------------------------------------------------------------
    # 1. Parse DBML
    # ------------------------------------------------------------------
    if not args.dbml.exists():
        sys.exit(f"ERROR: DBML file not found: {args.dbml}")

    print(f"Parsing {args.dbml} …")
    db = PyDBML(args.dbml.read_text(encoding="utf-8"))

    # ------------------------------------------------------------------
    # 2. Reshape with helpers
    # ------------------------------------------------------------------
    # Import from helpers package (same project root)
    sys.path.insert(0, str(PROJECT_ROOT))
    from helpers.dbml_helpers import prepare_tables  # noqa: E402

    tables = prepare_tables(db)
    print(f"  {len(tables)} table(s): {', '.join(t['name'] for t in tables)}")

    # ------------------------------------------------------------------
    # 3. Render template
    # ------------------------------------------------------------------
    env = build_jinja_env(TEMPLATES)
    template = env.get_template("library_program.py.jinja2")
    output = template.render(tables=tables)

    # ------------------------------------------------------------------
    # 4. Write output
    # ------------------------------------------------------------------
    args.out.parent.mkdir(parents=True, exist_ok=True)
    args.out.write_text(output, encoding="utf-8")
    print(f"Generated → {args.out}")


if __name__ == "__main__":
    main()
