#!/bin/bash
# todo.txt-cli action: open
# Opens links in a todo item based on gh: and jira: tokens.

# Show usage help
if [[ "$1" == "usage" ]]; then
  echo "Usage: todo.sh open ITEM#"
  echo "Opens all links found in the specified todo item."
  echo "Supported:"
  echo "  gh:owner/repo#123   -> https://github.com/owner/repo/issues/123"
  echo "  jira:TICKET-123     -> https://YOUR_JIRA_BASE/browse/TICKET-123"
  echo "Jira base URL can be set via env JIRA_BASE_URL or file \$TODO_DIR/.jira_base_url"
  exit 0
fi

ITEM="$1"

# Validate input
if [[ -z "$ITEM" ]]; then
  echo "Error: Missing ITEM#."
  echo "Usage: todo.sh open ITEM#"
  exit 1
fi

if ! [[ "$ITEM" =~ ^[0-9]+$ ]]; then
  echo "Error: ITEM# must be a positive integer."
  exit 1
fi

# Ensure required env is present
if [[ -z "${TODO_FILE:-}" || ! -f "$TODO_FILE" ]]; then
  echo "Error: TODO_FILE is not set or file not found. Run this via todo.sh."
  exit 1
fi

# Retrieve the item text
LINE="$(sed -n "${ITEM}p" "$TODO_FILE")"

# Fallback: try todo.sh list numbering if direct line lookup failed
if [[ -z "$LINE" ]] && [[ -n "${TODO_FULL_SH:-}" && -x "$TODO_FULL_SH" ]]; then
  LINE="$("$TODO_FULL_SH" -p list | awk -v n="$ITEM" '$1==n { $1=""; sub(/^ /,""); print }')"
fi

if [[ -z "$LINE" ]]; then
  echo "Error: Item $ITEM not found."
  exit 1
fi

urls=()

# Parse GitHub tokens: gh:owner/repo#123
for token in $(printf "%s\n" "$LINE" | grep -oE 'gh:[A-Za-z0-9._-]+/[A-Za-z0-9._-]+#[0-9]+' | sort -u); do
  if [[ "$token" =~ ^gh:([A-Za-z0-9._-]+)/([A-Za-z0-9._-]+)#([0-9]+)$ ]]; then
    owner="${BASH_REMATCH[1]}"
    repo="${BASH_REMATCH[2]}"
    issue="${BASH_REMATCH[3]}"
    urls+=("https://github.com/$owner/$repo/issues/$issue")
  fi
done

# Determine Jira base URL
JIRA_BASE="${JIRA_BASE_URL:-${OPEN_JIRA_BASE_URL:-}}"
if [[ -z "$JIRA_BASE" ]]; then
  if [[ -n "${TODO_DIR:-}" && -f "$TODO_DIR/.jira_base_url" ]]; then
    JIRA_BASE="$(head -n 1 "$TODO_DIR/.jira_base_url" | tr -d '[:space:]')"
  elif [[ -f "$HOME/.jira_base_url" ]]; then
    JIRA_BASE="$(head -n 1 "$HOME/.jira_base_url" | tr -d '[:space:]')"
  fi
fi

# Extract Jira tokens: jira:TICKET-123
JIRA_TOKENS="$(printf "%s\n" "$LINE" | grep -oE 'jira:[A-Za-z0-9._-]+-[0-9]+' | sort -u)"

# Prompt for Jira base if missing and interactive
if [[ -n "$JIRA_TOKENS" && -z "$JIRA_BASE" && -t 0 && -t 1 ]]; then
  printf "Enter Jira base (e.g., company.atlassian.net): "
  read -r JIRA_BASE
  if [[ -n "$JIRA_BASE" && -n "${TODO_DIR:-}" ]]; then
    printf "%s\n" "$JIRA_BASE" > "$TODO_DIR/.jira_base_url"
    echo "Saved Jira base to $TODO_DIR/.jira_base_url"
  fi
fi

# Normalize Jira base scheme
if [[ -n "$JIRA_BASE" ]]; then
  case "$JIRA_BASE" in
    http://*|https://*) ;;
    *) JIRA_BASE="https://$JIRA_BASE" ;;
  esac
fi

if [[ -n "$JIRA_TOKENS" && -z "$JIRA_BASE" ]]; then
  echo "Warning: Found Jira tokens but JIRA_BASE_URL is not configured."
  echo "Set JIRA_BASE_URL or create $TODO_DIR/.jira_base_url with your Jira hostname (e.g., company.atlassian.net)."
fi

# Build Jira URLs when base is available
if [[ -n "$JIRA_BASE" ]]; then
  for token in $JIRA_TOKENS; do
    if [[ "$token" =~ ^jira:([A-Za-z0-9._-]+-[0-9]+)$ ]]; then
      ticket="${BASH_REMATCH[1]}"
      urls+=("$JIRA_BASE/browse/$ticket")
    fi
  done
fi

# Open URLs or report none
if [[ ${#urls[@]} -eq 0 ]]; then
  echo "No supported links found in item $ITEM:"
  echo "$LINE"
  exit 2
fi

echo "Opening ${#urls[@]} link(s) from item $ITEM:"
for u in "${urls[@]}"; do
  echo " - $u"
done

open "${urls[@]}"
