#!/bin/bash

if [ -f "appflowy.env" ]; then
  set -a
  source appflowy.env
  set +a
else
  echo "cannot find appflowy.env"
  exit 1
fi

images=(
  "appflowyinc/appflowy_web:latest"
  "appflowyinc/appflowy_worker:latest"
  "appflowyinc/appflowy_ai:latest"
  "appflowyinc/admin_frontend:latest"
  "appflowyinc/appflowy_cloud:latest"
  "appflowyinc/gotrue:latest"
  "redis" # 等价于 redis:latest
  "pgvector/pgvector:pg16"
  "minio/minio:latest"
)

CONTAINERS=(
  frpc
  minio
  postgres
  redis
  appflowy_gotrue
  appflowy_cloud
  appflowy_admin_frontend
  appflowy_ai
  appflowy_worker
  appflowy_web
)

# for image in "${images[@]}"; do
#     echo -e "\n\033[34m pulling image: ${image}\033[0m"
#     if docker pull "${image}"; then
#         echo -e "\033[32m pull successed: ${image}\033[0m"
#     else
#         echo -e "\033[31m pull failed: ${image}\033[0m" >&2
#     fi
# done

# echo -e "\n\033[36m all images pull finished \033[0m"

function stop_containers() {
  for container in "${CONTAINERS[@]}"; do
    if docker ps -a --format '{{.Names}}' | grep -q "^${container}\$"; then
      echo "delete $container"
      docker rm --force "$container" 2>/dev/null && echo "$container delete successed" || echo "$container delete failed"
    else
      echo "$container not existed"
    fi
  done
}

