#!/usr/bin/env python3
"""
Curriculum PDF Generator CLI

Usage:
    generate.py render   <outline.json> --template-dir <dir> --output-dir <dir>
    generate.py week     --outlines <dir> --template-dir <dir> --output <dir> --week N [--days M W F]
    generate.py all      --outlines <dir> --template-dir <dir> --output <dir> [--weeks 32] [--days M W F]
    generate.py validate <outline.json>

Examples:
    # Render a single lesson
    generate.py render 2nd_Grade/Science/outlines/W01_Monday.json \
        --template-dir 2nd_Grade/Science/templates \
        --output-dir 2nd_Grade/Science/Week01

    # Render a full week
    generate.py week --outlines 2nd_Grade/Science/outlines \
        --template-dir 2nd_Grade/Science/templates \
        --output 2nd_Grade/Science --week 1 --days Monday Wednesday Friday

    # Render all 32 weeks
    generate.py all --outlines 2nd_Grade/Science/outlines \
        --template-dir 2nd_Grade/Science/templates \
        --output 2nd_Grade/Science --weeks 32 --days Monday Wednesday Friday

    # Validate an outline
    generate.py validate 2nd_Grade/Science/outlines/W01_Monday.json
"""

import argparse
import sys
import os
from pathlib import Path

# Add shared dir to path
sys.path.insert(0, str(Path(__file__).parent))
from render import (
    render_outline,
    render_week,
    render_all,
    validate_outline,
)


def cmd_render(args):
    """Render a single outline JSON to PDF."""
    pdf = render_outline(
        args.outline,
        args.template_dir,
        args.output_dir,
        template_name=args.template,
        verbose=args.verbose,
    )
    print(f"✓ Generated: {pdf}")
    return pdf


def cmd_week(args):
    """Render all days in a week."""
    days = [d.strip() for d in args.days.split(",")] if args.days else None
    pdfs = render_week(
        args.outlines,
        args.template_dir,
        args.output,
        args.week,
        template_name=args.template,
        days=days,
        verbose=args.verbose,
    )
    print(f"✓ Week {args.week}: {len(pdfs)} PDF(s)")
    return pdfs


def cmd_all(args):
    """Render all weeks in a course."""
    days = [d.strip() for d in args.days.split(",")] if args.days else None
    pdfs = render_all(
        args.outlines,
        args.template_dir,
        args.output,
        total_weeks=args.weeks,
        template_name=args.template,
        days=days,
        verbose=args.verbose,
    )
    print(f"✓ Total: {len(pdfs)} PDF(s) across {args.weeks} weeks")
    return pdfs


def cmd_validate(args):
    """Validate an outline JSON."""
    result = validate_outline(args.outline)
    if result["valid"]:
        print(f"✓ {args.outline} is valid")
    else:
        print(f"✗ {args.outline} has errors:")
        for err in result["errors"]:
            print(f"  - {err}")
    return result


def main():
    parser = argparse.ArgumentParser(
        description="Curriculum PDF Generator",
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    subparsers = parser.add_subparsers(dest="command", help="Command to run")

    # render
    p_render = subparsers.add_parser("render", help="Render a single outline")
    p_render.add_argument("outline", help="Outline JSON path")
    p_render.add_argument("-t", "--template-dir", required=True)
    p_render.add_argument("-o", "--output-dir", required=True)
    p_render.add_argument("--template", help="Template filename")
    p_render.add_argument("-v", "--verbose", action="store_true")

    # week
    p_week = subparsers.add_parser("week", help="Render a full week")
    p_week.add_argument("--outlines", required=True, help="Outlines directory")
    p_week.add_argument("-t", "--template-dir", required=True)
    p_week.add_argument("-o", "--output", required=True, help="Output base directory")
    p_week.add_argument("--week", type=int, required=True)
    p_week.add_argument("--template", help="Template filename")
    p_week.add_argument("--days", help="Comma-separated day names (e.g. 'Monday,Wednesday,Friday')")
    p_week.add_argument("-v", "--verbose", action="store_true")

    # all
    p_all = subparsers.add_parser("all", help="Render all weeks")
    p_all.add_argument("--outlines", required=True, help="Outlines directory")
    p_all.add_argument("-t", "--template-dir", required=True)
    p_all.add_argument("-o", "--output", required=True, help="Output base directory")
    p_all.add_argument("--weeks", type=int, default=32)
    p_all.add_argument("--template", help="Template filename")
    p_all.add_argument("--days", help="Comma-separated day names")
    p_all.add_argument("-v", "--verbose", action="store_true")

    # validate
    p_val = subparsers.add_parser("validate", help="Validate an outline")
    p_val.add_argument("outline", help="Outline JSON path")

    args = parser.parse_args()

    if args.command is None:
        parser.print_help()
        sys.exit(1)

    cmds = {
        "render": cmd_render,
        "week": cmd_week,
        "all": cmd_all,
        "validate": cmd_validate,
    }
    cmds[args.command](args)


if __name__ == "__main__":
    main()
