#!/usr/bin/env python

# This script sends a given prompt to OpenAI, Anthropic, Gemini, DeepSeek, or OpenRouter chat API.
# Updated to remove system prompt usage and replace [CODE PROBLEM] placeholder.
#
# Example usage:
#   OpenAI:   cat <prompt-file> | ./models.py --no-dry-run --provider openai --model gpt-4o-mini
#   Anthropic: cat <prompt-file> | ./models.py --no-dry-run --provider anthropic --model claude-sonnet-4-5-20250929
#   Gemini:   cat <prompt-file> | ./models.py --no-dry-run --provider gemini --model gemini-2.0-flash
#   DeepSeek: cat <prompt-file> | ./models.py --no-dry-run --provider deepseek --model deepseek-chat
#   OpenRouter: cat <prompt-file> | ./models.py --no-dry-run --provider openrouter --model openai/gpt-4o-mini

from datetime import date
import argparse
import sys

from generators import create_generator

DEFAULT_MODEL_OPENAI = "gpt-5.2-codex"
DEFAULT_MODEL_ANTHROPIC = "claude-sonnet-4-5-20250929"
DEFAULT_MODEL_GEMINI = "gemini-2.0-flash"
DEFAULT_MODEL_DEEPSEEK = "deepseek-chat"
DEFAULT_MODEL_OPENROUTER = "openai/gpt-4o-mini"
DEFAULT_TEMPERATURE = 1.0

parser = argparse.ArgumentParser()
parser.add_argument(
    "--no-dry-run",
    dest="dry_run",
    action="store_false",
    help="Send live requests to the API",
)
parser.add_argument(
    "--num-samples",
    dest="num_samples",
    type=int,
    help="Number of times to send the prompt to the model.",
)
parser.add_argument(
    "--provider",
    type=str,
    choices=["openai", "anthropic", "gemini", "deepseek", "openrouter"],
    default="openai",
    help="Model provider: openai, anthropic, gemini, deepseek, or openrouter (default: openai)",
)
parser.add_argument(
    "--model",
    dest="model",
    type=str,
    help="Model name (e.g. gpt-4o-mini, claude-sonnet-4-5, gemini-2.0-flash, deepseek-chat, openai/gpt-4o-mini)",
)
parser.add_argument(
    "--temperature",
    dest="temperature",
    type=float,
    help="Sampling temperature (0–2).",
)
parser.add_argument(
    "--max-tokens",
    dest="max_tokens",
    type=int,
    default=4096,
    help="Max output tokens for anthropic/gemini/deepseek/openrouter (default: 4096)",
)
parser.add_argument(
    "--code-problem",
    dest="code_problem",
    type=str,
    help="Code problem to replace [CODE PROBLEM] placeholder in prompt",
)

parser.set_defaults(dry_run=True, num_samples=1, temperature=DEFAULT_TEMPERATURE)
args = parser.parse_args()

if args.model is None:
    defaults = {
        "openai": DEFAULT_MODEL_OPENAI,
        "anthropic": DEFAULT_MODEL_ANTHROPIC,
        "gemini": DEFAULT_MODEL_GEMINI,
        "deepseek": DEFAULT_MODEL_DEEPSEEK,
        "openrouter": DEFAULT_MODEL_OPENROUTER,
    }
    args.model = defaults.get(args.provider, DEFAULT_MODEL_OPENAI)

IS_DRY_RUN = args.dry_run
NUM_SAMPLES = args.num_samples
MODEL = args.model
PROVIDER = args.provider
TEMPERATURE = args.temperature

if TEMPERATURE < 0 or TEMPERATURE > 2:
    print("Temperature must be between 0 and 2.")
    sys.exit(1)

prompt = sys.stdin.read()
if args.code_problem and "[CODE PROBLEM]" in prompt:
    prompt = prompt.replace("[CODE PROBLEM]", args.code_problem)

print("Run metadata")
print("============")
print(f"Provider: {PROVIDER}")
print(f"Model: {MODEL}")
print(f"Temperature: {TEMPERATURE}")
print(f"Date: {date.today()}")
print("Prompt (first 200 chars):")
print("-------------")
print(prompt[:200] + "..." if len(prompt) > 200 else prompt)
print("-------------")

if IS_DRY_RUN:
    for i in range(NUM_SAMPLES):
        print(f"Dry run = {i + 1}")
    sys.exit(0)

generator = create_generator(
    provider=PROVIDER,
    model=MODEL,
    temperature=TEMPERATURE,
    max_tokens=args.max_tokens,
)

for i in range(NUM_SAMPLES):
    print(f"Run = {i + 1}")
    response = generator.generate_code(prompt)
    print("===== Response =====")
    print(response)
