#!/usr/bin/env bash
# Shared helpers for BW plugin tooling.
# Source this from other scripts via: source "$(dirname "$0")/lib/common.sh"

set -euo pipefail

BW_REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BW_PLUGINS_DIR="${BW_REPO_ROOT}/wp-content/plugins"
BW_DIST_PROJECT_DIR="/srv/apps/bw-plugins-dist"
BW_DIST_UPDATES_DIR="${BW_DIST_PROJECT_DIR}/wp-content/uploads/plugin-updates"
BW_DIST_UPDATE_URL="https://plugins.bowden.works/wp-json/bw/v1/update-check"
BW_DIST_DOWNLOAD_BASE="https://plugins.bowden.works/wp-content/uploads/plugin-updates"
BW_RELEASES_DIR="${BW_REPO_ROOT}/.releases"
BW_RELEASE_HISTORY="${BW_REPO_ROOT}/tools/release-history.json"

RED=$'\033[0;31m'
GREEN=$'\033[0;32m'
YELLOW=$'\033[0;33m'
BLUE=$'\033[0;34m'
BOLD=$'\033[1m'
RESET=$'\033[0m'

log_info()  { printf '%s[INFO]%s  %s\n'  "$BLUE"  "$RESET" "$*"; }
log_ok()    { printf '%s[OK]%s    %s\n'  "$GREEN" "$RESET" "$*"; }
log_warn()  { printf '%s[WARN]%s  %s\n'  "$YELLOW" "$RESET" "$*" >&2; }
log_error() { printf '%s[ERROR]%s %s\n'  "$RED"   "$RESET" "$*" >&2; }
die() { log_error "$*"; exit 1; }

require_rian() {
	if [[ "${USER:-$(id -un)}" != "rian" ]]; then
		die "This command must be run as 'rian' (current user: ${USER:-unknown})"
	fi
}

require_slug() {
	local slug="$1"
	[[ -n "$slug" ]] || die "Plugin slug required"
	[[ "$slug" =~ ^bw-[a-z0-9-]+$ ]] || die "Invalid slug '$slug' (must match bw-[a-z0-9-]+)"
	[[ -d "${BW_PLUGINS_DIR}/${slug}" ]] || die "Plugin directory not found: ${BW_PLUGINS_DIR}/${slug}"
	[[ -f "${BW_PLUGINS_DIR}/${slug}/${slug}.php" ]] || die "Plugin main file not found: ${slug}.php"
}

# Extract the Version: field from a plugin's main file header.
plugin_header_version() {
	local slug="$1"
	local main="${BW_PLUGINS_DIR}/${slug}/${slug}.php"
	grep -m1 -E '^\s*\*\s*Version:' "$main" | sed -E 's/^.*Version:[[:space:]]*([0-9A-Za-z.+-]+).*/\1/'
}

# Extract a single-line header field by name (e.g. "Plugin Name", "Description").
plugin_header_field() {
	local slug="$1" field="$2"
	local main="${BW_PLUGINS_DIR}/${slug}/${slug}.php"
	grep -m1 -E "^\s*\*\s*${field}:" "$main" | sed -E "s/^.*${field}:\s*(.*)$/\1/" | sed -E 's/\s+$//'
}

# Convert bw-foo-bar → bw_foo_bar
slug_to_underscore() { echo "$1" | tr '-' '_'; }

# Convert bw-foo-bar → BW_FOO_BAR
slug_to_upper_underscore() { echo "$1" | tr '-' '_' | tr '[:lower:]' '[:upper:]'; }

# Run wp-cli against the bw-plugins dev site via docker sidecar.
bw_wp() {
	docker run --rm \
		--volumes-from bw-plugins-wordpress \
		--network container:bw-plugins-wordpress \
		-e WORDPRESS_DB_HOST="$(grep ^DB_HOST /srv/apps/bw-plugins/.env | cut -d= -f2):$(grep ^DB_PORT /srv/apps/bw-plugins/.env | cut -d= -f2)" \
		-e WORDPRESS_DB_USER="$(grep ^DB_USER /srv/apps/bw-plugins/.env | cut -d= -f2)" \
		-e WORDPRESS_DB_PASSWORD="$(grep ^DB_PASSWORD /srv/apps/bw-plugins/.env | cut -d= -f2)" \
		-e WORDPRESS_DB_NAME="$(grep ^DB_NAME /srv/apps/bw-plugins/.env | cut -d= -f2)" \
		wordpress:cli --path=/var/www/html "$@"
}

# Run wp-cli against the bw-plugins-dist site.
bw_wp_dist() {
	local envf="${BW_DIST_PROJECT_DIR}/.env"
	docker run --rm \
		--volumes-from bw-plugins-dist-wordpress \
		--network container:bw-plugins-dist-wordpress \
		-e WORDPRESS_DB_HOST="172.17.0.1:3306" \
		-e WORDPRESS_DB_USER="$(grep ^DB_USER "$envf" | cut -d= -f2)" \
		-e WORDPRESS_DB_PASSWORD="$(grep ^DB_PASSWORD "$envf" | cut -d= -f2)" \
		-e WORDPRESS_DB_NAME="$(grep ^DB_NAME "$envf" | cut -d= -f2)" \
		wordpress:cli --path=/var/www/html "$@"
}

# Compute SHA-256 of a file.
sha256_of() { sha256sum "$1" | awk '{print $1}'; }

# Check semver A > B (returns 0 if true).
semver_gt() {
	[ "$1" = "$2" ] && return 1
	printf '%s\n%s\n' "$2" "$1" | sort -V -C 2>/dev/null && return 0 || return 1
}
