/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 * 
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is
 * regenerated.
// TODO: Include PageTemplateModels here too?? Probably
 */


/**
 * @class
 * Initializes a new instance of the StorageAccountCheckNameAvailabilityParameters class.
 * @constructor
 * @member {string} name
 * 
 */
export interface StorageAccountCheckNameAvailabilityParameters {
    name: string;
}

/**
 * @class
 * Initializes a new instance of the CheckNameAvailabilityResult class.
 * @constructor
 * The CheckNameAvailability operation response.
 * @member {boolean} [nameAvailable] Gets a boolean value that indicates
 * whether the name is available for you to use. If true, the name is
 * available. If false, the name has already been taken or invalid and cannot
 * be used.
 * 
 * @member {string} [reason] Gets the reason that a storage account name could
 * not be used. The Reason element is only returned if NameAvailable is
 * false. Possible values include: 'AccountNameInvalid', 'AlreadyExists'
 * 
 * @member {string} [message] Gets an error message explaining the Reason
 * value in more detail.
 * 
 */
export interface CheckNameAvailabilityResult {
    nameAvailable?: boolean;
    reason?: string;
    message?: string;
}

/**
 * @class
 * Initializes a new instance of the Sku class.
 * @constructor
 * The SKU of the storage account.
 * @member {string} name Gets or sets the sku name. Required for account
 * creation, optional for update. Note that in older versions, sku name was
 * called accountType. Possible values include: 'Standard_LRS',
 * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS'
 * 
 * @member {string} [tier] Gets the sku tier. This is based on the SKU name.
 * Possible values include: 'Standard', 'Premium'
 * 
 */
export interface Sku {
    name: string;
    tier?: string;
}

/**
 * @class
 * Initializes a new instance of the CustomDomain class.
 * @constructor
 * The custom domain assigned to this storage account. This can be set via
 * Update.
 * @member {string} name Gets or sets the custom domain name. Name is the
 * CNAME source.
 * 
 * @member {boolean} [useSubDomain] Indicates whether indirect CName
 * validation is enabled. Default value is false. This should only be set on
 * updates
 * 
 */
export interface CustomDomain {
    name: string;
    useSubDomain?: boolean;
}

/**
 * @class
 * Initializes a new instance of the EncryptionService class.
 * @constructor
 * An encrypted service.
 * @member {boolean} [enabled] A boolean indicating whether or not the service
 * is encrypted.
 * 
 * @member {date} [lastEnabledTime] Gets a time value indicating when was the
 * encryption enabled by the user last time. We return this value only when
 * encryption is enabled. There might be some unencrypted blobs which were
 * written after this time. This time is just to give a rough estimate of
 * when encryption was enabled.
 * 
 */
export interface EncryptionService {
    enabled?: boolean;
    lastEnabledTime?: Date;
}

/**
 * @class
 * Initializes a new instance of the EncryptionServices class.
 * @constructor
 * The encrypted services.
 * @member {object} [blob] The blob service.
 * 
 * @member {boolean} [blob.enabled] A boolean indicating whether or not the
 * service is encrypted.
 * 
 * @member {date} [blob.lastEnabledTime] Gets a time value indicating when was
 * the encryption enabled by the user last time. We return this value only
 * when encryption is enabled. There might be some unencrypted blobs which
 * were written after this time. This time is just to give a rough estimate
 * of when encryption was enabled.
 * 
 */
export interface EncryptionServices {
    blob?: EncryptionService;
}

/**
 * @class
 * Initializes a new instance of the Encryption class.
 * @constructor
 * The encryption settings on the account.
 * @member {object} [services] Gets the services which are encrypted.
 * 
 * @member {object} [services.blob] The blob service.
 * 
 * @member {boolean} [services.blob.enabled] A boolean indicating whether or
 * not the service is encrypted.
 * 
 * @member {date} [services.blob.lastEnabledTime] Gets a time value indicating
 * when was the encryption enabled by the user last time. We return this
 * value only when encryption is enabled. There might be some unencrypted
 * blobs which were written after this time. This time is just to give a
 * rough estimate of when encryption was enabled.
 * 
 */
export interface Encryption {
    services?: EncryptionServices;
}

