#!/bin/bash

# ============================================================
# Docker Workerman 3.5.24 one-shot installer
# Published by: helper.sh
# Script note: generated with Claude and curated by helper.sh
# ============================================================

set -euo pipefail

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

IMAGE="php:7.2-cli"
CONTAINER_NAME="workerman3524"
DATA_DIR="/data/workerman3.5.24"
APP_PORT="2345"

info()    { echo -e "${BLUE}[INFO]${NC}  $1"; }
success() { echo -e "${GREEN}[OK]${NC}    $1"; }
warning() { echo -e "${YELLOW}[WARN]${NC}  $1"; }
error()   { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }

usage() {
  cat <<'EOF'
Usage: install_workerman3524_base_docker.sh [options]

Options:
  --data-dir PATH           Host directory to mount (default: /data/workerman3.5.24)
  --container-name NAME     Docker container name (default: workerman3524)
  --port PORT               Host port mapped to Workerman app port (default: 2345)
  -h, --help                Show this help message
EOF
}

while [ $# -gt 0 ]; do
  case "$1" in
    --data-dir)
      DATA_DIR="$2"
      shift 2
      ;;
    --container-name)
      CONTAINER_NAME="$2"
      shift 2
      ;;
    --port)
      APP_PORT="$2"
      shift 2
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      error "Unknown argument: $1"
      ;;
  esac
done

if [ "${EUID}" -ne 0 ]; then
  error "Run this script with root privileges: sudo bash $0"
fi

if ! command -v docker >/dev/null 2>&1; then
  error "Docker is not installed. Install Docker first with helper.sh/install_docker_ubuntu_2404.sh"
fi

if ! systemctl is-active --quiet docker; then
  info "Docker service is not running. Starting Docker..."
  systemctl start docker
fi

mkdir -p "${DATA_DIR}/app" "${DATA_DIR}/logs"

if [ ! -f "${DATA_DIR}/app/start.php" ]; then
  info "Writing Workerman bootstrap file to ${DATA_DIR}/app/start.php"
  cat > "${DATA_DIR}/app/start.php" <<'EOF'
<?php
require __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

$worker = new Worker('http://0.0.0.0:2345');
$worker->count = 1;

$worker->onMessage = function($connection, $request) {
    $connection->send("Workerman 3.5.24 is running\n");
};

Worker::runAll();
EOF
fi

if [ ! -f "${DATA_DIR}/app/composer.json" ]; then
  info "Writing composer.json to ${DATA_DIR}/app/composer.json"
  cat > "${DATA_DIR}/app/composer.json" <<'EOF'
{
  "name": "helper-sh/workerman3524",
  "description": "Workerman 3.5.24 bootstrap generated by helper.sh",
  "require": {
    "workerman/workerman": "3.5.24"
  }
}
EOF
fi

if [ -f "${DATA_DIR}/Dockerfile" ]; then
  info "Refreshing managed Dockerfile at ${DATA_DIR}/Dockerfile"
else
  info "Writing Dockerfile to ${DATA_DIR}/Dockerfile"
fi
cat > "${DATA_DIR}/Dockerfile" <<'EOF'
FROM php:7.2-cli

# php:7.2-cli is based on Debian buster, which is now archived.
RUN printf 'deb http://archive.debian.org/debian buster main\n' > /etc/apt/sources.list \
  && printf 'Acquire::Check-Valid-Until "false";\nAcquire::AllowInsecureRepositories "true";\n' > /etc/apt/apt.conf.d/99archive \
  && apt-get update -o Acquire::Check-Valid-Until=false \
  && apt-get install -y --no-install-recommends git unzip ca-certificates \
  && docker-php-ext-install pcntl \
  && rm -rf /var/lib/apt/lists/*

COPY --from=composer:2.2 /usr/bin/composer /usr/local/bin/composer

WORKDIR /var/www/workerman

COPY app/composer.json /var/www/workerman/composer.json
RUN composer install --no-dev --prefer-dist --no-interaction

COPY app/ /var/www/workerman/

EXPOSE 2345

CMD ["php", "/var/www/workerman/start.php", "start"]
EOF

info "Building local image helper-workerman:3.5.24 ..."
docker build -t helper-workerman:3.5.24 "${DATA_DIR}"

if docker ps -a --format '{{.Names}}' | grep -Fx "${CONTAINER_NAME}" >/dev/null 2>&1; then
  warning "Container ${CONTAINER_NAME} already exists. Recreating it with the current mount layout."
  docker rm -f "${CONTAINER_NAME}" >/dev/null
fi

info "Starting ${CONTAINER_NAME} ..."
docker run -d \
  --name "${CONTAINER_NAME}" \
  --restart unless-stopped \
  -p "${APP_PORT}:2345" \
  -v "${DATA_DIR}/logs:/var/www/workerman/logs" \
  helper-workerman:3.5.24 >/dev/null

READY="0"
for _ in $(seq 1 20); do
  if command -v curl >/dev/null 2>&1 && curl -fsS --connect-timeout 3 --max-time 8 "http://127.0.0.1:${APP_PORT}/" >/dev/null 2>&1; then
    READY="1"
    break
  fi
  sleep 2
done

if [ "${READY}" = "1" ]; then
  success "Workerman health check passed"
else
  warning "Container started, but the local HTTP check is not responding yet. Check docker logs -f ${CONTAINER_NAME}"
fi

echo ""
echo -e "${GREEN}============================================================${NC}"
echo -e "${GREEN} Workerman 3.5.24 container deployment completed             ${NC}"
echo -e "${GREEN}============================================================${NC}"
echo ""
echo -e "  ${BLUE}Base image:${NC}       ${IMAGE}"
echo -e "  ${BLUE}Built image:${NC}      helper-workerman:3.5.24"
echo -e "  ${BLUE}Container:${NC}        ${CONTAINER_NAME}"
echo -e "  ${BLUE}App port:${NC}         ${APP_PORT}"
echo -e "  ${BLUE}Mounted data dir:${NC} ${DATA_DIR}"
echo ""
echo -e "  ${YELLOW}Editable host paths:${NC}"
echo -e "    ${DATA_DIR}/app/start.php"
echo -e "    ${DATA_DIR}/app/composer.json"
echo -e "    ${DATA_DIR}/Dockerfile"
echo -e "    ${DATA_DIR}/logs/"
echo ""
echo -e "  ${YELLOW}Useful commands:${NC}"
echo -e "    docker ps"
echo -e "    docker logs -f ${CONTAINER_NAME}"
echo -e "    curl http://127.0.0.1:${APP_PORT}/"
echo -e "    docker exec -it ${CONTAINER_NAME} php -v"
echo -e "    # Workerman runs in foreground inside the container, so do not add -d in start.php"
echo ""
