#!/usr/bin/env bash
set -euo pipefail

API_KEY=""
MODEL="gpt-5-codex"
BASE_URL="https://svobodanet.ru/v1"
PROVIDER_ID="svobodanet"
ENV_KEY_NAME="AIDA_API_KEY"
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
CREATE_PROFILES=1
APPROVAL_POLICY="full-auto"
PROJECT_DIR=""

usage() {
  cat <<'EOF'
Usage:
  setup-codex.sh --api-key <sk-proj-...> [options]

Required:
  --api-key <key>          API key (sk-proj-...)

Options:
  --model <model>          Default model (default: gpt-5-codex)
  --base-url <url>         API base URL (default: https://svobodanet.ru/v1)
  --codex-home <path>      Codex config directory (default: ~/.codex)
  --env-key-name <name>    Environment variable name (default: AIDA_API_KEY)
  --approval-policy <mode> Approval policy: suggest, auto-edit, full-auto (default: full-auto)
  --project-dir <path>     Also create .codex/config.toml in this project directory
  --no-profiles            Skip creating CLI profile files

Examples:
  setup-codex.sh --api-key sk-proj-... --model gpt-5-codex
  setup-codex.sh --api-key sk-proj-... --approval-policy auto-edit
  setup-codex.sh --api-key sk-proj-... --project-dir ~/my-project
EOF
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --api-key)
      API_KEY="${2:-}"
      shift 2
      ;;
    --model)
      MODEL="${2:-}"
      shift 2
      ;;
    --base-url)
      BASE_URL="${2:-}"
      shift 2
      ;;
    --codex-home)
      CODEX_HOME="${2:-}"
      shift 2
      ;;
    --env-key-name)
      ENV_KEY_NAME="${2:-}"
      shift 2
      ;;
    --approval-policy)
      APPROVAL_POLICY="${2:-}"
      shift 2
      ;;
    --project-dir)
      PROJECT_DIR="${2:-}"
      shift 2
      ;;
    --no-profiles)
      CREATE_PROFILES=0
      shift
      ;;
    --help|-h)
      usage
      exit 0
      ;;
    *)
      echo "Unknown argument: $1" >&2
      usage >&2
      exit 1
      ;;
  esac
done

if [[ -z "$API_KEY" ]]; then
  echo "Error: --api-key is required" >&2
  usage >&2
  exit 1
fi

mkdir -p "$CODEX_HOME"
CONFIG_PATH="$CODEX_HOME/config.toml"
TIMESTAMP="$(date +%Y%m%d-%H%M%S)"

if [[ -f "$CONFIG_PATH" ]]; then
  cp "$CONFIG_PATH" "$CODEX_HOME/config.toml.backup-$TIMESTAMP"
  echo "Backed up existing config to $CODEX_HOME/config.toml.backup-$TIMESTAMP"
fi

cat > "$CONFIG_PATH" <<EOF
model = "$MODEL"
model_provider = "$PROVIDER_ID"
approval_policy = "$APPROVAL_POLICY"

[model_providers.$PROVIDER_ID]
name = "Svobodanet Aida AI"
base_url = "$BASE_URL"
env_key = "$ENV_KEY_NAME"
wire_api = "responses"
request_max_retries = 3
stream_max_retries = 6
supports_websockets = false
EOF

PROFILE_MODELS=(
  "gpt-5"
  "gpt-5-codex"
  "gpt-5-codex-mini"
  "gpt-5.1-codex"
  "gpt-5.1-codex-mini"
)

if [[ "$CREATE_PROFILES" -eq 1 ]]; then
  for profile_model in "${PROFILE_MODELS[@]}"; do
    profile_path="$CODEX_HOME/$profile_model.config.toml"
    cat > "$profile_path" <<EOF
model = "$profile_model"
model_provider = "$PROVIDER_ID"
approval_policy = "$APPROVAL_POLICY"
EOF
  done
fi

if [[ -n "$PROJECT_DIR" ]]; then
  PROJECT_CODEX_DIR="$PROJECT_DIR/.codex"
  mkdir -p "$PROJECT_CODEX_DIR"
  PROJECT_CONFIG="$PROJECT_CODEX_DIR/config.toml"
  cat > "$PROJECT_CONFIG" <<EOF
model = "$MODEL"
model_provider = "$PROVIDER_ID"
approval_policy = "$APPROVAL_POLICY"

[model_providers.$PROVIDER_ID]
name = "Svobodanet Aida AI"
base_url = "$BASE_URL"
env_key = "$ENV_KEY_NAME"
wire_api = "responses"
request_max_retries = 3
stream_max_retries = 6
supports_websockets = false
EOF
  echo "Created project config: $PROJECT_CONFIG"
fi

shell_name="$(basename "${SHELL:-sh}")"
case "$shell_name" in
  bash)
    rc_file="$HOME/.bashrc"
    rc_line_prefix="export"
    ;;
  zsh)
    rc_file="$HOME/.zshrc"
    rc_line_prefix="export"
    ;;
  fish)
    rc_file="$HOME/.config/fish/config.fish"
    rc_line_prefix="fish"
    ;;
  *)
    rc_file=""
    rc_line_prefix=""
    ;;
esac

if [[ -n "$rc_file" ]]; then
  mkdir -p "$(dirname "$rc_file")"
  if [[ "$rc_line_prefix" == "fish" ]]; then
    export_line="set -gx $ENV_KEY_NAME \"$API_KEY\""
  else
    export_line="export $ENV_KEY_NAME=\"$API_KEY\""
  fi
  if [[ ! -f "$rc_file" ]] || ! grep -Fq "$export_line" "$rc_file"; then
    {
      echo
      echo "# Svobodanet Aida AI for Codex"
      echo "$export_line"
    } >> "$rc_file"
    echo "Saved $ENV_KEY_NAME to $rc_file"
  else
    echo "$ENV_KEY_NAME already exists in $rc_file"
  fi
else
  echo "Could not detect shell rc file automatically. Set $ENV_KEY_NAME manually in your environment."
fi

cat <<EOF

Done.
- Config: $CONFIG_PATH
- Provider: $PROVIDER_ID
- Default model: $MODEL
- Approval policy: $APPROVAL_POLICY
- API key variable: $ENV_KEY_NAME

Approval policy modes:
  suggest    — AI suggests changes, you approve each one manually
  auto-edit  — AI edits files automatically, asks before running shell commands
  full-auto  — AI edits files and runs shell commands without asking (recommended)

Next steps:
1. Restart your shell or run: source "$rc_file" (if applicable)
2. Run: codex doctor
3. Start Codex: codex
4. Optional profiles: codex -p gpt-5-codex-mini
EOF
