#!/bin/bash

# LibrePortal WebUI Main Updater
# Coordinates all webui data updates including system info and app configurations

webuiLibrePortalUpdate() {
    # Debounce: during a fresh install this function gets called back-to-back
    # by installLibrePortal (line 113) and then startScan (end of preinstall),
    # both within ~10 seconds. Skip if the last successful run is within the
    # debounce window. Callers that genuinely need a forced refresh can set
    # WEBUI_UPDATER_FORCE=1.
    local stamp_file="/tmp/libreportal_webui_updater_last"
    local debounce_seconds="${WEBUI_UPDATER_DEBOUNCE:-30}"
    if [[ -z "$WEBUI_UPDATER_FORCE" && -f "$stamp_file" ]]; then
        local _now=$(date +%s)
        local _last=$(stat -c '%Y' "$stamp_file" 2>/dev/null)
        if [[ -n "$_last" ]] && (( _now - _last < debounce_seconds )); then
            isNotice "WebUI updater ran $((_now - _last))s ago — skipping (debounced, within ${debounce_seconds}s)."
            return 0
        fi
    fi

    local status=$(dockerCheckAppInstalled "libreportal" "docker")

    # Main process: generate config if app is installed
    if [ "$status" == "installed" ]; then
        isHeader "LibrePortal WebUI Updater"

        # Check for update lock file first
        local result=$(webuiCheckUpdateLock)
        checkSuccess "Checked for update lock file."

        if [[ "$lock_file_found" == "true" ]]; then
            echo ""
            isNotice "Update already in progress. Please wait for current update to complete."
            isNotice "Status: Locked"
            isNotice "WebUI update skipped due to concurrent update"
            echo ""
        else
            # Create update lock file
            local result=$(webuiCreateUpdateLock)
            checkSuccess "Created update lock file..."
            
            # Update system information first
            local result=$(webuiSystemUpdate)
            checkSuccess "Updated system information..."

            # Ensure task system files exist (failsafe)
            local result=$(webuiEnsureTaskFiles)
            checkSuccess "Ensured task system files exist..."

            # Generate system configuration
            local result=$(webuiGenerateSystemConfigs)
            checkSuccess "Generated system configurations..."

            # Generate categories
            local result=$(webuiCreateCategories $containers_dir/libreportal/frontend/data)
            checkSuccess "Generated app and config categories..."

            # Generate LibrePortal app configuration
            local result=$(webuiGenerateLibrePortalConfig)
            checkSuccess "Generated LibrePortal app configuration..."

            # Generate apps-services.json
            local result=$(webuiGenerateAppsServicesConfig)
            checkSuccess "Generated apps-services.json..."

            # Generate apps-tools.json (aggregate of per-app *.tools.json)
            local result=$(webuiGenerateAppsToolsConfig)
            checkSuccess "Generated apps-tools.json..."

            # Per-app routine refresh hooks. An installed app may define
            # appWebuiRefresh_<app> (in containers/<app>/scripts/) for data it
            # wants refreshed on every WebUI update — e.g. gluetun's provider
            # snapshot. Gated on the app being installed (its live compose
            # exists, tested directly so it works without list perm on the
            # container-user-owned data dir), so non-users never pay for it.
            local _app _dir _hook
            for _dir in "${install_containers_dir}"*/; do
                _app="$(basename "$_dir")"
                [[ -f "${containers_dir}${_app}/docker-compose.yml" ]] || continue
                _hook="appWebuiRefresh_${_app}"
                declare -F "$_hook" >/dev/null 2>&1 || continue
                local result=$($_hook)
                checkSuccess "Refreshed ${_app} WebUI data..."
            done

            # Generate Backup locations / snapshots / engines / dashboards
            local result=$(webuiGenerateBackupLocations && webuiGenerateBackupDashboard && webuiGenerateBackupSnapshots all && webuiGenerateBackupAppStatus && webuiGenerateBackupEngines && webuiGenerateBackupSchema && webuiGenerateBackupPasswords && webuiGenerateBackupMigrate)
            checkSuccess "Refreshed backup dashboard data..."

            # Peers (named other LibrePortal instances) — small, cheap; lives
            # in its own data/peers/generated/peers.json file consumed by
            # /peers and overlay-read by the migrate tab.
            local result=$(webuiGeneratePeers)
            checkSuccess "Refreshed peers data..."

            # SSH access snapshot (authorized keys + password-login state)
            local result=$(webuiGenerateSshAccess)
            checkSuccess "Refreshed SSH access data..."

            # Sync app icons
            local result=$(webuiSyncAppIcons)
            checkSuccess "Synced app icons..."

            # Generate log files for installed apps
            local result=$(webuiGenerateAppLogs)
            checkSuccess "Generated log files for installed apps..."

            # Remove update lock file
            local result=$(webuiRemoveUpdateLock)
            checkSuccess "Removed update lock file..."

            # Remove setup lock file
            local result=$(webuiRemoveSetupLock)
            checkSuccess "Removed setup lock file..."

            isSuccessful "WebUI update completed successfully!"
            touch "$stamp_file" 2>/dev/null || true
        fi
    else
        isNotice "LibrePortal not installed - skipping WebUI update"
    fi
}

