#!/bin/bash
set -e
set -o pipefail

SECRET_KEY=$(head -c 32 /dev/urandom | base64)
NETWORK_NAME=medicine-network
GLOBAL_ENV_FILE="/medicine-config/.env"
ENV_FILE="/medicine-config/medicine/.env"
POSTGRES_CONTAINER=service-postgres
POSTGRES_USER=postgres
DB_NAME=medicine

ORGANIZATION_NAME="$1"
ORGANIZATION_ID="$2"
HTTP_PORT="$3"
HTTPS_PORT="$4"

set_global_env_var () {
  local key="$1"
  local value="$2"

  if grep -qE "^${key}=" "$GLOBAL_ENV_FILE"; then
    sed -i "s|^${key}=.*|${key}=${value}|" "$GLOBAL_ENV_FILE"
  else
    echo "${key}=${value}" >> "$GLOBAL_ENV_FILE"
  fi
}

set_env_var () {
  local key="$1"
  local value="$2"

  if grep -qE "^${key}=" "$ENV_FILE"; then
    sed -i "s|^${key}=.*|${key}=${value}|" "$ENV_FILE"
  else
    echo "${key}=${value}" >> "$ENV_FILE"
  fi
}

unset_env_var () {
  local key="$1"

  if grep -qE "^${key}=" "$ENV_FILE"; then
    sed -i "/^${key}=/d" "$ENV_FILE"
  fi
}

if [[ -z "$ORGANIZATION_NAME" || -z "$ORGANIZATION_ID" ]]; then
  echo "❌ Ошибка: оба параметра обязательны"
  exit 1
fi

echo "Название организации: $ORGANIZATION_NAME"
echo "Идентификатор организации: $ORGANIZATION_ID"
echo "HTTP порт: $HTTP_PORT"
echo "HTTPS порт: $HTTPS_PORT"
echo ""

if [ -z $(docker network ls --filter name=^${NETWORK_NAME}$ --format="{{ .Name }}") ] ; then
  docker network create ${NETWORK_NAME} ;
  echo "🌐 Сеть $NETWORK_NAME создана"
else
  echo "🌐 Сеть $NETWORK_NAME уже существует"
fi

echo ""
echo "📁 Создаем файлы окружения"
touch "$ENV_FILE"
touch "$GLOBAL_ENV_FILE"

set_global_env_var "ORGANIZATION_ID" "$ORGANIZATION_ID"
set_global_env_var "ORGANIZATION_NAME" "$ORGANIZATION_NAME"
set_global_env_var "POSTGRES_USER" "$POSTGRES_USER"
set_global_env_var "POSTGRES_HOST" "$POSTGRES_CONTAINER"
set_global_env_var "REDIS_HOST" "service-redis"

set_env_var "SECRET_KEY" "$SECRET_KEY"

if [ -n "$HTTP_PORT" ] && [ "$HTTP_PORT" != "80" ]; then
  set_env_var "NGINX_HTTP_PORT" "$HTTP_PORT"
else
  unset_env_var "NGINX_HTTP_PORT"
fi

if [ -n "$HTTPS_PORT" ] && [ "$HTTPS_PORT" != "443" ]; then
  set_env_var "NGINX_HTTPS_PORT" "$HTTPS_PORT"
else
  unset_env_var "NGINX_HTTPS_PORT"
fi

echo ""
echo "📦 Запускаем контейнер postgres"
(cd /medicine-config/service-postgres && docker compose pull -q && docker compose up -d)

echo ""
echo "📦 Запускаем контейнер redis"
(cd /medicine-config/service-redis && docker compose pull -q && docker compose up -d)

echo ""
if docker exec "$POSTGRES_CONTAINER" psql -U "$POSTGRES_USER" -tAc \
  "SELECT 1 FROM pg_database WHERE datname='$DB_NAME'" | grep -q 1; then
  echo "✅ База данных уже существует: $DB_NAME"
else
  echo "➕ База данных не найдена, создаём: $DB_NAME"
  docker exec "$POSTGRES_CONTAINER" createdb -U "$POSTGRES_USER" "$DB_NAME"
  echo "✅ База данных создана: $DB_NAME"
fi

TABLES_COUNT=$(docker exec "$POSTGRES_CONTAINER" psql -U "$POSTGRES_USER" -d "$DB_NAME" -tAc \
  "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public';")

echo ""
if [ "$TABLES_COUNT" -gt 0 ]; then
  echo "⚠️ Восстановление БД пропущено - в базе уже есть таблицы ($TABLES_COUNT)"
else
  echo "📥 Восстанавливаем БД из бэкапа"

  unzip -o /medicine-config/backups/medicine.sql.zip -d /tmp
  docker cp /tmp/medicine.sql "$POSTGRES_CONTAINER:/tmp/medicine.sql"
  docker exec -i "$POSTGRES_CONTAINER" psql -U "$POSTGRES_USER" -d "$DB_NAME" -q --set ON_ERROR_STOP=on -f /tmp/medicine.sql

  echo "✅ Восстановление завершено"
fi

echo ""
echo "Скачиваем образ"
docker pull docker.med-logic.ru/medicine:latest -q
docker tag docker.med-logic.ru/medicine:latest medicine:latest

echo ""
echo "Запускаем систему"
(cd /medicine-config/medicine && docker compose up -d)

echo ""
echo "🎉 МИС \"Медицина\" успешно установлена"
