/// <reference types="esri-runtime-sdk" />
/// <reference types="dotnet-bcl" />
import type FeatureLayer from "@arcgis/core/layers/FeatureLayer";
import type Layer from "@arcgis/core/layers/Layer";
import type { GeometryUnion } from "@arcgis/core/unionTypes.js";
import type { MapExtension } from "@vertigis/arcgis-extensions/mapping/MapExtension";
import type IDictionary from "dotnet-bcl/System/Collections/Generic/IDictionary";
import type Exception from "dotnet-bcl/System/Exception";
import type FeatureTable from "esri-runtime-sdk/FeatureTable";
import type OfflineMapSyncLayerResult from "esri-runtime-sdk/OfflineMapSyncLayerResult";
import type { Command } from "../Command.js";
import { CommandRegistry } from "../CommandRegistry.js";
import type { DateTime } from "../DotNetTypes.js";
import type { Event } from "../Event.js";
import { EventRegistry } from "../EventRegistry.js";
import type { Operation } from "../Operation.js";
import { OperationRegistry } from "../OperationRegistry.js";
import type { FeaturesLike, LayersLike, MapsLike } from "../common.js";
/**
 * Arguments for the "offline.create-area" operation.
 */
export interface CreateOfflineAreaArgs {
    /**
     * The title of the custom offline map area.
     */
    title: string;
    /**
     * The map that the custom offline map area is being created for.
     */
    mapExtension: MapExtension;
    /**
     * The map area details that will be used to create the offline map area.
     */
    areaDetails: CustomOfflineAreaDetails;
}
/**
 * Arguments for the "offline.get-areas" operation.
 */
export interface GetOfflineAreasArgs {
    /**
     * The map to look for areas from.
     */
    mapExtension?: MapExtension;
    /**
     * Whether the operation should retrieve cached data (true), or fetch data
     * over the network (false). Defaults to false (fetch data over the
     * network).
     */
    getCached?: boolean;
}
/**
 * Arguments for various offline commands.
 */
export interface OfflineCommandArgs {
    /**
     * The offline area to use.
     */
    offlineArea: OfflineAreaBase;
    /**
     * The associated map for the offline command/operation.
     */
    maps: MapsLike;
    /**
     * Whether a preplanned map area should update after download. Defaults to
     * false.
     */
    updatePreplannedAreaOnDownload: boolean;
}
/**
 * Arguments for the "offline.area-activated" event.
 */
export interface AreaActivatedEventArgs {
    /**
     * The area that is now active.
     */
    activeArea: OfflineAreaBase;
    /**
     * The area that was previously active. Can be null if there was no
     * previously active offline area.
     */
    previouslyActiveArea: OfflineAreaBase;
}
/**
 * Arguments for the "offline.user-went-online" event.
 */
export interface UserWentOnlineEventArgs {
    /**
     * The area that was previously active.
     */
    previouslyActiveArea: OfflineAreaBase;
}
/**
 * Arguments for events that signify the end of an offline area operation.
 */
export interface AreaOperationEndedEventArgs {
    /**
     * The offline area that is related to this event.
     */
    offlineArea: OfflineAreaBase;
    /**
     * The status of the offline area related to this event.
     */
    offlineAreaStatus: OfflineAreaStatus;
}
/**
 * Arguments for the "offline.area-edits-submit-started" event.
 */
export interface AreaEditsSubmitStartedEventArgs {
    /**
     * The offline area that is related to this event.
     */
    offlineArea: OfflineAreaBase;
    /**
     * The number of add edits that are being submitted.
     */
    adds: number;
    /**
     * The number of delete edits that are being submitted.
     */
    deletes: number;
    /**
     * The number of update edits that are being submitted.
     */
    updates: number;
}
/**
 * Corresponds to `VertiGIS.Mobile.Infrastructure.Offline.OfflineAreaBase` in
 * the VertiGIS.Mobile SDK.
 */
