#!/usr/bin/env python3
"""Execute a Jupyter notebook with a preloaded Odoo environment."""

from __future__ import annotations

import argparse
import os
import subprocess
import sys
from pathlib import Path


def main() -> None:
    parser = argparse.ArgumentParser(
        description="Execute Jupyter notebook with papermill"
    )

    parser.add_argument(
        "notebook_path",
        help="Path to notebook file",
    )

    parser.add_argument(
        "database",
        nargs="?",
        default=os.environ.get("DB_NAME"),
    )

    args = parser.parse_args()

    notebook_path = Path(args.notebook_path).resolve()

    if not notebook_path.exists():
        print(f"ERROR: Notebook not found: {notebook_path}", file=sys.stderr)
        sys.exit(1)

    db_name = args.database

    if not db_name:
        print("ERROR: No database specified", file=sys.stderr)
        sys.exit(1)

    project_root = notebook_path.parent

    ipython_dir = project_root / ".ipython"

    startup_script = ipython_dir / "profile_default" / "startup" / "00-odoo.py"
    if not startup_script.exists():
        print(
            f"ERROR: Directory not initialized. Run 'task init-odoo-jupyter {project_root}' first.",
            file=sys.stderr,
        )
        sys.exit(1)

    env = os.environ.copy()

    env["DB_NAME"] = db_name
    env.setdefault("PGHOST", "localhost")
    env.setdefault("PGPORT", "5432")
    env.setdefault("PGUSER", "odoo")
    env.setdefault("PGPASSWORD", "odoo")
    env["IPYTHONDIR"] = str(ipython_dir)

    output_path = notebook_path

    cmd = [
        "papermill",
        "--log-output",
        str(notebook_path),
        str(output_path),
    ]

    print()
    print("Executing notebook")
    print(f"Notebook : {notebook_path}")
    print(f"Database : {db_name}")
    print()

    try:
        subprocess.run(
            cmd,
            env=env,
            check=True,
        )

    except subprocess.CalledProcessError:
        print("ERROR: Notebook execution failed", file=sys.stderr)
        sys.exit(1)

    except FileNotFoundError:
        print(
            "ERROR: papermill not found. Install with: pip install papermill",
            file=sys.stderr,
        )
        sys.exit(1)

    print()
    print("Notebook executed successfully")
    print(output_path)
    print()


if __name__ == "__main__":
    main()