#!/bin/bash

# Unified regeneration front door.
#
# One entry point that rebuilds the file-derived artifacts whose SOURCES changed,
# so callers (the CLI, the task-processor poll, a deploy) don't have to know which
# generator owns what. Runs as the manager and writes only into the data dirs — no
# privilege needed.
#
#   lpRegen [scope] [--force]
#     scope: all (default) | webui | arrays
#
# Self-heal: a stage runs only when a source file is newer than its artifact (or
# the artifact is missing), unless --force. The check is a cheap `find -newer`
# mtime compare — there is no watcher/daemon. The natural triggers (install,
# config change, deploy, the periodic task-processor poll) call this; it no-ops
# when nothing is stale, so it is safe to call often.
#
#   webui  — apps.json / apps-tools.json etc. from containers/<app>/{*.config,tools/*.tools.json}
#   arrays — the static files_*.sh source arrays from scripts/** (a dev/build concern;
#            a normal install never adds core scripts, so this is a no-op there)

# Is $artifact stale relative to the given find expression? Returns 0 (stale) when
# the artifact is missing or any matched source file is newer than it.
_lpRegenStale() {
    local artifact="$1"; shift
    [[ -f "$artifact" ]] || return 0
    find "$@" -newer "$artifact" -print -quit 2>/dev/null | grep -q .
}

lpRegenWebui() {
    local force="$1"
    local gen="${containers_dir}libreportal/frontend/data/apps/generated"
    local apps_json="$gen/apps.json"
    local tools_json="$gen/apps-tools.json"

    if [[ "$force" == "force" ]] \
       || _lpRegenStale "$apps_json"  "$install_containers_dir" -maxdepth 2 -name '*.config' \
       || _lpRegenStale "$tools_json" "$install_containers_dir" -maxdepth 3 -path '*/tools/*.tools.json'; then
        # Sources changed (e.g. an app folder was dropped in) — do the full,
        # debounced refresh so the new app appears everywhere. Force past the
        # updater's own debounce: we have already established there is real work.
        WEBUI_UPDATER_FORCE=1 webuiLibrePortalUpdate
        return $?
    fi
    return 0
}

lpRegenArrays() {
    local force="$1"
    local arrays_dir="${install_scripts_dir}source/files/arrays"
    local gen_script="${install_scripts_dir}source/files/generate_arrays.sh"
    local newest_array
    newest_array="$(ls -t "$arrays_dir"/files_*.sh 2>/dev/null | head -1)"

    if [[ "$force" == "force" ]] || [[ -z "$newest_array" ]] \
       || find "$install_scripts_dir" -name '*.sh' -newer "$newest_array" -print -quit 2>/dev/null | grep -q .; then
        [[ -f "$gen_script" ]] && "$gen_script" run
        return $?
    fi
    return 0
}

lpRegen() {
    local scope="all" force=""
    local a
    for a in "$@"; do
        case "$a" in
            --force|-f|force) force="force" ;;
            all|webui|arrays) scope="$a" ;;
            *) isNotice "Unknown regen argument: $a (use: all|webui|arrays [--force])" ;;
        esac
    done

    local rc=0
    case "$scope" in
        arrays) lpRegenArrays "$force" || rc=$? ;;
        webui)  lpRegenWebui  "$force" || rc=$? ;;
        all)    lpRegenArrays "$force" || rc=$?; lpRegenWebui "$force" || rc=$? ;;
    esac
    return $rc
}
