#!/bin/bash
# 35-ssl.sh — SSL: WILDCARD-сертификат Let's Encrypt через Cloudflare DNS-01.
# Полное управление: один cert на apex + *.<домен> покрывает ВСЕ региональные поддомены.
# Запускается ПОСЛЕ 30-files и ДО 40-configs (nginx -t требует наличия cert).
# Требует: токен Cloudflare в configs/cloudflare/cloudflare.ini (Zone:Read + Zone:DNS:Edit).
set -euo pipefail
cd "$(dirname "$0")"; source ./env.sh
need_root

[ -f "$CF_CREDS_SRC" ] || die "нет $CF_CREDS_SRC — нет Cloudflare-токена в пакете"

log "Установка Cloudflare creds → $CF_CREDS_DST (chmod 600)"
mkdir -p "$(dirname "$CF_CREDS_DST")"; chmod 700 "$(dirname "$CF_CREDS_DST")"
install -m 600 "$CF_CREDS_SRC" "$CF_CREDS_DST"
ok "creds на месте"

log "Восстановление /etc/letsencrypt из пакета (аккаунт + старый cert как мгновенный fallback)"
if [ -d "$CONFIGS/letsencrypt/accounts" ]; then
  mkdir -p /etc/letsencrypt
  rsync -a "$CONFIGS/letsencrypt/" /etc/letsencrypt/
  chown -R root:root /etc/letsencrypt
  chmod 700 /etc/letsencrypt/{archive,keys} 2>/dev/null || true
  ok "letsencrypt восстановлен (на всякий случай есть валидный cert до перевыпуска)"
else
  warn "в пакете нет старого letsencrypt — выпустим wildcard с нуля (нужен email/agree-tos)"
fi

log "Выпуск/замена на WILDCARD через Cloudflare DNS-01"
echo "  домены: $DOMAIN_PUNY  и  *.$DOMAIN_PUNY  (lineage: $SSL_CERT_NAME)"
set +e
certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials "$CF_CREDS_DST" \
  --dns-cloudflare-propagation-seconds 30 \
  --cert-name "$SSL_CERT_NAME" \
  "${SSL_DOMAINS[@]}" \
  --non-interactive --agree-tos -m "Mtkani39@yandex.ru" \
  --keep-until-expiring=false
RC=$?
set -e
LIVE="/etc/letsencrypt/live/$SSL_CERT_NAME"
if [ $RC -ne 0 ]; then
  warn "certbot вернул код $RC. Если выпуск не прошёл — проверь токен/DNS; nginx стартует на восстановленном cert."
fi

log "Проверка сертификата"
[ -f "$LIVE/fullchain.pem" ] || die "нет $LIVE/fullchain.pem — nginx ssl-vhost не стартует"
echo "  SAN в выпущенном cert:"
openssl x509 -in "$LIVE/cert.pem" -noout -text 2>/dev/null | grep -A1 "Subject Alternative Name" | tail -1 | tr ',' '\n' | sed 's/^/    /'
if openssl x509 -in "$LIVE/cert.pem" -noout -text 2>/dev/null | grep -q "DNS:\*\.$DOMAIN_PUNY"; then
  ok "WILDCARD на месте (*.$DOMAIN_PUNY) — покрывает все региональные поддомены"
else
  warn "wildcard SAN не вижу — возможно, активен старый fallback-cert. Перевыпусти: см. низ файла."
fi

cat <<EOF

  Автопродление: 'certbot renew' (cron ставится в 90-services.sh) теперь идёт через
  dns-cloudflare автоматически (метод записан в /etc/letsencrypt/renewal/$SSL_CERT_NAME.conf).
  Ручной перевыпуск при необходимости:
    certbot certonly --dns-cloudflare --dns-cloudflare-credentials $CF_CREDS_DST \\
      --dns-cloudflare-propagation-seconds 30 --cert-name $SSL_CERT_NAME \\
      -d $DOMAIN_PUNY -d '*.$DOMAIN_PUNY' --force-renewal
  Проверка продления: certbot renew --dry-run
EOF
ok "Дальше: 40-configs.sh"
