import type { DataStore } from "../db/store";
import type { QuickActionDefinition } from "./quickActions";
import type { CanonicalEvent, EventName, EventPayloads } from "../hub/events";

type ExtensionLogFields = Record<string, unknown>;
export type ExtensionCleanup = () => void | Promise<void>;

export type ExtensionAPI = {
    on<K extends EventName>(
        name: K,
        handler: (event: CanonicalEvent<K>) => void | Promise<void>
    ): () => void;
    emit<K extends EventName>(name: K, payload: EventPayloads[K]): Promise<void>;
    getState<T>(streamId: string, key: string, defaultValue: T): T;
    setState<T>(streamId: string, key: string, value: T): void;
    registerQuickAction: (action: QuickActionDefinition) => () => void;
    db: DataStore;
    log: (message: string, fields?: ExtensionLogFields) => void;
};

export type ExtensionDefinition = {
    id: string;
    init: (api: ExtensionAPI) => void | ExtensionCleanup | Promise<void | ExtensionCleanup>;
};
