#!/bin/bash

# ============================================================
# Docker Redis 7.0.5 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="redis:7.0.5"
CONTAINER_NAME="redis705"
DATA_DIR="/data/redis7.0.5"
REDIS_PORT="6379"
REDIS_PASSWORD="${REDIS_PASSWORD:-}"

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_redis705_base_docker.sh [options]

Options:
  --data-dir PATH           Host directory to mount (default: /data/redis7.0.5)
  --container-name NAME     Docker container name (default: redis705)
  --port PORT               Host port mapped to Redis 6379 (default: 6379)
  --password PASS           Redis requirepass value
  -h, --help                Show this help message
EOF
}

generate_password() {
  if command -v openssl >/dev/null 2>&1; then
    openssl rand -base64 18 | tr -d '\n'
  else
    tr -dc 'A-Za-z0-9!@#%^+=' </dev/urandom | head -c 20
  fi
}

while [ $# -gt 0 ]; do
  case "$1" in
    --data-dir)
      DATA_DIR="$2"
      shift 2
      ;;
    --container-name)
      CONTAINER_NAME="$2"
      shift 2
      ;;
    --port)
      REDIS_PORT="$2"
      shift 2
      ;;
    --password)
      REDIS_PASSWORD="$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

if [ -z "${REDIS_PASSWORD}" ]; then
  REDIS_PASSWORD="$(generate_password)"
  info "No Redis password was provided. Generated a strong random password."
fi

mkdir -p "${DATA_DIR}/data" "${DATA_DIR}/conf"

if [ ! -f "${DATA_DIR}/conf/redis.conf" ]; then
  info "Writing baseline Redis config to ${DATA_DIR}/conf/redis.conf"
  cat > "${DATA_DIR}/conf/redis.conf" <<EOF
bind 0.0.0.0
port 6379
protected-mode yes
appendonly yes
dir /data
save 900 1
save 300 10
save 60 10000
requirepass ${REDIS_PASSWORD}
EOF
fi

info "Pulling ${IMAGE} ..."
docker pull "${IMAGE}"

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 "${REDIS_PORT}:6379" \
  -v "${DATA_DIR}/data:/data" \
  -v "${DATA_DIR}/conf/redis.conf:/usr/local/etc/redis/redis.conf:ro" \
  "${IMAGE}" redis-server /usr/local/etc/redis/redis.conf >/dev/null

REDIS_READY="0"
for _ in $(seq 1 20); do
  if docker exec "${CONTAINER_NAME}" redis-cli -a "${REDIS_PASSWORD}" ping >/dev/null 2>&1; then
    REDIS_READY="1"
    break
  fi
  sleep 2
done

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

echo ""
echo -e "${GREEN}============================================================${NC}"
echo -e "${GREEN} Redis 7.0.5 container deployment completed                  ${NC}"
echo -e "${GREEN}============================================================${NC}"
echo ""
echo -e "  ${BLUE}Image:${NC}            ${IMAGE}"
echo -e "  ${BLUE}Container:${NC}        ${CONTAINER_NAME}"
echo -e "  ${BLUE}Redis port:${NC}       ${REDIS_PORT}"
echo -e "  ${BLUE}Mounted data dir:${NC} ${DATA_DIR}"
echo -e "  ${BLUE}Redis password:${NC}   ${REDIS_PASSWORD}"
echo ""
echo -e "  ${YELLOW}Editable host paths:${NC}"
echo -e "    ${DATA_DIR}/data"
echo -e "    ${DATA_DIR}/conf/redis.conf"
echo ""
echo -e "  ${YELLOW}Useful commands:${NC}"
echo -e "    docker ps"
echo -e "    docker logs -f ${CONTAINER_NAME}"
echo -e "    docker exec -it ${CONTAINER_NAME} redis-cli -a '${REDIS_PASSWORD}' ping"
echo -e "    docker exec -it ${CONTAINER_NAME} redis-cli -a '${REDIS_PASSWORD}' info"
echo ""