export interface OfflineAreaBase {
    /**
     * The Portal item ID of the online map this map area belongs to.
     */
    onlineMapId: string;
    /**
     * The time this map area was last updated.
     */
    updatedOn: DateTime;
    /**
     * The last time that this map area was activated.
     */
    lastActivated: DateTime;
    /**
     * A text string to display to the user describing this map area's current
     * status.
     */
    statusText: string;
    /**
     * The title of this map area.
     */
    title: string;
    /**
     * A value indicating whether this map area can be removed from the list of
     * available areas. Returns true for custom map areas; false for preplanned
     * areas.
     */
    removable: boolean;
    /**
     * The file size of the map area, in bytes.
     */
    fileSizeInBytes: number;
    /**
     * The path to the mobile map package on the device.
     */
    path: string;
    /**
     * The name of a sideloaded TPK to use as a basemap. May be null.
     */
    sideloadedTilePackageName: string;
    /**
     * Whether the download of this area includes a basemap.
     */
    includesBasemap: boolean;
    /**
     * The current OfflineAreaState of this map area.
     */
    currentState: OfflineAreaStates;
    /**
     * The number of features which have been added to this map area and are
     * pending sync.
     */
    numberOfAddedFeatures: number;
    /**
     * The number of features which have been removed from this map area and are
     * pending sync.
     */
    numberOfDeletedFeatures: number;
    /**
     * The number of features which have been updated in this map area and are
     * pending sync.
     */
    numberOfUpdatedFeatures: number;
    /**
     * The total number of edits pending sync; the sum of numberOfAddedFeatures,
     * numberOfDeletedFeatures and numberOfUpdatedFeatures.
     */
    numberOfEditedFeatures: number;
    /**
     * A value indicating whether there are any edits pending sync in this map
     * area; i.e. true if numberOfEditedFeatures is greater than 0.
     */
    hasEdits: boolean;
    /**
     * The progress of a download or sync operation in this map area. Value
     * ranges from 0 to 1.
     */
    progress: number;
    /**
     * Whether this map area is currently active.
     */
    isActive: boolean;
    /**
     * Whether this map area is currently updating or submitting edits.
     */
    isSyncing: boolean;
    /**
     * The map that this map area belongs to.
     */
    map: MapExtension;
    /**
     * The geometry defining this map area.
     */
    areaOfInterest: GeometryUnion;
    /**
     * The collection of layers that failed being taken offline.
     */
    failedLayers: string[];
    /**
     * The collection of tables that failed being taken offline.
     */
    failedTables: string[];
    /**
     * The list of sources (layers and tables) that failed being taken offline;
     * i.e. a union of failedLayers and failedTables.
     */
    failedSources: string[];
    /**
     * A value indicating whether there are any of the data sources failed being
     * taken offline; i.e. true if failedSources count is greater than 0.
     */
    hasFailedSources: boolean;
}
/**
 * Corresponds to `VertiGIS.Mobile.Infrastructure.Offline.CustomOfflineArea` in
 * the VertiGIS.Mobile SDK.
 */
export interface CustomOfflineArea extends OfflineAreaBase {
}
/**
 * Defines the details for the creation of a custom offline map area.
 */
export interface CustomOfflineAreaDetails {
    /**
     * The geometry defining this map area.
     */
    areaOfInterest: GeometryUnion;
    /**
     * The minimum scale for the map.
     */
    minScale: number;
    /**
     * The maximum scale for the map.
     */
    maxScale: number;
    /**
     * Whether to include feature attachments when downloading this map area.
     * Defaults to false.
     */
    includeAttachments?: boolean;
    /**
     * The name of a tile package to use as a basemap.
     */
    basemapTilePackage?: string;
    /**
     * Whether feature layer definition expressions are used when taking feature
     * layers and tables offline. Defaults to false.
     */
    isDefinitionExpressionFilterEnabled?: boolean;
}
/**
 * Corresponds to `VertiGIS.Mobile.Infrastructure.Offline.OfflineAreaStatus` in
 * the VertiGIS.Mobile SDK.
 */
