// src/services/enrichSpansWithStatus.ts (Korrigierte Version)

import { DerivedSpan, SpanStatus } from "./derivetimespans.service";
import { TimeEvent } from "./loadvalidevents.service"; // Jetzt mit related_event_id und actoruser_id

// ... (Rest der Imports)

export function enrichSpansWithStatus(
    factualSpans: DerivedSpan[],
    allValidEvents: TimeEvent[]
): DerivedSpan[] {

    // 1. Map der administrativen Aktionen erstellen
    const eventStatusMap = new Map<string, { status: SpanStatus, actorId: string }>();

    const administrativeEvents = allValidEvents.filter(e =>
        e.eventtype === 'submitted' || e.eventtype === 'approved' || e.eventtype === 'rejected'
    );

    // allValidEvents ist nach Zeit sortiert
    for (const event of administrativeEvents) {

        // **Verwendung des expliziten Feldes**
        const relatedId = event.related_event_id;
        const actorId = event.actoruser_id;

        if (relatedId) { // Nur fortfahren, wenn ein Bezugs-Event existiert

            let status: SpanStatus = "factual";
            // Wir überschreiben den Status des relatedId basierend auf der Event-Historie
            if (event.eventtype === 'submitted') status = 'submitted';
            else if (event.eventtype === 'approved') status = 'approved';
            else if (event.eventtype === 'rejected') status = 'rejected';

            eventStatusMap.set(relatedId, { status, actorId });
        }
    }

    // 2. Status der Spannen bestimmen und anreichern
    return factualSpans.map(span => {

        let approvedCount = 0;
        let rejectedCount = 0;
        let submittedCount = 0;
        let isFactualCount = 0;

        for (const sourceId of span.sourceEventIds) {
            const statusInfo = eventStatusMap.get(sourceId);

            if (statusInfo) {
                // Ein faktisches Event kann durch mehrere administrative Events betroffen sein
                // Wir speichern im Map nur den letzten Status (z.B. approved überschreibt submitted)
                if (statusInfo.status === 'approved') approvedCount++;
                else if (statusInfo.status === 'rejected') rejectedCount++;
                else if (statusInfo.status === 'submitted') submittedCount++;
            } else {
                // Wenn kein administratives Event existiert
                isFactualCount++;
            }
        }

        // Regel zur Bestimmung des Span-Status:
        const totalSourceEvents = span.sourceEventIds.length;
        let finalStatus: SpanStatus = "factual";

        if (totalSourceEvents > 0) {

            // Priorität 1: Rejection
            if (rejectedCount > 0) {
                finalStatus = "rejected";
            }
            // Priorität 2: Full Approval
            else if (approvedCount === totalSourceEvents) {
                finalStatus = "approved";
            }
            // Priorität 3: Submitted (wenn nicht fully approved oder rejected, aber mindestens eines submitted ist)
            else if (submittedCount > 0 || approvedCount > 0) {
                finalStatus = "submitted";
                // Ein Span ist submitted, wenn es zumindest teilweise eingereicht (oder genehmigt) ist,
                // aber nicht alle Events den finalen Status "approved" haben.
            }
            // Ansonsten bleibt es "factual" (wenn z.B. nur work_start aber nicht work_end eingereicht wurde, oder nichts)
        }

        // Rückgabe der angereicherten Span
        return {
            ...span,
            status: finalStatus,
        };
    });
}