#!/usr/bin/env python3
"""Mantara — CLI entry point.

Usage:
    python main.py "Build a hospital management system"
    python main.py --model gpt-4o-mini "Build a todo app"
    python main.py --input prompt.txt
"""

import argparse
import sys
from datetime import datetime
from pathlib import Path

from config import OUTPUT_DIR, MODEL
from generator import generate


def save_output(result: dict, label: str) -> list[Path]:
    """Save generated JSON and SQL to output directory."""
    OUTPUT_DIR.mkdir(exist_ok=True)

    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    slug = label[:40].lower().replace(" ", "_").replace("/", "_")
    prefix = f"{timestamp}_{slug}"
    files_saved = []

    json_path = OUTPUT_DIR / f"{prefix}.json"
    json_path.write_text(result["json_str"])
    files_saved.append(json_path)

    sql_path = OUTPUT_DIR / f"{prefix}.sql"
    sql_path.write_text(result["sql_str"])
    files_saved.append(sql_path)

    return files_saved


def print_validation(result: dict):
    """Print validation summary to stderr."""
    v = result["validation"]

    print("\n--- Validation Summary ---", file=sys.stderr)

    if v["errors"]:
        print("Business rule checks:", file=sys.stderr)
        for e in v["errors"]:
            print(f"  [x] {e}", file=sys.stderr)
    else:
        print("Business rule checks: ALL PASS", file=sys.stderr)

    status = "PASS" if v["is_valid"] else "FAIL"
    print(f"Overall: {status}", file=sys.stderr)


def main():
    parser = argparse.ArgumentParser(
        description="Mantara — Generate full-stack business applications from natural language"
    )
    parser.add_argument(
        "prompt",
        nargs="?",
        help="Natural language description of the system to generate",
    )
    parser.add_argument(
        "--input", "-i",
        type=str,
        help="Read prompt from a file instead of command line",
    )
    parser.add_argument(
        "--model", "-m",
        type=str,
        default=None,
        help=f"OpenAI model to use (default: {MODEL})",
    )
    parser.add_argument(
        "--no-save",
        action="store_true",
        help="Don't save output files, just print to stdout",
    )

    args = parser.parse_args()

    # Determine the user prompt
    if args.input:
        user_input = Path(args.input).read_text().strip()
    elif args.prompt:
        user_input = args.prompt
    else:
        parser.print_help()
        sys.exit(1)

    print(
        f'Generating schema for: "{user_input[:80]}'
        f'{"..." if len(user_input) > 80 else ""}"',
        file=sys.stderr,
    )
    print(f"Model: {args.model or MODEL}", file=sys.stderr)
    print("Working...", file=sys.stderr)

    try:
        result = generate(user_input, model=args.model)
    except ValueError as e:
        print(f"\nError: {e}", file=sys.stderr)
        sys.exit(1)

    print(f"\nCompleted in {result['elapsed_seconds']}s", file=sys.stderr)

    print_validation(result)

    if not args.no_save:
        files = save_output(result, user_input)
        print("\nFiles saved:", file=sys.stderr)
        for f in files:
            print(f"  {f}", file=sys.stderr)
    else:
        print("\n--- JSON ---")
        print(result["json_str"])
        print("\n--- SQL ---")
        print(result["sql_str"])


if __name__ == "__main__":
    main()
