#!/usr/bin/env bash

brt_browse_link() {
  local url="$1"
  local text="$2"
  url=${url//\\/\\\\}
  url=${url//;/\\;}
  printf '\033]8;;%s\033\\%s\033]8;;\033\\' "$url" "$text"
}

brt_browse_read_key() {
  local k k2 seq c
  IFS= read -rsn1 k || return 1

  if [[ $k != $'\x1b' ]]; then
    case "$k" in
      $'\r'|$'\n') printf 'enter' ;;
      q|Q) printf 'quit' ;;
      [1-5]) printf 'open:%s' "$k" ;;
      *) printf 'other' ;;
    esac
    return 0
  fi

  if ! IFS= read -rsn1 -t 1 k2; then
    printf 'esc'
    return 0
  fi

  case "$k2" in
    '[')
      seq=""
      local i
      for (( i=0; i<3; i++ )); do
        if IFS= read -rsn1 -t 1 c; then
          seq+="$c"
          [[ "$c" =~ [A-Za-z~] ]] && break
        else
          break
        fi
      done
      case "$seq" in
        D|'D'*) printf 'left' ;;
        C|'C'*) printf 'right' ;;
        A|'A'*) printf 'up' ;;
        B|'B'*) printf 'down' ;;
        *) printf 'esc' ;;
      esac
      ;;
    O)
      if ! IFS= read -rsn1 -t 1 c; then
        printf 'esc'
        return 0
      fi
      case "$c" in
        D) printf 'left' ;;
        C) printf 'right' ;;
        *) printf 'esc' ;;
      esac
      ;;
    *)
      printf 'esc'
      ;;
  esac
}

brt_browse_open_url() {
  local url="$1"
  if command -v open &>/dev/null; then
    open "$url"
  elif command -v xdg-open &>/dev/null; then
    xdg-open "$url"
  else
    brt_info "Open: ${url}"
  fi
}

brt_browse_draw() {
  local query="$1"
  local page="$2"
  local cache_file="$3"
  local total page_count start idx rank title url line item
  local -a titles urls

  total=$(python3 -c "import json; print(len(json.load(open('${cache_file}'))))" 2>/dev/null || echo 0)
  if (( total < 1 )); then
    brt_error "No results to display"
    return 1
  fi

  page_count=$(( (total + 4) / 5 ))
  if (( page < 0 )); then page=0; fi
  if (( page >= page_count )); then page=$(( page_count - 1 )); fi

  start=$(( page * 5 ))
  local page_json
  page_json=$(
    python3 -c "
import json
items = json.load(open('${cache_file}'))
for item in items[${start}:${start}+5]:
    print(json.dumps(item))
"
  )

  printf '\033[H\033[2J\033[?25l'
  printf '\033[1mbrt browse\033[0m — %s\n\n' "$query"

  titles=()
  urls=()
  while IFS= read -r item; do
    [[ -z "$item" ]] && continue
    eval "$(python3 -c "
import json, shlex, sys
item = json.loads(sys.argv[1])
print('title=' + shlex.quote(item.get('title', '')))
print('url=' + shlex.quote(item.get('url', '')))
" "$item")"
    titles+=("$title")
    urls+=("$url")
  done <<< "$page_json"

  for idx in "${!titles[@]}"; do
    rank=$(( start + idx + 1 ))
    title="${titles[$idx]}"
    url="${urls[$idx]}"
    [[ -z "$title" ]] && continue
    printf ' \033[1m%d.\033[0m ' "$rank"
    brt_browse_link "$url" "$title"
    printf '\n    \033[2m'
    brt_browse_link "$url" "$url"
    printf '\033[0m\n\n'
  done

  line=$(( start + 1 ))
  if (( start + 5 > total )); then
    line_end=$total
  else
    line_end=$(( start + 5 ))
  fi

  printf '\033[2m'
  printf 'Showing %d-%d of %d' "$line" "$line_end" "$total"
  if (( page_count > 1 )); then
    printf ' · page %d/%d' "$(( page + 1 ))" "$page_count"
  fi
  printf '\n'
  printf '← → change page · 1-5 open result · q quit\033[0m\n'
  printf '\033[?25h'
}

brt_browse() {
  local query="${1:-}"
  local cache_file page=0 key rank url total page_count
  local old_stty=""

  if [[ -z "$query" ]]; then
    brt_error 'Usage: brt -browse "search query"'
    brt_info "Shows top search results with clickable links (Google when configured)"
    brt_info "← → to paginate (1-5, 6-10, … up to 25) · 1-5 opens a result"
    brt_info "Optional: brt -config (or BRT_GOOGLE_API_KEY + BRT_GOOGLE_CX)"
    exit 1
  fi

  if ! command -v python3 &>/dev/null; then
    brt_error "python3 is required for brt -browse"
    exit 1
  fi

  if ! command -v curl &>/dev/null; then
    brt_error "curl is required for brt -browse"
    exit 1
  fi

  brt_info "Searching for: ${query}"
  cache_file=$(mktemp "${TMPDIR:-/tmp}/brt-browse.XXXXXX")
  err_file=$(mktemp "${TMPDIR:-/tmp}/brt-browse-err.XXXXXX")
  if ! python3 "${BRT_LIB}/browse.py" search "$query" 25 >"$cache_file" 2>"$err_file"; then
    [[ -s "$err_file" ]] && cat "$err_file" >&2
    rm -f "$cache_file" "$err_file"
    exit 1
  fi
  [[ -s "$err_file" ]] && cat "$err_file" >&2
  rm -f "$err_file"

  if [[ ! -s "$cache_file" ]] || ! python3 -c "import json; json.load(open('${cache_file}'))" 2>/dev/null; then
    brt_error "Could not fetch Google search results"
    rm -f "$cache_file"
    exit 1
  fi

  if ! old_stty=$(stty -g 2>/dev/null); then
    brt_browse_draw "$query" "$page" "$cache_file"
    rm -f "$cache_file"
    return 0
  fi

  stty -echo -icanon min 1 time 0 2>/dev/null || true
  trap 'stty "$old_stty" 2>/dev/null; printf "\033[?25h"; rm -f "$cache_file"; trap - EXIT INT TERM' EXIT INT TERM

  while true; do
    brt_browse_draw "$query" "$page" "$cache_file" || break
    key=$(brt_browse_read_key || echo quit)
    case "$key" in
      left)
        if (( page > 0 )); then
          ((page--)) || true
        fi
        ;;
      right)
        total=$(python3 -c "import json; print(len(json.load(open('${cache_file}'))))")
        page_count=$(( (total + 4) / 5 ))
        if (( page + 1 < page_count )); then
          ((page++)) || true
        fi
        ;;
      open:*)
        rank=${key#open:}
        url=$(python3 -c "
import json
items = json.load(open('${cache_file}'))
idx = ${page} * 5 + int('${rank}') - 1
print(items[idx]['url'] if 0 <= idx < len(items) else '')
")
        if [[ -n "$url" ]]; then
          stty "$old_stty" 2>/dev/null || true
          printf '\033[?25h\n'
          brt_browse_open_url "$url"
          stty -echo -icanon min 1 time 0 2>/dev/null || true
        fi
        ;;
      quit|esc)
        break
        ;;
    esac
  done

  stty "$old_stty" 2>/dev/null || true
  printf '\033[?25h\n'
  rm -f "$cache_file"
  trap - EXIT INT TERM
}
