#!/usr/bin/env python3
"""CLI tool to run a multi-agent meeting."""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

from src.config_loader import load_agents
from src.llm_client import create_client
from src.meeting import run_meeting, run_meeting_interactive, save_report, save_transcript
from src.scenarios import list_scenarios, load_scenario


def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
    """Parse command-line arguments.

    Args:
        argv: Argument list to parse; defaults to sys.argv when None.

    Returns:
        Parsed argparse.Namespace with topic, agents, max_rounds,
        agents_dir, output_dir, context, scenario, auto_select,
        and list_scenarios attributes.
    """
    parser = argparse.ArgumentParser(
        description="Run a multi-agent meeting on a given topic.",
    )
    parser.add_argument(
        "--topic",
        default=None,
        help="The discussion topic for the meeting.",
    )

    # Agent selection: --agents, --scenario, --auto-select are mutually exclusive choices
    agent_group = parser.add_mutually_exclusive_group()
    agent_group.add_argument(
        "--agents",
        default=None,
        help="Comma-separated list of agent names to participate.",
    )
    agent_group.add_argument(
        "--scenario",
        default=None,
        help="Use a preset scenario (e.g., product_review, startup_pitch).",
    )
    agent_group.add_argument(
        "--auto-select",
        action="store_true",
        default=False,
        help="Let PM automatically select agents based on the topic.",
    )

    parser.add_argument(
        "--list-scenarios",
        action="store_true",
        default=False,
        help="List all available scenarios and exit.",
    )
    parser.add_argument(
        "--interactive",
        action="store_true",
        default=False,
        help="Enable human-in-the-loop interactive mode.",
    )
    parser.add_argument(
        "--max-rounds",
        type=int,
        default=None,
        help="Maximum number of discussion rounds (default: 10).",
    )
    parser.add_argument(
        "--context",
        default="",
        help="Inline background context for the discussion.",
    )
    parser.add_argument(
        "--context-file",
        default=None,
        help="Path to a file containing background context.",
    )
    parser.add_argument(
        "--agents-dir",
        default="agents",
        help="Directory containing agent config files (default: agents/).",
    )
    parser.add_argument(
        "--output-dir",
        default="reports",
        help="Directory to save the meeting report (default: reports/).",
    )
    parser.add_argument(
        "--context-budget",
        type=int,
        default=6000,
        help="Token budget for whiteboard compression (default: 6000).",
    )
    parser.add_argument(
        "--no-compact",
        action="store_true",
        default=False,
        help="Disable context compression (debug mode, old behavior).",
    )
    return parser.parse_args(argv)


def main() -> None:
    """CLI entry point for run_meeting."""
    args = parse_args()

    # Handle --list-scenarios
    if args.list_scenarios:
        scenarios = list_scenarios()
        print(f"{'Name':<22} {'Description':<40} {'Agents'}")
        print("-" * 90)
        for name, scenario in scenarios.items():
            agents_str = ", ".join(scenario.agents)
            print(f"{name:<22} {scenario.description:<40} {agents_str}")
        return

    # Validate that --topic is provided for actual meetings
    if not args.topic:
        print("Error: --topic is required.", file=sys.stderr)
        sys.exit(1)

    agents_dir = Path(args.agents_dir)
    output_dir = Path(args.output_dir)

    # Build context from --context and --context-file
    context_parts: list[str] = []
    if args.context:
        context_parts.append(args.context)
    if args.context_file:
        context_file_path = Path(args.context_file)
        context_parts.append(context_file_path.read_text(encoding="utf-8"))
    context = "\n\n".join(context_parts)

    max_rounds = args.max_rounds  # None if not explicitly set

    # Determine agent list based on mode
    client = None
    if args.scenario:
        scenario = load_scenario(args.scenario)
        agent_names = scenario.agents
        if max_rounds is None:
            max_rounds = scenario.suggested_max_rounds
    elif args.auto_select:
        from src.agent_selector import auto_select_agents

        # Load all available agents for selection
        all_agent_files = list(agents_dir.glob("*.json")) + list(agents_dir.glob("*.yaml")) + list(agents_dir.glob("*.yml"))
        all_agent_names = [f.stem for f in all_agent_files if not f.stem.startswith("example_")]
        all_configs = load_agents(all_agent_names, agents_dir=agents_dir)
        client = create_client()
        agent_names = auto_select_agents(
            topic=args.topic,
            context=context,
            all_agents=all_configs,
            client=client,
        )
        print(f"Auto-selected agents: {', '.join(agent_names)}")
    elif args.agents:
        agent_names = [name.strip() for name in args.agents.split(",")]
    else:
        print(
            "Error: Must provide one of --agents, --scenario, or --auto-select.",
            file=sys.stderr,
        )
        sys.exit(1)

    try:
        agent_configs = load_agents(agent_names, agents_dir=agents_dir)
    except FileNotFoundError as exc:
        print(f"Error: {exc}", file=sys.stderr)
        sys.exit(1)

    # Apply default max_rounds if not set by user or scenario
    if max_rounds is None:
        max_rounds = 10

    if client is None:
        client = create_client()

    # Create context_manager unless --no-compact
    context_manager = None
    if not args.no_compact:
        from src.context_manager import ContextManager
        context_manager = ContextManager(budget_tokens=args.context_budget)

    if args.interactive:
        result = run_meeting_interactive(
            topic=args.topic,
            context=context,
            agent_configs=agent_configs,
            client=client,
            max_rounds=max_rounds,
            output_dir=output_dir,
            context_manager=context_manager,
        )
    else:
        result = run_meeting(
            topic=args.topic,
            agent_configs=agent_configs,
            client=client,
            max_rounds=max_rounds,
            output_dir=output_dir,
            context=context,
            context_manager=context_manager,
        )

    report_path = save_report(result.final_report, topic=args.topic, output_dir=output_dir)
    transcript_path = save_transcript(result, output_dir=output_dir)
    print(f"\nReport saved to: {report_path}")
    print(f"Transcript saved to: {transcript_path}")


if __name__ == "__main__":
    main()