/**
 * @class
 * Initializes a new instance of the StorageAccountCreateParameters class.
 * @constructor
 * The parameters to provide for the account.
 * @member {object} sku Required. Gets or sets the sku type.
 * 
 * @member {string} [sku.name] Gets or sets the sku name. Required for account
 * creation, optional for update. Note that in older versions, sku name was
 * called accountType. Possible values include: 'Standard_LRS',
 * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS'
 * 
 * @member {string} [sku.tier] Gets the sku tier. This is based on the SKU
 * name. Possible values include: 'Standard', 'Premium'
 * 
 * @member {string} kind Required. Indicates the type of storage account.
 * Possible values include: 'Storage', 'BlobStorage'
 * 
 * @member {string} location Required. Gets or sets the location of the
 * resource. This will be one of the supported and registered Azure Geo
 * Regions (e.g. West US, East US, Southeast Asia, etc.). The geo region of a
 * resource cannot be changed once it is created, but if an identical geo
 * region is specified on update the request will succeed.
 * 
 * @member {object} [tags] Gets or sets a list of key value pairs that
 * describe the resource. These tags can be used in viewing and grouping this
 * resource (across resource groups). A maximum of 15 tags can be provided
 * for a resource. Each tag must have a key no greater than 128 characters
 * and value no greater than 256 characters.
 * 
 * @member {object} [customDomain] User domain assigned to the storage
 * account. Name is the CNAME source. Only one custom domain is supported per
 * storage account at this time. To clear the existing custom domain, use an
 * empty string for the custom domain name property.
 * 
 * @member {string} [customDomain.name] Gets or sets the custom domain name.
 * Name is the CNAME source.
 * 
 * @member {boolean} [customDomain.useSubDomain] Indicates whether indirect
 * CName validation is enabled. Default value is false. This should only be
 * set on updates
 * 
 * @member {object} [encryption] Provides the encryption settings on the
 * account. If left unspecified the account encryption settings will remain.
 * The default setting is unencrypted.
 * 
 * @member {object} [encryption.services] Gets the services which are
 * encrypted.
 * 
 * @member {object} [encryption.services.blob] The blob service.
 * 
 * @member {boolean} [encryption.services.blob.enabled] A boolean indicating
 * whether or not the service is encrypted.
 * 
 * @member {date} [encryption.services.blob.lastEnabledTime] Gets a time value
 * indicating when was the encryption enabled by the user last time. We
 * return this value only when encryption is enabled. There might be some
 * unencrypted blobs which were written after this time. This time is just to
 * give a rough estimate of when encryption was enabled.
 * 
 * @member {string} [accessTier] Required for StandardBlob accounts. The
 * access tier used for billing. Access tier cannot be changed more than once
 * every 7 days (168 hours). Access tier cannot be set for StandardLRS,
 * StandardGRS, StandardRAGRS, or PremiumLRS account types. Possible values
 * include: 'Hot', 'Cool'
 * 
 */
export interface StorageAccountCreateParameters {
    sku: Sku;
    kind: string;
    location: string;
    tags?: { [propertyName: string]: string };
    customDomain?: CustomDomain;
    encryption?: Encryption;
    accessTier?: string;
}

/**
 * @class
 * Initializes a new instance of the Endpoints class.
 * @constructor
 * The URIs that are used to perform a retrieval of a public blob, queue or
 * table object.
 * @member {string} [blob] Gets the blob endpoint.
 * 
 * @member {string} [queue] Gets the queue endpoint.
 * 
 * @member {string} [table] Gets the table endpoint.
 * 
 * @member {string} [file] Gets the file endpoint.
 * 
 */
export interface Endpoints {
    blob?: string;
    queue?: string;
    table?: string;
    file?: string;
}

/**
 * @class
 * Initializes a new instance of the Resource class.
 * @constructor
 * @member {string} [id] Resource Id
 * 
 * @member {string} [name] Resource name
 * 
 * @member {string} [type] Resource type
 * 
 * @member {string} [location] Resource location
 * 
 * @member {object} [tags] Resource tags
 * 
 */
export interface Resource extends BaseResource {
    id?: string;
    name?: string;
    type?: string;
    location?: string;
    tags?: { [propertyName: string]: string };
}

