Source: utils/ageUpdateStats.js

// @ts-check

/**
 * ageUpdate-Statistik im geteilten Redis.
 *
 * Der ageUpdate-SystemBot (basic-bots) schreibt nach jedem nächtlichen Lauf das
 * Ergebnis (Anzahl aktualisierter Personen) hierhin. members-back liest die Werte
 * für die Admin-Anzeige (`GET /person/ageUpdate/stats`).
 *
 * Beide Seiten nutzen denselben zentralen Redis-Client aus @commtool/shared-auth,
 * daher genügt der einfache Key-Aufbau unten.
 *
 * Aufbewahrung: 7 Tage (TTL) — die History zeigt die letzten 7 Läufe je Orga.
 */

import { getRedisClient } from '@commtool/shared-auth';

const TTL_SECONDS = 7 * 24 * 60 * 60; // 7 Tage

/**
 * Liefert den geteilten Redis-Client. Bewusst lazy: `getRedisClient()` wirft,
 * falls `configureAuth()` noch nicht gelaufen ist — das darf beim Modul-Import
 * nicht passieren, sondern erst beim tatsächlichen Request (nach Serverstart).
 * @returns {import('redis').RedisClientType}
 */
const getClient = () => getRedisClient();

/**
 * Key-Präfix für die ageUpdate-Stats (gemeinsam von Bot + members-back genutzt).
 *
 * Per Env überschreibbar (`AGE_UPDATE_STATS_PREFIX`), damit parallele Umgebungen
 * (z.B. Test-members-back neben Produktion) in SEPARATE Redis-Keys lesen und die
 * Produktions-Statistik nicht mit Test-Läufen vermischen. Produktion nutzt den
 * Default 'ageUpdate:stats:' (= Key-Aufbau des ageUpdate-SystemBots in basic-bots).
 */
export const AGE_UPDATE_STATS_PREFIX = process.env.AGE_UPDATE_STATS_PREFIX || 'ageUpdate:stats:';

/**
 * Redis-Key für eine Organisation.
 * @param {string} orgUID - Organisation (UUID-Format, wie im Bot/apiProvider)
 * @returns {string}
 */
export const statsKey = (orgUID) => `${AGE_UPDATE_STATS_PREFIX}${orgUID}`;

// Hinweis: Das Schreiben übernimmt der ageUpdate-SystemBot (basic-bots) direkt in
// denselben Redis (Key-Aufbau in src/SystemBots/ageUpdate/index.js). members-back
// ist hier nur der Lese-Seite (Admin-Anzeige), daher gibt es hier bewusst kein record.

/**
 * Stats für eine Organisation lesen.
 * Wird von members-back (`GET /person/ageUpdate/stats`) aufgerufen.
 *
 * @param {string} orgUID - Organisation (UUID-Format)
 * @returns {Promise<{ runs: Array<{ts:number, count:number, error?:string}>, lastRun: {ts:number, count:number}|null }>}
 */
export const readAgeUpdateStats = async (orgUID) => {
    const key = statsKey(orgUID);

    let client;
    try {
        client = getClient();
    } catch {
        // Redis noch nicht initialisiert → keine Statistik verfügbar
        return { runs: [], lastRun: null };
    }

    const raw = await client.lRange(key, 0, 6).catch(() => []);

    const runs = raw
        .map((item) => {
            try {
                return JSON.parse(item);
            } catch {
                return null;
            }
        })
        .filter((item) => item !== null);

    return {
        runs,
        lastRun: runs[0] ?? null,
    };
};