#!/usr/bin/env bash
# u/optimize: generate N candidate optimized prompts and select the best.
set -euo pipefail

for _arg; do
    [ "$_arg" = "-help" ] && cat <<'EOF' && exit 0
usage: optimize [flags] [prompt...]
       echo "prompt" | optimize [flags]

Generates N optimized candidates for a prompt, then judges and returns the best.
Uses OLLIE_MODEL and OLLIE_BACKEND by default for both stages.

Flags:
  -n N          number of candidates to generate (default: 3)
  -cb BACKEND   candidate generation backend
  -cm MODEL     candidate generation model
  -jb BACKEND   judge backend
  -jm MODEL     judge model
  -help         show this help
EOF
done

n=3; cb=; cm=; jb=; jm=

while [ $# -gt 0 ]; do
    case $1 in
        -n)    n=$2;  shift ;;
        -cb)   cb=$2; shift ;;
        -cm)   cm=$2; shift ;;
        -jb)   jb=$2; shift ;;
        -jm)   jm=$2; shift ;;
        -help) ;;
        --)    shift; break ;;
        -*)    printf 'optimize: unknown flag: %s\n' "$1" >&2; exit 1 ;;
        *)     break ;;
    esac
    shift
done

if [ $# -gt 0 ]; then
    prompt="$*"
elif ! [ -t 0 ]; then
    prompt=$(cat)
else
    printf 'optimize: prompt required\n' >&2; exit 1
fi

[ -z "$prompt" ] && { printf 'optimize: empty prompt\n' >&2; exit 1; }

Q="${0%/*}/../s/q"

c_flags=()
j_flags=()
[ -n "$cb" ] && c_flags+=(-backend "$cb")
[ -n "$cm" ] && c_flags+=(-model "$cm")
[ -n "$jb" ] && j_flags+=(-backend "$jb")
[ -n "$jm" ] && j_flags+=(-model "$jm")

printf 'generating %d candidates...\n' "$n" >&2
candidates=$("$Q" "${c_flags[@]}" -parallel "$n" \
    "Optimize the following prompt. Return only the optimized prompt, no explanation or preamble:

$prompt")

printf 'judging...\n' >&2
"$Q" "${j_flags[@]}" \
    "Review these candidate prompts and return only the single best one, no explanation or preamble:

$candidates"