function start_containers() {
  stop_containers
  docker run --restart=always --network host -d --name frpc \
    -e TZ="Asia/Shanghai" \
    -v /mnt/user/appdata/frpc/frpc.toml:/etc/frp/frpc.toml \
    -v /mnt/user/appdata/frpc:/app \
    registry.cn-shenzhen.aliyuncs.com/amass_toolset/frpc:0.61.2

  docker run -d --name minio --restart=on-failure \
    -p 9000:9000 \
    -p 9001:9001 \
    -e MINIO_BROWSER_REDIRECT_URL="${APPFLOWY_BASE_URL}/minio" \
    -e MINIO_ROOT_USER="${APPFLOWY_S3_ACCESS_KEY}" \
    -e MINIO_ROOT_PASSWORD="${APPFLOWY_S3_SECRET_KEY}" \
    -v /mnt/user/appdata/minio:/data \
    minio/minio:latest server /data --console-address ":9001"

  docker run -d --name postgres --restart=on-failure \
    -p 5432:5432 \
    -e POSTGRES_USER=${POSTGRES_USER} \
    -e POSTGRES_DB=${POSTGRES_DB} \
    -e POSTGRES_PASSWORD=${POSTGRES_PASSWORD} \
    -e POSTGRES_HOST=${POSTGRES_HOST} \
    -e SUPABASE_PASSWORD=${SUPABASE_PASSWORD} \
    -v /mnt/user/appdata/postgres/migrations/before:/docker-entrypoint-initdb.d \
    -v /mnt/user/appdata/postgres/data:/var/lib/postgresql/data \
    pgvector/pgvector:pg16

  docker run -d --name redis --restart=on-failure -p 6379:6379 redis

  docker run -d --name appflowy_gotrue --restart=on-failure \
    -p 9999:9999 \
    -e GOTRUE_ADMIN_EMAIL=${GOTRUE_ADMIN_EMAIL} \
    -e GOTRUE_ADMIN_PASSWORD=${GOTRUE_ADMIN_PASSWORD} \
    -e GOTRUE_DISABLE_SIGNUP=${GOTRUE_DISABLE_SIGNUP} \
    -e GOTRUE_SITE_URL='appflowy-flutter://' \
    -e GOTRUE_URI_ALLOW_LIST='**' \
    -e GOTRUE_JWT_SECRET=${GOTRUE_JWT_SECRET} \
    -e GOTRUE_JWT_EXP=${GOTRUE_JWT_EXP} \
    -e GOTRUE_JWT_ADMIN_GROUP_NAME=supabase_admin \
    -e GOTRUE_DB_DRIVER=postgres \
    -e API_EXTERNAL_URL=${API_EXTERNAL_URL} \
    -e DATABASE_URL=${GOTRUE_DATABASE_URL} \
    -e PORT=9999 \
    -e GOTRUE_SMTP_HOST=${GOTRUE_SMTP_HOST} \
    -e GOTRUE_SMTP_PORT=${GOTRUE_SMTP_PORT} \
    -e GOTRUE_SMTP_USER=${GOTRUE_SMTP_USER} \
    -e GOTRUE_SMTP_PASS=${GOTRUE_SMTP_PASS} \
    -e GOTRUE_MAILER_URLPATHS_CONFIRMATION='/gotrue/verify' \
    -e GOTRUE_MAILER_URLPATHS_INVITE='/gotrue/verify' \
    -e GOTRUE_MAILER_URLPATHS_RECOVERY='/gotrue/verify' \
    -e GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE='/gotrue/verify' \
    -e GOTRUE_SMTP_ADMIN_EMAIL=${GOTRUE_SMTP_ADMIN_EMAIL} \
    -e GOTRUE_SMTP_MAX_FREQUENCY=${GOTRUE_SMTP_MAX_FREQUENCY:-1ns} \
    -e GOTRUE_RATE_LIMIT_EMAIL_SENT=${GOTRUE_RATE_LIMIT_EMAIL_SENT:-100} \
    -e GOTRUE_MAILER_AUTOCONFIRM=${GOTRUE_MAILER_AUTOCONFIRM:-false} \
    -e GOTRUE_EXTERNAL_GOOGLE_ENABLED=${GOTRUE_EXTERNAL_GOOGLE_ENABLED} \
    -e GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID=${GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID} \
    -e GOTRUE_EXTERNAL_GOOGLE_SECRET=${GOTRUE_EXTERNAL_GOOGLE_SECRET} \
    -e GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI=${GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI} \
    -e GOTRUE_EXTERNAL_GITHUB_ENABLED=${GOTRUE_EXTERNAL_GITHUB_ENABLED} \
    -e GOTRUE_EXTERNAL_GITHUB_CLIENT_ID=${GOTRUE_EXTERNAL_GITHUB_CLIENT_ID} \
    -e GOTRUE_EXTERNAL_GITHUB_SECRET=${GOTRUE_EXTERNAL_GITHUB_SECRET} \
    -e GOTRUE_EXTERNAL_GITHUB_REDIRECT_URI=${GOTRUE_EXTERNAL_GITHUB_REDIRECT_URI} \
    -e GOTRUE_EXTERNAL_DISCORD_ENABLED=${GOTRUE_EXTERNAL_DISCORD_ENABLED} \
    -e GOTRUE_EXTERNAL_DISCORD_CLIENT_ID=${GOTRUE_EXTERNAL_DISCORD_CLIENT_ID} \
    -e GOTRUE_EXTERNAL_DISCORD_SECRET=${GOTRUE_EXTERNAL_DISCORD_SECRET} \
    -e GOTRUE_EXTERNAL_DISCORD_REDIRECT_URI=${GOTRUE_EXTERNAL_DISCORD_REDIRECT_URI} \
    appflowyinc/gotrue:latest

  docker run -d --name appflowy_cloud --restart=on-failure \
    -p 8000:8000 \
    -e RUST_LOG=${RUST_LOG:-info} \
    -e APPFLOWY_ENVIRONMENT=production \
    -e APPFLOWY_DATABASE_URL=${APPFLOWY_DATABASE_URL} \
    -e APPFLOWY_REDIS_URI=${APPFLOWY_REDIS_URI} \
    -e APPFLOWY_GOTRUE_JWT_SECRET=${GOTRUE_JWT_SECRET} \
    -e APPFLOWY_GOTRUE_JWT_EXP=${GOTRUE_JWT_EXP} \
    -e APPFLOWY_GOTRUE_BASE_URL=${APPFLOWY_GOTRUE_BASE_URL} \
    -e APPFLOWY_GOTRUE_EXT_URL=${API_EXTERNAL_URL} \
    -e APPFLOWY_GOTRUE_ADMIN_EMAIL=${GOTRUE_ADMIN_EMAIL} \
    -e APPFLOWY_GOTRUE_ADMIN_PASSWORD=${GOTRUE_ADMIN_PASSWORD} \
    -e APPFLOWY_S3_CREATE_BUCKET=${APPFLOWY_S3_CREATE_BUCKET} \
    -e APPFLOWY_S3_USE_MINIO=${APPFLOWY_S3_USE_MINIO} \
    -e APPFLOWY_S3_MINIO_URL=${APPFLOWY_S3_MINIO_URL} \
    -e APPFLOWY_S3_ACCESS_KEY=${APPFLOWY_S3_ACCESS_KEY} \
    -e APPFLOWY_S3_SECRET_KEY=${APPFLOWY_S3_SECRET_KEY} \
    -e APPFLOWY_S3_BUCKET=${APPFLOWY_S3_BUCKET} \
    -e APPFLOWY_S3_REGION=${APPFLOWY_S3_REGION} \
    -e APPFLOWY_S3_PRESIGNED_URL_ENDPOINT=${APPFLOWY_S3_PRESIGNED_URL_ENDPOINT} \
    -e APPFLOWY_MAILER_SMTP_HOST=${APPFLOWY_MAILER_SMTP_HOST} \
    -e APPFLOWY_MAILER_SMTP_PORT=${APPFLOWY_MAILER_SMTP_PORT} \
    -e APPFLOWY_MAILER_SMTP_USERNAME=${APPFLOWY_MAILER_SMTP_USERNAME} \
    -e APPFLOWY_MAILER_SMTP_EMAIL=${APPFLOWY_MAILER_SMTP_EMAIL} \
    -e APPFLOWY_MAILER_SMTP_PASSWORD=${APPFLOWY_MAILER_SMTP_PASSWORD} \
    -e APPFLOWY_MAILER_SMTP_TLS_KIND=${APPFLOWY_MAILER_SMTP_TLS_KIND} \
    -e APPFLOWY_ACCESS_CONTROL=${APPFLOWY_ACCESS_CONTROL} \
    -e APPFLOWY_DATABASE_MAX_CONNECTIONS=${APPFLOWY_DATABASE_MAX_CONNECTIONS} \
    -e AI_SERVER_HOST=${AI_SERVER_HOST} \
    -e AI_SERVER_PORT=${AI_SERVER_PORT} \
    -e AI_OPENAI_API_KEY=${AI_OPENAI_API_KEY} \
    -e APPFLOWY_ADMIN_FRONTEND_PATH_PREFIX=${ADMIN_FRONTEND_PATH_PREFIX} \
    -e APPFLOWY_WEB_URL=${APPFLOWY_WEB_URL} \
    appflowyinc/appflowy_cloud:latest

  docker run -d --name appflowy_admin_frontend \
    --restart on-failure \
    -p 3001:3000 \
    -e RUST_LOG=${RUST_LOG:-info} \
    -e ADMIN_FRONTEND_REDIS_URL=${ADMIN_FRONTEND_REDIS_URL} \
    -e ADMIN_FRONTEND_GOTRUE_URL=${ADMIN_FRONTEND_GOTRUE_URL} \
    -e ADMIN_FRONTEND_APPFLOWY_CLOUD_URL=${ADMIN_FRONTEND_APPFLOWY_CLOUD_URL} \
    -e ADMIN_FRONTEND_PATH_PREFIX=${ADMIN_FRONTEND_PATH_PREFIX:-} \
    appflowyinc/admin_frontend:latest

  docker run -d --name appflowy_ai \
    --restart on-failure \
    -p 5001:5001 \
    -e OPENAI_API_KEY=${AI_OPENAI_API_KEY} \
    -e APPFLOWY_AI_SERVER_PORT=${AI_SERVER_PORT} \
    -e APPFLOWY_AI_DATABASE_URL=${AI_DATABASE_URL} \
    -e APPFLOWY_AI_REDIS_URL=${AI_REDIS_URL} \
    appflowyinc/appflowy_ai:latest

  docker run -d --name appflowy_worker \
    --restart on-failure \
    -e RUST_LOG=${RUST_LOG:-info} \
    -e APPFLOWY_ENVIRONMENT=production \
    -e APPFLOWY_WORKER_REDIS_URL=${APPFLOWY_WORKER_REDIS_URL} \
    -e APPFLOWY_WORKER_ENVIRONMENT=production \
    -e APPFLOWY_WORKER_DATABASE_URL=${APPFLOWY_WORKER_DATABASE_URL} \
    -e APPFLOWY_WORKER_DATABASE_NAME=${APPFLOWY_WORKER_DATABASE_NAME} \
    -e APPFLOWY_WORKER_IMPORT_TICK_INTERVAL=30 \
    -e APPFLOWY_S3_USE_MINIO=${APPFLOWY_S3_USE_MINIO} \
    -e APPFLOWY_S3_MINIO_URL=${APPFLOWY_S3_MINIO_URL} \
    -e APPFLOWY_S3_ACCESS_KEY=${APPFLOWY_S3_ACCESS_KEY} \
    -e APPFLOWY_S3_SECRET_KEY=${APPFLOWY_S3_SECRET_KEY} \
    -e APPFLOWY_S3_BUCKET=${APPFLOWY_S3_BUCKET} \
    -e APPFLOWY_S3_REGION=${APPFLOWY_S3_REGION} \
    -e APPFLOWY_MAILER_SMTP_HOST=${APPFLOWY_MAILER_SMTP_HOST} \
    -e APPFLOWY_MAILER_SMTP_PORT=${APPFLOWY_MAILER_SMTP_PORT} \
    -e APPFLOWY_MAILER_SMTP_USERNAME=${APPFLOWY_MAILER_SMTP_USERNAME} \
    -e APPFLOWY_MAILER_SMTP_EMAIL=${APPFLOWY_MAILER_SMTP_EMAIL} \
    -e APPFLOWY_MAILER_SMTP_PASSWORD=${APPFLOWY_MAILER_SMTP_PASSWORD} \
    -e APPFLOWY_MAILER_SMTP_TLS_KIND=${APPFLOWY_MAILER_SMTP_TLS_KIND} \
    appflowyinc/appflowy_worker:latest

  docker run -d --name appflowy_web \
    --restart on-failure \
    -p 8090:80 \
    -e AF_BASE_URL="${APPFLOWY_BASE_URL}" \
    -e AF_GOTRUE_URL="${API_EXTERNAL_URL}" \
    appflowyinc/appflowy_web:latest
}

function main() {
  local cmd=$1
  shift 1
  case $cmd in
  stop)
    stop_containers
    ;;
  *)
    start_containers
    ;;
  esac
}

main $@