import { BaseManagerOptions, DataManager, ExperimentData, TrialData } from '@jspsych-datamanager/core';

/**
 * Configuration interface for Firebase initialization
 */
interface FirebaseConfig {
    /** Firebase API key */
    apiKey: string;
    /** Firebase authentication domain */
    authDomain: string;
    /** Firebase project ID */
    projectId: string;
    /** Firebase storage bucket */
    storageBucket: string;
    /** Firebase messaging sender ID */
    messagingSenderId: string;
    /** Firebase app ID */
    appId: string;
}
/**
 * Options specific to FirebaseManager initialization
 */
interface FirebaseManagerOptions extends BaseManagerOptions {
    /** Name of the Firestore collection to use (default: "experiments") */
    collectionName?: string;
    /** Specific document ID to use (optional) */
    documentId?: string;
}
/**
 * A class to manage Firebase operations for jsPsych experiments
 *
 * This class extends DataManager to provide Firebase-specific implementation
 * for storing and managing experiment data.
 *
 * @example
 * ```typescript
 * const firebaseManager = new FirebaseManager(firebaseConfig, {
 *     collectionName: "my-experiments",
 *     metadata: { version: "1.0.0" }
 * });
 * ```
 */
declare class FirebaseManager extends DataManager {
    private readonly app;
    private readonly db;
    private readonly docRef;
    private numberOfWrites;
    /**
     * Creates a new FirebaseManager instance
     * @param firebaseConfig Firebase configuration object
     * @param options Additional options for initialization
     */
    constructor(firebaseConfig: FirebaseConfig, options?: FirebaseManagerOptions);
    /**
     * Initializes the experiment document in Firestore
     * @param additionalData Additional data to include in the experiment document
     * @throws {Error} If initialization fails
     */
    initializeExperiment(additionalData?: Partial<ExperimentData>): Promise<void>;
    /**
     * Adds a new trial to the experiment document
     * @param trialData The trial data to add
     * @throws {Error} If storing the trial fails
     */
    addTrialData(trialData: TrialData): Promise<void>;
    /**
     * Gets the total number of writes to Firestore
     * @returns The number of write operations performed
     */
    getNumberOfOperations(): number;
    /**
     * Creates a callback function for jsPsych's on_data_update event
     * @returns A function that handles trial data updates
     */
    createDataUpdateCallback(): (data: TrialData) => TrialData;
    /**
     * Creates a callback function for jsPsych's on_finish event
     * @returns A function that handles experiment completion
     */
    createFinishCallback(): () => void;
    /**
     * Flattens nested arrays in an object to make it Firestore-compatible
     * @param obj The object to flatten
     * @returns A new object with flattened arrays
     */
    private flattenNestedArrays;
}

export { type FirebaseConfig, FirebaseManager, type FirebaseManagerOptions };
