import { randomUUID } from "node:crypto";
import type { Role } from "../db/types";

export type EventName =
    | "system_started"
    | "platform_status"
    | "admin_command"
    | "chat_ingest"
    | "chat_message"
    | "chat_command"
    | "ws_out";

export type EventPayloads = {
    system_started: {
        host: string;
        port: number;
        version: string;
        env: "development" | "test" | "production";
    };
    platform_status: {
        platform: "twitch" | "youtube";
        state: string;
        message: string;
        details?: Record<string, unknown>;
    };
    admin_command: {
        streamId: string;
        tokenId: string;
        sessionId: string | null;
        command: string;
        args: string[];
        actorRole: Role;
    };
    chat_ingest: {
        platform: string;
        author: string;
        message: string;
    };
    chat_message: {
        streamId: string;
        platform: string;
        author: string;
        message: string;
    };
    chat_command: {
        streamId: string;
        command: string;
        args: string[];
        source: "chat";
        origin: "chat" | "admin";
        actor: {
            role: "admin" | "viewer" | "unknown";
            platform?: "youtube" | "twitch" | "local";
            userId?: string;
            username?: string;
        };
    };
    ws_out: {
        streamId: string;
        target: "all" | "admin" | "viewer";
        event: string;
        data: Record<string, unknown>;
    };
};

export type CanonicalEvent<K extends EventName = EventName> = {
    id: string;
    name: K;
    timestamp: string;
    payload: EventPayloads[K];
};

export function createEvent<K extends EventName>(
    name: K,
    payload: EventPayloads[K]
): CanonicalEvent<K> {
    return {
        id: randomUUID(),
        name,
        timestamp: new Date().toISOString(),
        payload
    };
}
