#!/usr/bin/env bash
# site/repair -- reconcile the registry against reality
#
# The reason a registry is worth having: a site that exists in one place but
# not another (leftover vhost, missing directory, dropped database) is detected
# and repaired instead of producing a support ticket.
set -o pipefail
SELF=$(readlink -f "${BASH_SOURCE[0]}")
NV_BASE=$(cd "$(dirname "$SELF")/../../.." && pwd)
export NV_BASE
# shellcheck source=/dev/null
. "$NV_BASE/lib/core/bootstrap.sh"

nv_require_root || exit 1

ui_header "$(t site_m_repair)"

targets=()
if [ $# -ge 1 ]; then targets=("$1"); else
    while read -r d; do [ -n "$d" ] && targets+=("$d"); done < <(nv_site_list)
fi

if [ ${#targets[@]} -eq 0 ]; then
    ui_info "$(t site_none)"
    exit 0
fi

fixed=0 problems=0
for domain in "${targets[@]}"; do
    ui_section "$domain"
    nv_site_exists "$domain" || { ui_warn "$(t site_not_registered)"; continue; }

    root=$(nv_site_get "$domain" root_path)
    user=$(nv_site_get "$domain" web_user)
    vhost="/etc/nginx/sites-available/$domain.conf"
    pool="/etc/php/8.3/fpm/pool.d/$domain.conf"

    if id "$user" >/dev/null 2>&1; then
        ui_ok "user $user"
    else
        ui_err "user $user"; problems=$((problems + 1))
        adduser --system --group --home "/home/$domain" --shell /usr/sbin/nologin \
            --gecos "site $domain" "$user" >/dev/null 2>&1 && fixed=$((fixed + 1))
    fi

    if [ -d "$root" ]; then
        ui_ok "root $root"
    else
        ui_err "root $root"; problems=$((problems + 1))
        install -d -o "$user" -g "$user" -m 0755 "$root" 2>/dev/null && fixed=$((fixed + 1))
    fi

    if [ -f "$vhost" ]; then
        ui_ok "vhost"; nginx -t >/dev/null 2>&1 || { ui_err "nginx -t"; problems=$((problems + 1)); }
    else
        ui_err "vhost $vhost"; problems=$((problems + 1))
        ui_info "$(t site_repair_hint_create)"
    fi

    if [ -f "$pool" ]; then ui_ok "php pool"; else
        ui_err "php pool"; problems=$((problems + 1)); fi

    if [ -L "/etc/nginx/sites-enabled/$domain.conf" ]; then
        ui_ok "enabled"
    else
        ui_warn "not enabled"; ln -sfn "$vhost" "/etc/nginx/sites-enabled/$domain.conf" 2>/dev/null \
            && { fixed=$((fixed + 1)); ui_ok "enabled"; }
    fi

    db=$(nv_site_get "$domain" db_name)
    if [ -n "$db" ] && db_available; then
        if db_root_exec "SHOW DATABASES LIKE '$db'" 2>/dev/null | grep -q "$db"; then
            ui_ok "database $db"
        else
            ui_err "database $db missing"; problems=$((problems + 1))
        fi
    fi
done

svc_reload nginx
ui_blank
if [ "$problems" -eq 0 ]; then
    ui_ok "$(t site_repair_clean)"
else
    ui_warn "$(t site_repair_result "$problems" "$fixed")"
fi
exit 0
