#!/bin/sh
set -euo pipefail

# #region docker.frontend.entrypoint [C:3] [TYPE Module] [SEMANTICS docker,nginx,entrypoint,certs,ssl]
# @BRIEF Entrypoint для nginx-контейнера — установка корп. CA-сертификатов в Alpine,
#   авто-выбор HTTP или SSL конфига в зависимости от наличия server.crt + server.key.
# @PRE /opt/certs смонтирован (может быть пуст). Системные пакеты: ca-certificates, openssl.
# @POST Если найдены server.crt + server.key — активирован SSL конфиг.
#   CA-сертификаты из /opt/certs установлены в системное хранилище Alpine.
# @SIDE_EFFECT Модифицирует /usr/local/share/ca-certificates/; перезаписывает nginx конфиг.
# @LAYER Infrastructure
# @RELATION DEPENDS_ON -> [docker/nginx.conf]
# @RELATION DEPENDS_ON -> [docker/nginx.ssl.conf]
# @INVARIANT Порт 80 всегда активен (HTTP или редирект на HTTPS).
# @INVARIANT Если нет server.crt — используется HTTP-only конфиг.
# #endregion docker.frontend.entrypoint

# ======================================================================
#  install_ca_certificates — корпоративные CA в Alpine
# ======================================================================
# #region docker.frontend.entrypoint.install_ca_certificates [C:2] [TYPE Function]
# @BRIEF Устанавливает .crt файлы из /opt/certs в системное хранилище Alpine.
# @PRE /opt/certs может быть пуст или не существовать.
# @POST Сертификаты скопированы в /usr/local/share/ca-certificates/ и добавлены в trust.
install_ca_certificates() {
  local certs_dir="${CERTS_PATH:-/opt/certs}"

  if [ ! -d "$certs_dir" ]; then
    echo "[entrypoint] CERTS_PATH=${certs_dir} не существует — пропускаем CA-сертификаты"
    return 0
  fi

  local count=0
  for cert in "$certs_dir"/*.crt "$certs_dir"/*.pem; do
    [ -f "$cert" ] || continue
    # Не копируем server.crt — он для nginx, не для CA
    case "$(basename "$cert")" in
      server.crt|server.key) continue ;;
    esac
    cp -v "$cert" /usr/local/share/ca-certificates/ 2>&1 | sed 's/^/[entrypoint]   /'
    count=$((count + 1))
  done

  if [ "$count" -gt 0 ]; then
    echo "[entrypoint] Обновляем CA-сертификаты Alpine..."
    update-ca-certificates 2>&1 | sed 's/^/[entrypoint]   /'
    echo "[entrypoint] ✅ Установлено ${count} корпоративных CA-сертификатов"
  else
    echo "[entrypoint] Нет CA-сертификатов для установки"
  fi
}
# #endregion docker.frontend.entrypoint.install_ca_certificates

# ======================================================================
#  select_nginx_config — выбор HTTP vs SSL
# ======================================================================
# #region docker.frontend.entrypoint.select_nginx_config [C:2] [TYPE Function]
# @BRIEF Определяет, есть ли сертификаты для SSL, и копирует нужный nginx конфиг.
# @PRE /opt/certs/server.crt и /opt/certs/server.key — опциональные SSL-сертификаты.
# @POST Если есть оба файла — /etc/nginx/ssl/ создан, server.crt/key скопированы,
#   используется nginx.ssl.conf. Иначе — nginx.conf (HTTP-only).
select_nginx_config() {
  local certs_dir="${CERTS_PATH:-/opt/certs}"
  local ssl_cert="${certs_dir}/server.crt"
  local ssl_key="${certs_dir}/server.key"
  local ssl_dir="/etc/nginx/ssl"

  if [ -f "$ssl_cert" ] && [ -f "$ssl_key" ]; then
    echo "[entrypoint] Найдены SSL-сертификаты — включаем HTTPS"

    mkdir -p "$ssl_dir"
    cp "$ssl_cert" "${ssl_dir}/server.crt"
    cp "$ssl_key"  "${ssl_dir}/server.key"

    # Копируем SSL-конфиг nginx
    cp /docker/nginx.ssl.conf /etc/nginx/conf.d/default.conf

    echo "[entrypoint] ✅ SSL терминация активирована на порту 443"
  else
    echo "[entrypoint] SSL-сертификаты не найдены — используем HTTP-only режим"
    echo "[entrypoint]   Чтобы включить HTTPS, положите в ${certs_dir}:"
    echo "[entrypoint]     server.crt — SSL сертификат"
    echo "[entrypoint]     server.key — приватный ключ"

    cp /docker/nginx.conf /etc/nginx/conf.d/default.conf
  fi
}
# #endregion docker.frontend.entrypoint.select_nginx_config

install_ca_certificates
select_nginx_config

echo "[entrypoint] Starting nginx..."
exec "$@"