/**
 * @class
 * Initializes a new instance of the StorageAccount class.
 * @constructor
 * The storage account.
 * @member {object} [sku] Gets the SKU.
 * 
 * @member {string} [sku.name] Gets or sets the sku name. Required for account
 * creation, optional for update. Note that in older versions, sku name was
 * called accountType. Possible values include: 'Standard_LRS',
 * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS'
 * 
 * @member {string} [sku.tier] Gets the sku tier. This is based on the SKU
 * name. Possible values include: 'Standard', 'Premium'
 * 
 * @member {string} [kind] Gets the Kind. Possible values include: 'Storage',
 * 'BlobStorage'
 * 
 * @member {string} [provisioningState] Gets the status of the storage account
 * at the time the operation was called. Possible values include: 'Creating',
 * 'ResolvingDNS', 'Succeeded'
 * 
 * @member {object} [primaryEndpoints] Gets the URLs that are used to perform
 * a retrieval of a public blob, queue or table object.Note that StandardZRS
 * and PremiumLRS accounts only return the blob endpoint.
 * 
 * @member {string} [primaryEndpoints.blob] Gets the blob endpoint.
 * 
 * @member {string} [primaryEndpoints.queue] Gets the queue endpoint.
 * 
 * @member {string} [primaryEndpoints.table] Gets the table endpoint.
 * 
 * @member {string} [primaryEndpoints.file] Gets the file endpoint.
 * 
 * @member {string} [primaryLocation] Gets the location of the primary for the
 * storage account.
 * 
 * @member {string} [statusOfPrimary] Gets the status indicating whether the
 * primary location of the storage account is available or unavailable.
 * Possible values include: 'Available', 'Unavailable'
 * 
 * @member {date} [lastGeoFailoverTime] Gets the timestamp of the most recent
 * instance of a failover to the secondary location. Only the most recent
 * timestamp is retained. This element is not returned if there has never
 * been a failover instance. Only available if the accountType is StandardGRS
 * or StandardRAGRS.
 * 
 * @member {string} [secondaryLocation] Gets the location of the geo
 * replicated secondary for the storage account. Only available if the
 * accountType is StandardGRS or StandardRAGRS.
 * 
 * @member {string} [statusOfSecondary] Gets the status indicating whether the
 * secondary location of the storage account is available or unavailable.
 * Only available if the accountType is StandardGRS or StandardRAGRS.
 * Possible values include: 'Available', 'Unavailable'
 * 
 * @member {date} [creationTime] Gets the creation date and time of the
 * storage account in UTC.
 * 
 * @member {object} [customDomain] Gets the user assigned custom domain
 * assigned to this storage account.
 * 
 * @member {string} [customDomain.name] Gets or sets the custom domain name.
 * Name is the CNAME source.
 * 
 * @member {boolean} [customDomain.useSubDomain] Indicates whether indirect
 * CName validation is enabled. Default value is false. This should only be
 * set on updates
 * 
 * @member {object} [secondaryEndpoints] Gets the URLs that are used to
 * perform a retrieval of a public blob, queue or table object from the
 * secondary location of the storage account. Only available if the
 * accountType is StandardRAGRS.
 * 
 * @member {string} [secondaryEndpoints.blob] Gets the blob endpoint.
 * 
 * @member {string} [secondaryEndpoints.queue] Gets the queue endpoint.
 * 
 * @member {string} [secondaryEndpoints.table] Gets the table endpoint.
 * 
 * @member {string} [secondaryEndpoints.file] Gets the file endpoint.
 * 
 * @member {object} [encryption] Gets the encryption settings on the account.
 * If unspecified the account is unencrypted.
 * 
 * @member {object} [encryption.services] Gets the services which are
 * encrypted.
 * 
 * @member {object} [encryption.services.blob] The blob service.
 * 
 * @member {boolean} [encryption.services.blob.enabled] A boolean indicating
 * whether or not the service is encrypted.
 * 
 * @member {date} [encryption.services.blob.lastEnabledTime] Gets a time value
 * indicating when was the encryption enabled by the user last time. We
 * return this value only when encryption is enabled. There might be some
 * unencrypted blobs which were written after this time. This time is just to
 * give a rough estimate of when encryption was enabled.
 * 
 * @member {string} [accessTier] The access tier used for billing. Access tier
 * cannot be changed more than once every 7 days (168 hours). Access tier
 * cannot be set for StandardLRS, StandardGRS, StandardRAGRS, or PremiumLRS
 * account types. Possible values include: 'Hot', 'Cool'
 * 
 */
export interface StorageAccount extends Resource {
    sku?: Sku;
    kind?: string;
    provisioningState?: string;
    primaryEndpoints?: Endpoints;
    primaryLocation?: string;
    statusOfPrimary?: string;
    lastGeoFailoverTime?: Date;
    secondaryLocation?: string;
    statusOfSecondary?: string;
    creationTime?: Date;
    customDomain?: CustomDomain;
    secondaryEndpoints?: Endpoints;
    encryption?: Encryption;
    accessTier?: string;
}

/**
 * @class
 * Initializes a new instance of the StorageAccountKey class.
 * @constructor
 * An access key for the storage account.
 * @member {string} [keyName] Name of the key.
 * 
 * @member {string} [value] Base 64 encoded value of the key.
 * 
 * @member {string} [permissions] Permissions for the key. Possible values
 * include: 'READ', 'FULL'
 * 
 */
export interface StorageAccountKey {
    keyName?: string;
    value?: string;
    permissions?: string;
}

/**
 * @class
 * Initializes a new instance of the StorageAccountListKeysResult class.
 * @constructor
 * The ListKeys operation response.
 * @member {array} [keys] Gets the list of account keys and their properties.
 * 
 */