export interface OfflineAreaStatus {
}
/**
 * Corresponds to `VertiGIS.Mobile.Infrastructure.Offline.OfflineAreaStates` in
 * the VertiGIS.Mobile SDK. This is a [flags
 * enum](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/enum#enumeration-types-as-bit-flags).
 */
export declare enum OfflineAreaStates {
    /**
     * Not downloaded.
     */
    AVAILABLE_TO_DOWNLOAD = 0,
    /**
     * Downloading.
     */
    DOWNLOADING = 1,
    /**
     * Downloaded but not active.
     */
    DOWNLOADED = 2,
    /**
     * Active.
     */
    ACTIVE = 4,
    /**
     * Currently updating.
     */
    UPDATING = 8,
    /**
     * Edits are being submitted.
     */
    SUBMITTING_EDITS = 16,
    /**
     * Deletion will begin shortly, for example after the user has confirmed a
     * prompt.
     */
    DELETION_PENDING = 32,
    /**
     * Deletion is in progress.
     */
    DELETION_IN_PROGRESS = 64,
    /**
     * Download has been triggered but has not yet started.
     */
    DOWNLOAD_STARTING = 128,
    /**
     * Activating.
     */
    ACTIVATING = 256,
    /**
     * Deactivating.
     */
    DEACTIVATING = 512,
    /**
     * Processing.
     */
    PROCESSING = 1024
}
/**
 * Corresponds to `VertiGIS.Mobile.Infrastructure.Offline.LayerEdits` in the
 * VertiGIS.Mobile SDK.
 */
export interface LayerEdits {
    /**
     * The layer associated with the pending edits.
     */
    layer: LayersLike;
    /**
     * The table associated with the pending edits.
     */
    table: FeatureTable;
    /**
     * A list of pending added features.
     */
    adds: FeaturesLike[];
    /**
     * A list of pending deleted features.
     */
    deletes: FeaturesLike[];
    /**
     * A list of pending updated features.
     */
    updates: FeaturesLike[];
}
/**
 * Represents a result from an offline operation.
 */
export interface OfflineOperationResult {
    /**
     * Whether or not the operation was successful.
     */
    success: boolean;
    /**
     * The Exception that occurred during the operation, or null if no Exception
     * occurred.
     */
    error: Exception;
    /**
     * An `OfflineErrorCode` value indicating the type of error that occurred,
     * or null if successful.
     */
    errorCode: OfflineErrorCode;
    /**
     * Gets a string representation of the ErrorCode enum; or null if
     * successful. Useful for consumption in VertiGIS Studio Workflow, instead
     * of having to deal with an integer value for the ErrorCode.
     */
    errorCodeString: string;
    /**
     * A localized, end-user presentable error message, or null if the operation
     * was successful.
     */
    errorMessage: string;
    /**
     * A collection of warnings that occurred during the operation that do not
     * necessarily mean that the operation was failed.
     */
    warnings: string[];
    /**
     * A collection of layer errors that occurred while downloading a map area.
     */
    downloadLayerErrors: IDictionary<Layer, Exception>;
    /**
     * A dictionary of table errors that occurred while downloading a map area.
     */
    downloadTableErrors: IDictionary<FeatureTable, Exception>;
    /**
     * A dictionary of layer sync results that occurred while submitting edits
     * on or updating a map area.
     */
    syncLayerResults: IDictionary<FeatureLayer, OfflineMapSyncLayerResult>;
    /**
     * A dictionary of table sync results that occurred while submitting edits
     * on or updating a map area.
     */
    syncTableResults: IDictionary<FeatureTable, OfflineMapSyncLayerResult>;
    /**
     * A dictionary of layer errors that occurred during a sync (submit edits or
     * update) operation.
     */
    syncLayerErrors: IDictionary<FeatureLayer, Exception>;
    /**
     * A dictionary of table errors that occurred during a sync (submit edits or
     * update) operation.
     */
    syncTableErrors: IDictionary<FeatureTable, Exception>;
    /**
     * An OfflineOperationResult. Can be used to capture multiple results from a
     * chain of offline operations.
     */
    nextResult: OfflineOperationResult;
}
/**
 * An error code for a known offline operation error.
 */
