/**
 * SPDX-PackageName: kwaeri/mysql-migrator
 * SPDX-PackageVersion: 0.7.0
 * SPDX-FileCopyrightText: © 2014 - 2022 Richard Winters <kirvedx@gmail.com> and contributors
 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR MIT
 */
import { NodeKitOptions } from '@kwaeri/standards-types';
import { ServiceProviderSubscriptions, ServiceProviderHelpText, ServicePromiseBits, ServiceEventBits } from '@kwaeri/service';
import { MigratorServiceProvider } from '@kwaeri/migrator';
import { DatabaseDriver } from '@kwaeri/database-driver';
import { Configuration } from '@kwaeri/configuration';
/**
 * @typedef { Object } MigrationRecord
 * @property { number } id
 * @property { string } date
 * @property { string } name
 * @property { string } sequel
 * @property { boolean } applied
 */
export type MigrationRecord = {
    id: number;
    date: string;
    name: string;
    sequel: string;
    applied: boolean;
};
/**
 * @typedef { Object } MigrationPromise
 * @property { string? } version
 * @property { boolean } result
 * @property { MigrationRecord } migrations
 */
export type MigrationPromise = {
    version?: string;
    result: boolean;
    migrations: MigrationRecord[];
};
export type MySQLMigrationPromise = MigrationPromise & ServicePromiseBits;
/**
 * @typedef { Object } MigrationConfiguration
 * @property { string } version
 * @property { any } databaseProvider
 * @property { string? } type
 * @property { string? } table
 * @property { string? } environment
 */
export type MigratorConfiguration = {
    version?: string;
    databaseProvider?: any;
    type?: string;
    table?: string;
    environment?: string;
};
/**
 * @typedef { Object } MigrationMap
 * @property { string } timestamp
 * @property { string } name
 * @property { string } path
 */
export type MigrationMap = {
    timestamp: string;
    name: string;
    path: string;
};
export type RevertMigrationOptions = {
    stepBack?: number;
};
export declare const PARAMATERIZATION: {
    TYPE: {
        mysql: boolean;
    };
    LANG: {
        javascript: boolean;
    };
    EXT: {
        javascript: string;
    };
};
export type MySQLMigratorOptions = NodeKitOptions & RevertMigrationOptions;
/**
 * The Migrator Class
 *
 * The { Migrator } class handles everything that has to do with the migration
 * system, including; Setup, Management, and Execution of migrations.
 */