export interface StorageAccountListKeysResult {
    keys?: StorageAccountKey[];
}

/**
 * @class
 * Initializes a new instance of the StorageAccountRegenerateKeyParameters class.
 * @constructor
 * @member {string} keyName
 * 
 */
export interface StorageAccountRegenerateKeyParameters {
    keyName: string;
}

/**
 * @class
 * Initializes a new instance of the StorageAccountUpdateParameters class.
 * @constructor
 * The parameters to provide for the account.
 * @member {object} [sku] Gets or sets the sku type. Note that sku cannot be
 * updated to StandardZRS or ProvisionedLRS, nor can accounts of that sku
 * type be updated to any other value.
 * 
 * @member {string} [sku.name] Gets or sets the sku name. Required for account
 * creation, optional for update. Note that in older versions, sku name was
 * called accountType. Possible values include: 'Standard_LRS',
 * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS'
 * 
 * @member {string} [sku.tier] Gets the sku tier. This is based on the SKU
 * name. Possible values include: 'Standard', 'Premium'
 * 
 * @member {object} [tags] Gets or sets a list of key value pairs that
 * describe the resource. These tags can be used in viewing and grouping this
 * resource (across resource groups). A maximum of 15 tags can be provided
 * for a resource. Each tag must have a key no greater than 128 characters
 * and value no greater than 256 characters.
 * 
 * @member {object} [customDomain] User domain assigned to the storage
 * account. Name is the CNAME source. Only one custom domain is supported per
 * storage account at this time. To clear the existing custom domain, use an
 * empty string for the custom domain name property.
 * 
 * @member {string} [customDomain.name] Gets or sets the custom domain name.
 * Name is the CNAME source.
 * 
 * @member {boolean} [customDomain.useSubDomain] Indicates whether indirect
 * CName validation is enabled. Default value is false. This should only be
 * set on updates
 * 
 * @member {object} [encryption] Provides the encryption settings on the
 * account. The default setting is unencrypted.
 * 
 * @member {object} [encryption.services] Gets the services which are
 * encrypted.
 * 
 * @member {object} [encryption.services.blob] The blob service.
 * 
 * @member {boolean} [encryption.services.blob.enabled] A boolean indicating
 * whether or not the service is encrypted.
 * 
 * @member {date} [encryption.services.blob.lastEnabledTime] Gets a time value
 * indicating when was the encryption enabled by the user last time. We
 * return this value only when encryption is enabled. There might be some
 * unencrypted blobs which were written after this time. This time is just to
 * give a rough estimate of when encryption was enabled.
 * 
 * @member {string} [accessTier] The access tier used for billing. Access tier
 * cannot be changed more than once every 7 days (168 hours). Access tier
 * cannot be set for StandardLRS, StandardGRS, StandardRAGRS, or PremiumLRS
 * account types. Possible values include: 'Hot', 'Cool'
 * 
 */
export interface StorageAccountUpdateParameters {
    sku?: Sku;
    tags?: { [propertyName: string]: string };
    customDomain?: CustomDomain;
    encryption?: Encryption;
    accessTier?: string;
}

/**
 * @class
 * Initializes a new instance of the UsageName class.
 * @constructor
 * The Usage Names.
 * @member {string} [value] Gets a string describing the resource name.
 * 
 * @member {string} [localizedValue] Gets a localized string describing the
 * resource name.
 * 
 */
export interface UsageName {
    value?: string;
    localizedValue?: string;
}

/**
 * @class
 * Initializes a new instance of the Usage class.
 * @constructor
 * Describes Storage Resource Usage.
 * @member {string} [unit] Gets the unit of measurement. Possible values
 * include: 'Count', 'Bytes', 'Seconds', 'Percent', 'CountsPerSecond',
 * 'BytesPerSecond'
 * 
 * @member {number} [currentValue] Gets the current count of the allocated
 * resources in the subscription.
 * 
 * @member {number} [limit] Gets the maximum count of the resources that can
 * be allocated in the subscription.
 * 
 * @member {object} [name] Gets the name of the type of usage.
 * 
 * @member {string} [name.value] Gets a string describing the resource name.
 * 
 * @member {string} [name.localizedValue] Gets a localized string describing
 * the resource name.
 * 
 */
export interface Usage {
    unit?: string;
    currentValue?: number;
    limit?: number;
    name?: UsageName;
}

/**
 * @class
 * Initializes a new instance of the UsageListResult class.
 * @constructor
 * The List Usages operation response.
 * @member {array} [value] Gets or sets the list Storage Resource Usages.
 * 
 */
export interface UsageListResult {
    value?: Usage[];
}
