#!/bin/bash
set -euo pipefail

# Colors
RED='\033[0;31m'
YELLOW='\033[0;33m'
GREEN='\033[0;32m'
NC='\033[0m'

# Defaults
SCRIPT_URL="https://repo.polymatica.ru/analytics/releases/sidecars/docker/install.sh"
RELEASES_URL="https://repo.polymatica.ru/analytics/releases/sidecars/docker/releases"
TARGET_DIR="/srv/polymatica/excel-addin"
COUNTDOWN=20
VERSION=""
LIST_VERSIONS=false
FORCE=false

usage() {
  cat <<EOF
Install Analytics Excel Add-in sidecar (Docker images + configs).

Usage: $(basename "$0") [OPTIONS]
Run from URL:
  bash <(curl -fsSL ${SCRIPT_URL}) [OPTIONS]

Options:
  -l, --list-versions     List available release versions and exit
  -v, --version VERSION   Install a specific version (default: latest)
  -d, --dir PATH          Target directory for configs (default: ${TARGET_DIR})
  -t, --timeout SECONDS   Countdown before starting services (default: ${COUNTDOWN})
  -y, --auto, --no-prompt Start services immediately without countdown
  -f, --force             Install even if docker-compose.yml already exists
  -h, --help              Show this help message
EOF
}

fetch_version_list() {
  wget -qO- "${RELEASES_URL}/" \
    | grep -oE 'href="[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/' \
    | sed 's/href="//;s/\/$//' \
    | sort -V
}

resolve_latest_version() {
  fetch_version_list | tail -n1
}

# Parse arguments
while [[ $# -gt 0 ]]; do
  case $1 in
    -l|--list-versions) LIST_VERSIONS=true; shift ;;
    -v|--version) VERSION="$2"; shift 2 ;;
    -d|--dir) TARGET_DIR="$2"; shift 2 ;;
    -t|--timeout) COUNTDOWN="$2"; shift 2 ;;
    -y|--auto|--no-prompt) COUNTDOWN=0; shift ;;
    -f|--force) FORCE=true; shift ;;
    -h|--help) usage; exit 0 ;;
    *) echo -e "${RED}Unknown option: $1${NC}"; usage; exit 1 ;;
  esac
done

# Check & install wget (multi-distro)
ensure_wget() {
  if command -v wget &>/dev/null; then
    return
  fi

  echo -e "${YELLOW}wget not found, installing...${NC}"

  if command -v apt &>/dev/null; then
    apt update -qq && apt install -qqy wget
  elif command -v apk &>/dev/null; then
    apk add --no-cache wget
  elif command -v yum &>/dev/null; then
    yum install -qy wget
  elif command -v dnf &>/dev/null; then
    dnf install -qy wget
  else
    echo -e "${RED}Cannot install wget: unsupported package manager${NC}"
    exit 127
  fi
}

ensure_wget

if [[ "$LIST_VERSIONS" == true ]]; then
  echo -e "${GREEN}Available versions:${NC}"
  fetch_version_list
  exit 0
fi

if [[ -z "$VERSION" ]]; then
  VERSION="$(resolve_latest_version)"
  if [[ -z "$VERSION" ]]; then
    echo -e "${RED}Error: no releases found at ${RELEASES_URL}/${NC}"
    exit 1
  fi
  echo -e "${GREEN}Latest version: ${VERSION}${NC}"
fi

ARCHIVE_NAME="analytics-exceladdin-${VERSION}.tar.gz"
RELEASE_URL="${RELEASES_URL}/${VERSION}"
ARCHIVE_URL="${RELEASE_URL}/${ARCHIVE_NAME}"
CHECKSUM_URL="${RELEASE_URL}/md5sum.txt"

# Check Docker
if ! command -v docker &>/dev/null; then
  echo -e "${RED}Error: Docker is not installed${NC}"
  echo -e "${YELLOW}Install Docker first. Run:${NC}"
  echo -e "wget -qO - get.docker.com | sh -"
  echo -e "${YELLOW}Or follow instructions: https://docs.docker.com/engine/install/${NC}"
  exit 127
