#!/usr/bin/env bash
# -----------------------------------------------------------------------------
# Tx OS — one-shot launcher for Docker on macOS / Linux.
# Usage:
#   ./start.sh            # build (if needed) and start in the background
#   ./start.sh logs       # tail container logs
#   ./start.sh stop       # stop containers (data is preserved)
#   ./start.sh down       # stop AND remove containers (data still preserved)
#   ./start.sh reset      # DANGEROUS: also wipe database + uploaded files
#   ./start.sh rebuild    # force rebuild images then start
# -----------------------------------------------------------------------------
set -euo pipefail

cd "$(dirname "$0")"

if ! command -v docker >/dev/null 2>&1; then
  echo "Docker not found. Install Docker Desktop from https://www.docker.com/products/docker-desktop/"
  exit 1
fi

if ! docker compose version >/dev/null 2>&1; then
  echo "Docker Compose v2 not found. Update Docker Desktop."
  exit 1
fi

if [ ! -f .env ]; then
  echo "No .env file found. Creating one from .env.docker.example ..."
  cp .env.docker.example .env
  if command -v openssl >/dev/null 2>&1; then
    SECRET="$(openssl rand -hex 32)"
    PG_PW="$(openssl rand -hex 16)"
    ADMIN_PW="$(openssl rand -base64 18 | tr -d '/+=' | cut -c1-20)"
    USER_PW="$(openssl rand -base64 18 | tr -d '/+=' | cut -c1-20)"
    if [[ "$OSTYPE" == "darwin"* ]]; then
      SED_I=(sed -i '')
    else
      SED_I=(sed -i)
    fi
    "${SED_I[@]}" "s|^SESSION_SECRET=.*|SESSION_SECRET=${SECRET}|" .env
    "${SED_I[@]}" "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=${PG_PW}|" .env
    "${SED_I[@]}" "s|^SEED_ADMIN_PASSWORD=.*|SEED_ADMIN_PASSWORD=${ADMIN_PW}|" .env
    "${SED_I[@]}" "s|^SEED_USER_PASSWORD=.*|SEED_USER_PASSWORD=${USER_PW}|" .env
    echo
    echo "================================================================"
    echo "  Generated initial credentials (also saved in .env)"
    echo "----------------------------------------------------------------"
    echo "  Admin login:   admin / ${ADMIN_PW}"
    echo "  User login:    ahmed / ${USER_PW}"
    echo "================================================================"
    echo "  IMPORTANT: write these down NOW — you can change them later"
    echo "  from the admin panel, but recovery from a lost admin password"
    echo "  requires direct database access."
    echo "================================================================"
    echo
  else
    echo "openssl not available — please open .env and set SESSION_SECRET, POSTGRES_PASSWORD, SEED_ADMIN_PASSWORD and SEED_USER_PASSWORD before running again."
    exit 1
  fi
fi

action="${1:-up}"

case "$action" in
  up)
    echo "==> Building images (first time can take 5-10 minutes) ..."
    docker compose build
    echo "==> Starting containers ..."
    docker compose up -d
    APP_PORT="$(grep -E '^APP_PORT=' .env | cut -d= -f2 | tr -d '\r' || echo 3000)"
    echo
    echo "Tx OS is starting. Open http://localhost:${APP_PORT:-3000}"
    echo "Tail logs with:  ./start.sh logs"
    ;;
  rebuild)
    docker compose build --no-cache
    docker compose up -d
    ;;
  logs)
    docker compose logs -f --tail=200
    ;;
  stop)
    docker compose stop
    ;;
  down)
    docker compose down
    ;;
  reset)
    read -r -p "This will DELETE the database and uploaded files. Type 'yes' to confirm: " ans
    if [ "$ans" = "yes" ]; then
      docker compose down -v
      echo "All data wiped."
    else
      echo "Aborted."
    fi
    ;;
  *)
    echo "Unknown action: $action"
    echo "Usage: ./start.sh [up|rebuild|logs|stop|down|reset]"
    exit 1
    ;;
esac
