import { AccessToken, BeEvent, GuidString, Id64String, OpenMode } from "@itwin/core-bentley";
import { ChangesetIdWithIndex, Code, CodeProps, ColorDef, GeometryStreamProps, IModelVersionProps, LocalFileName, PhysicalElementProps, RelatedElement, RequestNewBriefcaseProps } from "@itwin/core-common";
import { Point2d, Point3d } from "@itwin/core-geometry";
import { RequestNewBriefcaseArg } from "../BriefcaseManager";
import { CheckpointProps, DownloadRequest } from "../CheckpointManager";
import { BriefcaseDb, EditTxn, Element, IModelDb, Model, SnapshotDb } from "../core-backend";
import { OnElementDependencyArg, PhysicalElement, Subject } from "../Element";
import { ElementDrivesElement, OnDependencyArg, RelationshipProps } from "../Relationship";
import { Schema } from "../Schema";
import { HubMock } from "../internal/HubMock";
import { BackendHubAccess } from "../BackendHubAccess";
export interface IModelTestUtilsOpenOptions {
    copyFilename?: string;
    enableTransactions?: boolean;
    openMode?: OpenMode;
}
export declare class TestBim extends Schema {
    static get schemaName(): string;
}
export interface TestRelationshipProps extends RelationshipProps {
    property1: string;
}
export declare class TestElementDrivesElement extends ElementDrivesElement {
    static get className(): string;
    property1: string;
    static rootChanged: BeEvent<(arg: OnDependencyArg) => void>;
    static deletedDependency: BeEvent<(arg: OnDependencyArg) => void>;
    static onRootChangedArg(arg: OnDependencyArg): void;
    static onDeletedDependencyArg(arg: OnDependencyArg): void;
}
export interface TestPhysicalObjectProps extends PhysicalElementProps {
    intProperty: number;
}
export declare class TestPhysicalObject extends PhysicalElement {
    static get className(): string;
    intProperty: number;
    static beforeOutputsHandled: BeEvent<(arg: OnElementDependencyArg) => void>;
    static allInputsHandled: BeEvent<(arg: OnElementDependencyArg) => void>;
    static onBeforeOutputsHandledArg(arg: OnElementDependencyArg): void;
    static onAllInputsHandledArg(arg: OnElementDependencyArg): void;
}
/** the types of users available for tests */
export declare enum TestUserType {
    Regular = 0,
    Manager = 1,
    Super = 2,
    SuperManager = 3
}
/** A wrapper around the BackendHubAccess API through IModelHost[_hubAccess].
 *
 * All methods in this class should be usable with any BackendHubAccess implementation (i.e. HubMock and IModelHubBackend).
 */
