#!/usr/bin/env bash
# tool/self-check -- verify the installation against its own invariants
#
# Everything here is something that would make the panel misbehave later, so it
# is checked on demand and never silently ignored.
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"

ui_header "$(t tool_m_selfcheck)"
issues=0
chk_ok()   { ui_ok "$1"; }
chk_bad()  { ui_err "$1"; issues=$((issues + 1)); }

# --- layout -------------------------------------------------------------
[ -d "$NV_LIB/core" ] && chk_ok "$(t sc_lib_ok)" || chk_bad "$(t sc_lib_bad)"
[ -d "$NV_MODULES_DIR" ] && chk_ok "$(t sc_modules_ok)" || chk_bad "$(t sc_modules_bad)"

missing_meta=0; missing_action=0
for d in $(nv_module_dirs); do
    [ -f "$d/meta" ] || missing_meta=$((missing_meta + 1))
    [ -f "$d/action" ] || missing_action=$((missing_action + 1))
done
[ "$missing_meta" -eq 0 ] && chk_ok "$(t sc_meta_ok)" || chk_bad "$(t sc_meta_bad "$missing_meta")"
[ "$missing_action" -eq 0 ] && chk_ok "$(t sc_action_ok)" || chk_bad "$(t sc_action_bad "$missing_action")"

# every module id must be unique
dupes=$(for d in $(nv_module_dirs); do nv_module_id "$d"; done | sort | uniq -d | wc -l)
[ "$dupes" -eq 0 ] && chk_ok "$(t sc_ids_ok)" || chk_bad "$(t sc_ids_bad "$dupes")"

# --- i18n parity --------------------------------------------------------
vi_keys=$(sed -n 's/^\([A-Za-z0-9_]*\)=.*/\1/p' "$NV_I18N_DIR/vi/messages.lang" 2>/dev/null | sort -u)
en_keys=$(sed -n 's/^\([A-Za-z0-9_]*\)=.*/\1/p' "$NV_I18N_DIR/en/messages.lang" 2>/dev/null | sort -u)
if [ "$vi_keys" = "$en_keys" ]; then chk_ok "$(t sc_i18n_ok)"
else chk_bad "$(t sc_i18n_bad)"; fi

# --- state --------------------------------------------------------------
[ -w "$NV_STATE_DIR" ] && chk_ok "$(t sc_state_ok)" || chk_bad "$(t sc_state_bad)"
if [ -f "$NV_SECRET_FILE" ]; then
    mode=$(stat -c '%a' "$NV_SECRET_FILE" 2>/dev/null)
    [ "$mode" = "600" ] && chk_ok "$(t sc_secret_ok)" || chk_bad "$(t sc_secret_bad "$mode")"
else
    ui_info "$(t audit_secret_none)"
fi

# --- runtime ------------------------------------------------------------
if nv_have nginx; then
    nginx -t >/dev/null 2>&1 && chk_ok "$(t sc_nginx_ok)" || chk_bad "$(t sc_nginx_bad)"
fi
v=$(php_default_version 2>/dev/null)
if [ -n "$v" ]; then
    php-fpm"$v" -t >/dev/null 2>&1 && chk_ok "$(t sc_php_ok)" || chk_bad "$(t sc_php_bad)"
fi
db_available && chk_ok "$(t sc_db_ok)" || ui_info "$(t sc_db_skip)"

# --- registry consistency ----------------------------------------------
bad_sites=0
for domain in $(nv_site_list); do
    [ "$(nv_site_health "$domain")" = "ok" ] || bad_sites=$((bad_sites + 1))
done
[ "$bad_sites" -eq 0 ] && chk_ok "$(t sc_sites_ok)" || ui_warn "$(t sc_sites_bad "$bad_sites")"

ui_blank
if [ "$issues" -eq 0 ]; then ui_ok "$(t sc_clean)"
else ui_warn "$(t audit_issues "$issues")"; fi
[ "$issues" -eq 0 ]