export type OfflineErrorCode = 
/**
 * NETWORK_CONNECTION_REQUIRED - The operation requires network
 * connectivity, but the network is disconnected.
 */
100
/**
 * PORTAL_CONNECTION_FAILURE - Failed to connect to a Portal.
 */
 | 101
/**
 * ALREADY_STARTED - Job is already in progress.
 */
 | 102
/**
 * EXCEPTION_THROWN - An exception was thrown.
 */
 | 103
/**
 * INVALID_MAP_AREA_DATA - The downloaded map area package is invalid.
 */
 | 104
/**
 * BACKGROUND_TIME_EXPIRED - The amount of allowable time spent with the app
 * in the background was exceeded.
 */
 | 105
/**
 * MULTIPLE_ERRORS - Multiple errors occurred.
 */
 | 106
/**
 * WEBMAP_REQUIRED - A web map is required, but one is not available.
 */
 | 200
/**
 * WEBMAP_LOAD_FAILURE - The web map failed to load.
 */
 | 201
/**
 * WEBMAP_NOT_LOADED - The web map must be loaded before the operation can
 * be completed.
 */
 | 202
/**
 * WEBMAP_UNAUTHORIZED - Permission denied on the web map.
 */
 | 203;
export declare class OfflineCommands extends CommandRegistry {
    protected readonly _prefix = "offline";
    /**
     * Cancels any create offline map area operation in progress and resets the
     * form used to create custom offline map areas. Mobile only.
     *
     * @mobileOnly
     */
    get cancelCreateArea(): Command;
    /**
     * Cancels the download of the specified offline area, if it is currently in
     * progress. Mobile only.
     *
     * @mobileOnly
     */
    get cancelDownload(): Command<OfflineCommandArgs>;
    /**
     * Deletes the data stored on the device for the specified offline area. If
     * a custom offline area is specified, and the area is not downloaded,
     * deletes the custom area definition instead. Mobile only.
     *
     * @mobileOnly
     */
    get deleteArea(): Command<OfflineCommandArgs>;
    /**
     * Displays a form that allows for the creation of a custom offline map
     * area. Mobile only.
     *
     * @mobileOnly
     */
    get displayCreateArea(): Command<MapExtension>;
}
export declare class OfflineEvents extends EventRegistry {
    protected readonly _prefix = "offline";
    /**
     * Raised when an offline area is activated. Mobile only.
     *
     * @mobileOnly
     */
    get areaActivated(): Event<AreaActivatedEventArgs>;
    /**
     * Raised when an offline area is about to be activated. Mobile only.
     *
     * @mobileOnly
     */
    get areaActivating(): Event<OfflineAreaBase>;
    /**
     * Raised when the data for offline map area is deleted. Mobile only.
     *
     * @mobileOnly
     */
    get areaDeleted(): Event<OfflineAreaBase>;
    /**
     * Raised when an offline area download has started. Mobile only.
     *
     * @mobileOnly
     */
    get areaDownloadStarted(): Event<OfflineAreaBase>;
    /**
     * Raised when an offline area download is canceled by the user. Mobile
     * only.
     *
     * @mobileOnly
     */
    get areaDownloadCanceled(): Event<AreaOperationEndedEventArgs>;
    /**
     * Raised when an offline area download fails. Mobile only.
     *
     * @mobileOnly
     */
    get areaDownloadFailed(): Event<AreaOperationEndedEventArgs>;
    /**
     * Raised when an offline area download completes. Mobile only.
     *
     * @mobileOnly
     */
    get areaDownloaded(): Event<AreaOperationEndedEventArgs>;
    /**
     * Raised when an offline area update has started. Mobile only.
     *
     * @mobileOnly
     */
    get areaUpdateStarted(): Event<OfflineAreaBase>;
    /**
     * Raised when an offline area has been updated. Mobile only.
     *
     * @mobileOnly
     */
    get areaUpdated(): Event<AreaOperationEndedEventArgs>;
    /**
     * Raised when an any error occurs during an offline map update. Mobile
     * only.
     *
     * @mobileOnly
     */
    get areaUpdateFailed(): Event<AreaOperationEndedEventArgs>;
    /**
     * Raised when an operation to submit offline area edits has started. Mobile
     * only.
     *
     * @mobileOnly
     */
    get areaEditsSubmitStarted(): Event<AreaEditsSubmitStartedEventArgs>;
    /**
     * Raised when offline area edits have been submitted and this operation is
     * successfully completed. Mobile only.
     *
     * @mobileOnly
     */
    get areaEditsSubmitted(): Event<AreaOperationEndedEventArgs>;
    /**
     * Raised when any error occurs during an offline map submit edits. Mobile
     * only.
     *
     * @mobileOnly
     */
    get areaEditsSubmitFailed(): Event<AreaOperationEndedEventArgs>;
    /**
     * Raised when a new custom offline map area is created. Mobile only.
     *
     * @mobileOnly
     */
    get customAreaCreated(): Event<CustomOfflineArea>;
    /**
     * Raised when the definition of a custom map area is deleted. Mobile only.
     *
     * @mobileOnly
     */
    get customAreaDeleted(): Event<CustomOfflineArea>;
    /**
     * Raised when a map is switched to the online map. Mobile only.
     *
     * @mobileOnly
     */
    get userWentOnline(): Event<UserWentOnlineEventArgs>;
}
export declare class OfflineOperations extends OperationRegistry {
    protected readonly _prefix = "offline";
    /**
     * Creates a new custom offline map area. Mobile only.
     *
     * @mobileOnly
     */
    get createArea(): Operation<CreateOfflineAreaArgs, CustomOfflineArea>;
    /**
     * Gets a list of available offline areas for the web map. Mobile only.
     *
     * @mobileOnly
     */
    get getAreas(): Operation<GetOfflineAreasArgs, OfflineAreaBase[]>;
    /**
     * Gets a list of available custom offline areas for the web map. Mobile
     * only.
     *
     * @mobileOnly
     */
    get getCustomAreas(): Operation<MapExtension, OfflineAreaBase[]>;
    /**
     * Gets a list of layer edits for a given map area. Mobile only.
     *
     * @mobileOnly
     */
    get getEdits(): Operation<OfflineCommandArgs, LayerEdits[]>;
    /**
     * Activates the specified offline area, replacing the map on the MapView
     * with the offline map associated with the specified offline area. Mobile
     * only. Note that exceptions during activation will be set in the result
     * rather than thrown.
     *
     * @mobileOnly
     */
    get activateArea(): Operation<OfflineCommandArgs, OfflineOperationResult>;
    /**
     * Downloads the data for the specified offline area. Mobile only. Note that
     * exceptions during the download process will be set in the result rather
     * than thrown.
     *
     * @mobileOnly
     */
    get downloadArea(): Operation<OfflineCommandArgs, OfflineOperationResult>;
    /**
     * Switches from an offline map to the online map. Mobile only. Note that
     * exceptions while switching to the online map will be set in the result
     * rather than thrown.
     *
     * @mobileOnly
     */
    get goOnline(): Operation<OfflineCommandArgs, OfflineOperationResult>;
    /**
     * Checks whether a map area is active for the specified map, or for any map
     * if argument is null. Mobile only.
     *
     * @mobileOnly
     */
    get checkForActiveArea(): Operation<MapExtension, boolean>;
    /**
     * Pushes any edits to the server that have been done in the indicated
     * offline map. Mobile only. Note that errors during the upload process will
     * be set in the result rather than thrown.
     *
     * @mobileOnly
     */
    get submitEdits(): Operation<OfflineCommandArgs, OfflineOperationResult>;
    /**
     * Pulls down any new map changes from the server to the indicated offline
     * map. Mobile only. Note that errors during the update process will be set
     * in the result rather than thrown.
     *
     * @mobileOnly
     */
    get updateArea(): Operation<OfflineCommandArgs, OfflineOperationResult>;
}