export declare class HubWrappers {
    protected static get hubMock(): typeof HubMock;
    private static isTransientBriefcaseOpenError;
    static getAccessToken(user: TestUserType): Promise<string>;
    /** Create an iModel with the name provided if it does not already exist. If it does exist, the iModelId is returned. */
    static createIModel(accessToken: AccessToken, iTwinId: GuidString, iModelName: string): Promise<GuidString>;
    /** Deletes and re-creates an iModel with the provided name in the iTwin.
     * @returns the iModelId of the newly created iModel.
    */
    static recreateIModel(...[arg]: Parameters<BackendHubAccess["createNewIModel"]>): Promise<GuidString>;
    /** Delete an IModel from the hub */
    static deleteIModel(accessToken: AccessToken, iTwinId: string, iModelName: string): Promise<void>;
    /** Push an iModel to the Hub */
    static pushIModel(accessToken: AccessToken, iTwinId: string, pathname: string, iModelName?: string, overwrite?: boolean): Promise<GuidString>;
    /** Helper to open a briefcase db directly with the BriefcaseManager API */
    static downloadAndOpenBriefcase(args: RequestNewBriefcaseArg & {
        noLock?: true;
    }): Promise<BriefcaseDb>;
    /** Opens the specific iModel as a Briefcase through the same workflow the IModelReadRpc.getConnectionProps method will use. Replicates the way a frontend would open the iModel. */
    static openBriefcaseUsingRpc(args: RequestNewBriefcaseProps & {
        accessToken: AccessToken;
        deleteFirst?: boolean;
    }): Promise<BriefcaseDb>;
    /** Downloads a checkpoint and opens it as a SnapShotDb */
    static downloadAndOpenCheckpoint(args: {
        accessToken: AccessToken;
        iTwinId: GuidString;
        iModelId: GuidString;
        asOf?: IModelVersionProps;
    }): Promise<SnapshotDb>;
    /** Opens the specific Checkpoint iModel, `SyncMode.FixedVersion`, through the same workflow the IModelReadRpc.getConnectionProps method will use. Replicates the way a frontend would open the iModel. */
    static openCheckpointUsingRpc(args: RequestNewBriefcaseProps & {
        accessToken: AccessToken;
        deleteFirst?: boolean;
    }): Promise<IModelDb>;
    /**
     * Purges all acquired briefcases for the specified iModel (and user), if the specified threshold of acquired briefcases is exceeded
     */
    static purgeAcquiredBriefcasesById(accessToken: AccessToken, iModelId: GuidString, onReachThreshold?: () => void, acquireThreshold?: number): Promise<void>;
    static closeAndDeleteBriefcaseDb(accessToken: AccessToken, briefcaseDb: IModelDb): Promise<void>;
}
export declare class IModelTestUtils {
    protected static get knownTestLocations(): {
        outputDir: string;
        assetsDir: string;
    };
    /** Generate a name for an iModel that's unique using the baseName provided and appending a new GUID.  */
    static generateUniqueName(baseName: string): string;
    static openCheckpoint(fileName: LocalFileName, checkpoint: CheckpointProps): SnapshotDb;
    /** try to open an existing local file to satisfy a download request */
    static tryOpenLocalFile(request: DownloadRequest): SnapshotDb | undefined;
    /** Prepare for an output file by:
     * - Resolving the output file name under the known test output directory
     * - Making directories as necessary
     * - Removing a previous copy of the output file
     * @param subDirName Sub-directory under known test output directory. Should match the name of the test file minus the .test.ts file extension.
     * @param fileName Name of output fille
     */
    static prepareOutputFile(subDirName: string, fileName: string): LocalFileName;
    /** Resolve an asset file path from the asset name by looking in the known assets directory */
    static resolveAssetFile(assetName: string): LocalFileName;
    static resolveFontFile(fontName: string): LocalFileName;
    /** Orchestrates the steps necessary to create a new snapshot iModel from a seed file. */
    static createSnapshotFromSeed(testFileName: string, seedFileName: LocalFileName): SnapshotDb;
    static getUniqueModelCode(testDb: IModelDb, newModelCodeBase: string): Code;
    static generateChangeSetId(): ChangesetIdWithIndex;
    /** Create and insert a PhysicalPartition element (in the repositoryModel) and an associated PhysicalModel. */
    static createAndInsertPhysicalPartition(txn: EditTxn, newModelCode: CodeProps, parentId?: Id64String): Id64String;
    /** Create and insert a PhysicalPartition element (in the repositoryModel) and an associated PhysicalModel. */
    static createAndInsertPhysicalPartitionAsync(txn: EditTxn, newModelCode: CodeProps, parentId?: Id64String): Promise<Id64String>;
    /** Create and insert a PhysicalPartition element (in the repositoryModel) and an associated PhysicalModel. */
    static createAndInsertPhysicalModel(txn: EditTxn, modeledElementRef: RelatedElement, privateModel?: boolean): Id64String;
    /** Create and insert a PhysicalPartition element (in the repositoryModel) and an associated PhysicalModel. */
    static createAndInsertPhysicalModelAsync(txn: EditTxn, modeledElementRef: RelatedElement, privateModel?: boolean): Promise<Id64String>;
    /**
     * Create and insert a PhysicalPartition element (in the repositoryModel) and an associated PhysicalModel.
     * @return [modeledElementId, modelId]
     */
    static createAndInsertPhysicalPartitionAndModel(txn: EditTxn, newModelCode: CodeProps, privateModel?: boolean, parent?: Id64String): Id64String[];
    /**
     * Create and insert a PhysicalPartition element (in the repositoryModel) and an associated PhysicalModel.
     * @return [modeledElementId, modelId]
     */
    static createAndInsertPhysicalPartitionAndModelAsync(txn: EditTxn, newModelCode: CodeProps, privateModel?: boolean, parentId?: Id64String): Promise<Id64String[]>;
    /** Create and insert a Drawing Partition element (in the repositoryModel). */
    static createAndInsertDrawingPartition(txn: EditTxn, newModelCode: CodeProps, parentId?: Id64String): Id64String;
    /** Create and insert a DrawingModel associated with Drawing Partition. */
    static createAndInsertDrawingModel(txn: EditTxn, modeledElementRef: RelatedElement, privateModel?: boolean): Id64String;
    /**
     * Create and insert a Drawing Partition element (in the repositoryModel) and an associated DrawingModel.
     * @return [modeledElementId, modelId]
     */
    static createAndInsertDrawingPartitionAndModel(txn: EditTxn, newModelCode: CodeProps, privateModel?: boolean, parent?: Id64String): Id64String[];
    static getUniqueSpatialCategoryCode(scopeModel: Model, newCodeBaseValue: string): Code;
    static createPhysicalObject(testImodel: IModelDb, modelId: Id64String, categoryId: Id64String, elemCode?: Code): Element;
    static registerTestBimSchema(): void;
    static executeQuery(db: IModelDb, ecsql: string, bindings?: any[] | object): any[];
    static createJobSubjectElement(iModel: IModelDb, name: string): Subject;
    /** Flushes the Txns in the TxnTable - this allows importing of schemas */
    static flushTxns(iModelDb: IModelDb): boolean;
    static querySubjectId(iModelDb: IModelDb, subjectCodeValue: string): Id64String;
    static queryDefinitionPartitionId(iModelDb: IModelDb, parentSubjectId: Id64String, suffix: string): Id64String;
    static querySpatialCategoryId(iModelDb: IModelDb, modelId: Id64String, suffix: string): Id64String;
    static queryPhysicalPartitionId(iModelDb: IModelDb, parentSubjectId: Id64String, suffix: string): Id64String;
    static queryPhysicalElementId(iModelDb: IModelDb, modelId: Id64String, categoryId: Id64String, suffix: string): Id64String;
    static insertSpatialCategory(iModelDb: IModelDb, modelId: Id64String, categoryName: string, color: ColorDef): Id64String;
    static createBoxes(subCategoryIds: Id64String[]): GeometryStreamProps;
    static createBox(size: Point3d, categoryId?: Id64String, subCategoryId?: Id64String, renderMaterialId?: Id64String, geometryPartId?: Id64String): GeometryStreamProps;
    static insertTextureElement(txn: EditTxn, modelId: Id64String, textureName: string): Id64String;
    static createCylinder(radius: number): GeometryStreamProps;
    static createRectangle(size: Point2d): GeometryStreamProps;
    static queryByUserLabel(iModelDb: IModelDb, userLabel: string): Id64String;
    static queryByCodeValue(iModelDb: IModelDb, codeValue: string): Id64String;
    static insertRepositoryLink(txn: EditTxn, codeValue: string, url: string, format: string): Id64String;
    static insertExternalSource(txn: EditTxn, repositoryId: Id64String, userLabel: string): Id64String;
    static dumpIModelInfo(iModelDb: IModelDb): void;
}
export declare class ExtensiveTestScenario {
    static uniqueAspectGuid: string;
    static federationGuid3: string;
    static prepareDb(sourceDb: IModelDb): Promise<void>;
    static populateDb(sourceDb: IModelDb): Promise<void>;
    static updateDb(sourceDb: IModelDb): void;
    static assertUpdatesInDb(iModelDb: IModelDb, assertDeletes?: boolean): void;
}
//# sourceMappingURL=IModelTestUtils.d.ts.map