export declare class MysqlMigrator extends MigratorServiceProvider {
    /**
     * @var { string }
     */
    path: string;
    /**
     * @var { string }
     */
    confPath: string;
    /**
     * @var { string }
     */
    file: string;
    /**
     * @var {string }
     */
    version: string;
    /**
     * @var { string }
     */
    table: string;
    /**
     * @var { Date }
     */
    start?: Date;
    /**
     * @var { Date }
     */
    end?: Date;
    /**
     * @var { Date }
     */
    processStart?: Date;
    /**
     * @var { Date }
     */
    processEnd?: Date;
    /**
     * @var { Configuration }
     */
    configuration: Configuration;
    /**
     * @var { any }
     */
    conf: any;
    /**
     * @var { Configuration }
     */
    databaseConfiguration: Configuration;
    /**
     * @var { any }
     */
    databaseConf: any;
    /**
     * @var { string }
     */
    databaseType: string;
    /**
     * @var
     */
    databaseProvider: any;
    /**
     * @var { DatabaseDriver }
     */
    dbo?: DatabaseDriver;
    /**
     * Class constructor
     */
    constructor(handler?: (data: ServiceEventBits) => void, configuration?: MigratorConfiguration);
    getServiceProviderSubscriptions(options?: any): ServiceProviderSubscriptions;
    getServiceProviderSubscriptionHelpText<T extends ServiceProviderHelpText>(options?: any): T;
    /**
     * Method to resettle the { NodeKitProjectGeneratorOptions }. Essentially we
     * merge NodeKitOptions with FilesystemDescriptor by combining provided
     * command options with either a stored configuration or sane default.
     *
     * @param { NodeKitOptions } options
     *
     * @returns { NodeKitOptions } The options object, with the configuration partially populated with user-provided information
     */
    assembleOptions<T extends MySQLMigratorOptions>(options: NodeKitOptions): Promise<T>;
    /**
     * A method which asynchronously executes the necessary steps for creating
     * a migration within a project file structure
     *
     * @param { NodeKitOptions } options An object which specifies parameters for this method
     *
     * @return { Promise<any> }
     */
    renderService(options: NodeKitOptions): Promise<any>;
    /**
     * Checks if the migration system has been installed
     *
     * @pram { void }
     *
     * @return { Promise<undefined|null> } A promise with a boolean value indicating whether the migration system is installed.
     */
    checkInstall(): Promise<undefined | null>;
    /**
     * Checks the actual database portion of the migration system is installed
     *
     * @returns { Promise<undefined } If the check passes
     */
    checkDatabaseInstall(): Promise<undefined | null>;
    /**
     * Checks the actual filesystem portion of the migration system is installed
     *
     * @returns {Promise<undefined|null>}
     */
    checkFilesystemInstall(): Promise<undefined | null>;
    /**
     * Gets the migration or database configuration
     *
     * @param { boolean } database True to get the database configuration, false to get the migration configuration
     *
     * @returns { Configuration } A {@link Configuration} object
     */
    getConf(database?: boolean): Promise<any>;
    /**
     * Get the DBO; If `undefined` then attempt to create it, otherwise return
     * the existing dbo or resolve `null` in the event that this method
     * fails.
     *
     * @returns A new {@link DatabaseDriver} object
     */
    getDbo(): Promise<DatabaseDriver>;
    /**
     * Installs the migration system by calling the component install routines
     *
     * @param { string } content The migration configuration file content
     *
     * @return { Promise<T> } A promise that indicates the result of installing the migration system
     */
    install(content: any): Promise<undefined | null>;
    /**
     * Handles the migration's filesystem portion of the install
     *
     * @param { string } content The migration configuration file content
     *
     * @returns { Promise<undefined> }
     */
    installFilesystemComponent(content: any): Promise<undefined>;
    /**
     * Handles the migration's database portion of the install
     *
     * @returns { Promise<undefined> }
     */
    installDatabaseComponent(): Promise<undefined>;
    /**
     * Applies or reverts [a] migration(s)
     *
     * @param options Parameters that shape the migration command
     *
     * @returns { Promise<MigrationPromise> }
     */
    migrate<T extends MigrationPromise>(options: MySQLMigratorOptions): Promise<T>;
    getAvailableMigrations(): Promise<any>;
    getAppliedMigrations(): Promise<any>;
    getWorkingSet(available: any, applied: any, stepBack: number): any[];
    /**
     * Stages the migration for processing.
     *
     * Checks if the migration has been queued for processing, and if not - queues it. In
     * the event that it has already been queued, we note that whether we are applying or
     * reverting the migration.
     *
     * @param { any } target The target migration
     * @param { Number } stepBack The number of migrations to revert
     *
     * @returns { Promise<undefined> } A promise that resolves undefined
     */
    enqueueMigration(target: any, stepBack?: boolean): Promise<undefined>;
    /**
     * If migrations are being applied, it marks the queued migration as 'applied'. If
     * migrations are being reverted, it marks the reverted migration as unapplied.
     *
     * @param { any } target The target migration
     * @param { number } stepBack The number of migrations to revert
     *
     * @returns { Promise<undefined> } An undefined promise
     */
    dequeueMigration(target: any, stepBack?: boolean): Promise<undefined>;
    /**
     * Prints current process information
     *
     * @param { string } target The name of the migration
     * @param { boolean } stepBack True if the migration is moving backward, false if forward
     * @param { boolean } finished True if the process is completed
     */
    printProcessInfo(target: string, stepBack?: boolean, finished?: boolean): string;
    /**
     * Prints current process information
     *
     * @param { string } target The name of the migration
     * @param { boolean } revert True if the migration is moving backward, false if forward
     * @param { boolean } finished True if the process is completed
     */
    printServiceInfo(emptySet?: boolean, stepBack?: any, processed?: number): string;
}