fi

if ! docker info &>/dev/null; then
  echo -e "${RED}Error: Docker daemon is not running${NC}"
  echo -e "${YELLOW}Start Docker: systemctl start docker${NC}"
  exit 127
fi

if ! command -v md5sum &>/dev/null; then
  echo -e "${RED}Error: md5sum is not installed${NC}"
  exit 127
fi

if [[ -f "${TARGET_DIR}/docker-compose.yml" && "$FORCE" != true ]]; then
  echo -e "${RED}Error: docker-compose.yml already exists in ${TARGET_DIR}${NC}"
  echo -e "${YELLOW}Use --force to reinstall or choose another directory with --dir${NC}"
  exit 127
fi

if [[ -f "${TARGET_DIR}/docker-compose.yml" && "$FORCE" == true ]]; then
  echo -e "${YELLOW}Force mode: overwriting existing installation in ${TARGET_DIR}${NC}"
fi

WORK_DIR="$(mktemp -d)"
cleanup() {
  rm -rf "$WORK_DIR"
}
trap cleanup EXIT

echo -e "${YELLOW}Downloading release ${VERSION}...${NC}"
if ! wget -q --spider "${ARCHIVE_URL}" 2>/dev/null; then
  echo -e "${RED}Error: version ${VERSION} not found at ${RELEASE_URL}/${NC}"
  echo -e "${YELLOW}Use --list-versions to see available releases${NC}"
  exit 1
fi

wget -q --show-progress -O "${WORK_DIR}/md5sum.txt" "${CHECKSUM_URL}"
wget -q --show-progress -O "${WORK_DIR}/${ARCHIVE_NAME}" "${ARCHIVE_URL}"

echo -e "${YELLOW}Verifying md5sum...${NC}"
(
  cd "$WORK_DIR"
  if ! md5sum -c md5sum.txt; then
    echo -e "${RED}Error: checksum verification failed${NC}"
    exit 1
  fi
)

echo -e "${YELLOW}Extracting archive...${NC}"
EXTRACT_DIR="${WORK_DIR}/extract"
mkdir -p "$EXTRACT_DIR"
tar -xzf "${WORK_DIR}/${ARCHIVE_NAME}" -C "$EXTRACT_DIR"

if [[ ! -d "${EXTRACT_DIR}/configs" ]]; then
  echo -e "${RED}Error: configs/ not found in archive${NC}"
  exit 1
fi

if [[ ! -d "${EXTRACT_DIR}/images" ]]; then
  echo -e "${RED}Error: images/ not found in archive${NC}"
  exit 1
fi

echo -e "${YELLOW}Installing configs to ${TARGET_DIR}...${NC}"
mkdir -p "${TARGET_DIR}/nginx"
cp -a "${EXTRACT_DIR}/configs/." "${TARGET_DIR}/"

echo -e "${YELLOW}Loading Docker images...${NC}"
shopt -s nullglob
images=("${EXTRACT_DIR}/images/"*.tar.gz)
if [[ ${#images[@]} -eq 0 ]]; then
  echo -e "${RED}Error: no image archives found in images/${NC}"
  exit 1
fi

for image in "${images[@]}"; do
  echo -e "${YELLOW}Loading $(basename "$image")...${NC}"
  docker load -i "$image"
done
shopt -u nullglob

echo ""

if [[ $COUNTDOWN -gt 0 ]]; then
  echo -e "${GREEN}Docker services will start in ${COUNTDOWN} seconds${NC}"
  echo -e "${GREEN}Press Ctrl+C to cancel${NC}"
  sleep "$COUNTDOWN"
  echo -e "\n"
elif [[ $COUNTDOWN -eq 0 ]]; then
  echo -e "${GREEN}Auto mode: starting services${NC}"
fi

cd "${TARGET_DIR}"
(docker compose up -d --remove-orphans || docker-compose up -d --remove-orphans)

echo
echo
echo -e "${GREEN}Analytics Excel Add-in ${VERSION} installed in ${TARGET_DIR}${NC}"
