/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
 * @module iModels
 */
/** Option to specify the version of the iModel to be acquired and used
 * @public
 */
export class IModelVersion {
    constructor() { }
    /** Describes the first version of the iModel */
    static first() {
        const version = new IModelVersion();
        version._first = true;
        return version;
    }
    /** Describes the latest version of the iModel  */
    static latest() {
        const version = new IModelVersion();
        version._latest = true;
        return version;
    }
    /** Describes a version of the iModel by the last change set that needs
     * to be applied or merged to the iModel.
     * Note that all ChangeSets up to and and including the specified ChangeSet
     * needs to be applied.
     * If the changesetId is an empty string, it is assumed to be the first version
     * before any change sets have been applied.
     */
    static asOfChangeSet(changesetId) {
        const version = new IModelVersion();
        if (changesetId === "") {
            version._first = true;
            return version;
        }
        version._afterChangeSetId = changesetId;
        return version;
    }
    /** Describes a version of the iModel with the specified version name  */
    static named(versionName) {
        const version = new IModelVersion();
        version._versionName = versionName;
        return version;
    }
    toJSON() {
        return this._versionName ? { versionName: this._versionName } :
            this._afterChangeSetId ? { afterChangeSetId: this._afterChangeSetId } :
                this._first ? { first: this._first } :
                    { latest: true };
    }
    /** Creates a version from an IModelVersionProps */
    static fromJSON(json) {
        const version = new IModelVersion();
        version._first = json.first;
        version._afterChangeSetId = json.afterChangeSetId;
        version._latest = json.latest;
        version._versionName = json.versionName;
        return version;
    }
    /** Returns true if this describes the first version */
    get isFirst() { return !!this._first; }
    /** Returns true if this describes the latest version */
    get isLatest() { return !!this._latest; }
    /** Returns the last change set id to be applied to the iModel
     * to get to this specified version. @see asOfChangeSet().
     * Note that this method does not attempt to resolve the change set
     * if this describes the first version, last version, named version, etc.
     * @see evaluateChangeSet() for those use cases.
     */
    getAsOfChangeSet() { return this._afterChangeSetId; }
    /** Returns the name of the version if this describes a named version. @see named() */
    getName() { return this._versionName; }
}
//# sourceMappingURL=IModelVersion.js.map