#!/bin/bash
# ========== generate_certs.sh ==========
# Получение SSL-сертификатов для основных доменов и настройка systemd-таймера
# для автоматического обновления каждые 30 дней.

# ---------- ЛОГИРОВАНИЕ ----------
log_info() { echo "ℹ️  [INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"; }
log_success() { echo "✅ [SUCCESS] $(date '+%Y-%m-%d %H:%M:%S') - $1"; }
log_error() { echo "❌ [ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2; }
log_step() { echo ""; echo "📋 [STEP] $(date '+%Y-%m-%d %H:%M:%S') - $1"; echo "=================================================="; }

# ---------- ПРОВЕРКА ROOT ----------
if [[ $EUID -ne 0 ]]; then
    log_error "Модуль generate_certs.sh должен запускаться с правами root"
    exit 1
fi

# ---------- ПРОВЕРКА ПЕРЕМЕННОЙ ЛОКАЦИИ ----------
if [[ -z "$LOCATION" ]]; then
    log_error "Переменная LOCATION не установлена. Запустите главный скрипт и введите локацию."
    exit 1
fi

# ---------- ПОДГОТОВКА КАТАЛОГА ----------
CERT_DIR="/opt/cert"
mkdir -p "$CERT_DIR"
log_success "Каталог $CERT_DIR создан/проверен"

# ---------- УСТАНОВКА ACME.SH ----------
ACME_SH="$HOME/.acme.sh/acme.sh"
if [[ ! -f "$ACME_SH" ]]; then
    log_step "Установка acme.sh с email root@8rmdgz.ru"
    curl https://get.acme.sh | sh -s email=root@8rmdgz.ru
    if [[ $? -eq 0 ]]; then
        log_success "acme.sh успешно установлен"
    else
        log_error "Ошибка при установке acme.sh"
        exit 1
    fi
else
    log_info "acme.sh уже установлен в $ACME_SH"
fi

# ---------- ПЕРЕКЛЮЧЕНИЕ НА LET'S ENCRYPT ----------
log_step "Переключение CA на Let's Encrypt"
"$ACME_SH" --set-default-ca --server letsencrypt
if [[ $? -eq 0 ]]; then
    log_success "CA изменён на Let's Encrypt"
else
    log_error "Не удалось переключить CA"
    exit 1
fi

# ---------- ПРОВЕРКА ПОРТА 80 ----------
if ss -tln | grep -q ':80 '; then
    log_error "Порт 80 занят. Освободите порт для standalone-режима."
    exit 1
fi
log_info "Порт 80 свободен"

# ---------- ФУНКЦИЯ ВЫПУСКА СЕРТИФИКАТА ----------
issue_cert() {
    local domain="$1"
    local key_file="$2"
    local fullchain_file="$3"

    log_info "Выпуск сертификата для $domain"
    "$ACME_SH" --issue --standalone -d "$domain" \
        --key-file "$key_file" \
        --fullchain-file "$fullchain_file" \
        --force
    local ret=$?
    if [[ $ret -eq 0 ]]; then
        log_success "Сертификат для $domain получен"
    else
        log_error "Ошибка при получении сертификата для $domain (код $ret)"
        return 1
    fi
}

# ---------- ОПРЕДЕЛЕНИЕ ДОМЕНОВ ----------
BASE_DOMAIN="${LOCATION}.8rmdgz.ru"
SUB_DOMAIN="sub${LOCATION}.8rmdgz.ru"

log_step "Начало выпуска сертификатов для основных доменов"
log_info "Основной домен: $BASE_DOMAIN"
log_info "Поддомен: $SUB_DOMAIN"

# Выпуск сертификата для основного домена
issue_cert "$BASE_DOMAIN" \
    "$CERT_DIR/${BASE_DOMAIN}_privkey.key" \
    "$CERT_DIR/${BASE_DOMAIN}_fullchain.pem" || exit 1

# Выпуск сертификата для поддомена
issue_cert "$SUB_DOMAIN" \
    "$CERT_DIR/${SUB_DOMAIN}_privkey.key" \
    "$CERT_DIR/${SUB_DOMAIN}_fullchain.pem" || exit 1

log_success "Все сертификаты успешно получены"
echo ""
echo "Содержимое $CERT_DIR:"
ls -la "$CERT_DIR" | grep -E "${LOCATION}|sub${LOCATION}"

# ---------- УДАЛЕНИЕ CRON-ЗАДАЧИ ACME.SH ----------
log_step "Удаление стандартной cron-задачи acme.sh"
if crontab -l 2>/dev/null | grep -q "acme.sh"; then
    "$ACME_SH" --uninstall-cronjob
    log_success "Cron-задача acme.sh удалена"
else
    log_info "Cron-задача acme.sh не найдена"
fi

# ---------- СОЗДАНИЕ SYSTEMD-ТАЙМЕРА ДЛЯ АВТООБНОВЛЕНИЯ КАЖДЫЕ 30 ДНЕЙ ----------
log_step "Настройка systemd-таймера для автоматического обновления каждые 30 дней"

# Путь к юнитам
SERVICE_FILE="/etc/systemd/system/acme-renew.service"
TIMER_FILE="/etc/systemd/system/acme-renew.timer"

# Сервисный юнит (выполняет acme.sh --cron)
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=Renew Let's Encrypt certificates using acme.sh
After=network.target

[Service]
Type=oneshot
ExecStart=/root/.acme.sh/acme.sh --cron --home /root/.acme.sh
User=root
Group=root
StandardOutput=journal
StandardError=journal
EOF

# Таймер (срабатывает через 30 дней после последнего запуска)
cat > "$TIMER_FILE" << EOF
[Unit]
Description=Timer for acme-renew service (every 30 days)
Requires=acme-renew.service

[Timer]
OnUnitActiveSec=30d
Unit=acme-renew.service

[Install]
WantedBy=timers.target
EOF

chmod 644 "$SERVICE_FILE" "$TIMER_FILE"

# Перезагружаем systemd, включаем и запускаем таймер
systemctl daemon-reload
systemctl enable acme-renew.timer
systemctl start acme-renew.timer

log_success "Systemd-таймер создан и запущен: acme-renew.timer (интервал 30 дней)"
systemctl status acme-renew.timer --no-pager

# ---------- ФИНАЛЬНЫЙ ВЫВОД ----------
log_success "Модуль generate_certs.sh выполнен успешно"
echo ""
echo "=================================================="
echo "Локация          : $LOCATION"
echo "Основной домен   : $BASE_DOMAIN"
echo "Поддомен         : $SUB_DOMAIN"
echo "Каталог сертификатов: $CERT_DIR"
echo ""
echo "Полученные файлы:"
echo "  - $CERT_DIR/${BASE_DOMAIN}_fullchain.pem"
echo "  - $CERT_DIR/${BASE_DOMAIN}_privkey.key"
echo "  - $CERT_DIR/${SUB_DOMAIN}_fullchain.pem"
echo "  - $CERT_DIR/${SUB_DOMAIN}_privkey.key"
echo ""
echo "Автообновление: acme-renew.timer (каждые 30 дней)"
echo "=================================================="
echo ""

exit 0
