/*
 * 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.
 */

'use strict';

const models = require('./index');

/**
 * A lab.
 *
 * @extends models['Resource']
 */
class Lab extends models['Resource'] {
  /**
   * Create a Lab.
   * @property {string} [defaultStorageAccount] The lab's default storage
   * account.
   * @property {string} [defaultPremiumStorageAccount] The lab's default
   * premium storage account.
   * @property {string} [artifactsStorageAccount] The lab's artifact storage
   * account.
   * @property {string} [premiumDataDiskStorageAccount] The lab's premium data
   * disk storage account.
   * @property {string} [vaultName] The lab's Key vault.
   * @property {string} [labStorageType] Type of storage used by the lab. It
   * can be either Premium or Standard. Default is Premium. Possible values
   * include: 'Standard', 'Premium'
   * @property {array} [mandatoryArtifactsResourceIdsLinux] The ordered list of
   * artifact resource IDs that should be applied on all Linux VM creations by
   * default, prior to the artifacts specified by the user.
   * @property {array} [mandatoryArtifactsResourceIdsWindows] The ordered list
   * of artifact resource IDs that should be applied on all Windows VM
   * creations by default, prior to the artifacts specified by the user.
   * @property {date} [createdDate] The creation date of the lab.
   * @property {string} [premiumDataDisks] The setting to enable usage of
   * premium data disks.
   * When its value is 'Enabled', creation of standard or premium data disks is
   * allowed.
   * When its value is 'Disabled', only creation of standard data disks is
   * allowed. Possible values include: 'Disabled', 'Enabled'
   * @property {string} [environmentPermission] The access rights to be granted
   * to the user when provisioning an environment. Possible values include:
   * 'Reader', 'Contributor'
   * @property {object} [announcement] The properties of any lab announcement
   * associated with this lab
   * @property {string} [announcement.title] The plain text title for the lab
   * announcement
   * @property {string} [announcement.markdown] The markdown text (if any) that
   * this lab displays in the UI. If left empty/null, nothing will be shown.
   * @property {string} [announcement.enabled] Is the lab announcement
   * active/enabled at this time?. Possible values include: 'Enabled',
   * 'Disabled'
   * @property {date} [announcement.expirationDate] The time at which the
   * announcement expires (null for never)
   * @property {boolean} [announcement.expired] Has this announcement expired?
   * @property {string} [announcement.provisioningState] The provisioning
   * status of the resource.
   * @property {string} [announcement.uniqueIdentifier] The unique immutable
   * identifier of a resource (Guid).
   * @property {object} [support] The properties of any lab support message
   * associated with this lab
   * @property {string} [support.enabled] Is the lab support banner
   * active/enabled at this time?. Possible values include: 'Enabled',
   * 'Disabled'
   * @property {string} [support.markdown] The markdown text (if any) that this
   * lab displays in the UI. If left empty/null, nothing will be shown.
   * @property {string} [vmCreationResourceGroup] The resource group in which
   * lab virtual machines will be created in.
   * @property {string} [publicIpId] The public IP address for the lab's load
   * balancer.
   * @property {string} [loadBalancerId] The load balancer used to for lab VMs
   * that use shared IP address.
   * @property {string} [networkSecurityGroupId] The Network Security Group
   * attached to the lab VMs Network interfaces to restrict open ports.
   * @property {object} [extendedProperties] Extended properties of the lab
   * used for experimental features
   * @property {string} [provisioningState] The provisioning status of the
   * resource.
   * @property {string} [uniqueIdentifier] The unique immutable identifier of a
   * resource (Guid).
   */
  constructor() {
    super();
  }

  /**
   * Defines the metadata of Lab
   *
   * @returns {object} metadata of Lab
   *
   */
  mapper() {
    return {
      required: false,
      serializedName: 'Lab',
      type: {
        name: 'Composite',
        className: 'Lab',
        modelProperties: {
          id: {
            required: false,
            readOnly: true,
            serializedName: 'id',
            type: {
              name: 'String'
            }
          },
          name: {
            required: false,
            readOnly: true,
            serializedName: 'name',
            type: {
              name: 'String'
            }
          },
          type: {
            required: false,
            readOnly: true,
            serializedName: 'type',
            type: {
              name: 'String'
            }
          },
          location: {
            required: false,
            serializedName: 'location',
            type: {
              name: 'String'
            }
          },
          tags: {
            required: false,
            serializedName: 'tags',
            type: {
              name: 'Dictionary',
              value: {
                  required: false,
                  serializedName: 'StringElementType',
                  type: {
                    name: 'String'
                  }
              }
            }
          },
          defaultStorageAccount: {
            required: false,
            readOnly: true,
            serializedName: 'properties.defaultStorageAccount',
            type: {
              name: 'String'
            }
          },
          defaultPremiumStorageAccount: {
            required: false,
            readOnly: true,
            serializedName: 'properties.defaultPremiumStorageAccount',
            type: {
              name: 'String'
            }
          },
          artifactsStorageAccount: {
            required: false,
            readOnly: true,
            serializedName: 'properties.artifactsStorageAccount',
            type: {
              name: 'String'
            }
          },
          premiumDataDiskStorageAccount: {
            required: false,
            readOnly: true,
            serializedName: 'properties.premiumDataDiskStorageAccount',
            type: {
              name: 'String'
            }
          },
          vaultName: {
            required: false,
            readOnly: true,
            serializedName: 'properties.vaultName',
            type: {
              name: 'String'
            }
          },
          labStorageType: {
            required: false,
            serializedName: 'properties.labStorageType',
            type: {
              name: 'String'
            }
          },
          mandatoryArtifactsResourceIdsLinux: {
            required: false,
            serializedName: 'properties.mandatoryArtifactsResourceIdsLinux',
            type: {
              name: 'Sequence',
              element: {
                  required: false,
                  serializedName: 'StringElementType',
                  type: {
                    name: 'String'
                  }
              }
            }
          },
          mandatoryArtifactsResourceIdsWindows: {
            required: false,
            serializedName: 'properties.mandatoryArtifactsResourceIdsWindows',
            type: {
              name: 'Sequence',
              element: {
                  required: false,
                  serializedName: 'StringElementType',
                  type: {
                    name: 'String'
                  }
              }
            }
          },
          createdDate: {
            required: false,
            readOnly: true,
            serializedName: 'properties.createdDate',
            type: {
              name: 'DateTime'
            }
          },
          premiumDataDisks: {
            required: false,
            serializedName: 'properties.premiumDataDisks',
            type: {
              name: 'String'
            }
          },
          environmentPermission: {
            required: false,
            serializedName: 'properties.environmentPermission',
            type: {
              name: 'String'
            }
          },
          announcement: {
            required: false,
            serializedName: 'properties.announcement',
            type: {
              name: 'Composite',
              className: 'LabAnnouncementProperties'
            }
          },
          support: {
            required: false,
            serializedName: 'properties.support',
            type: {
              name: 'Composite',
              className: 'LabSupportProperties'
            }
          },
          vmCreationResourceGroup: {
            required: false,
            readOnly: true,
            serializedName: 'properties.vmCreationResourceGroup',
            type: {
              name: 'String'
            }
          },
          publicIpId: {
            required: false,
            readOnly: true,
            serializedName: 'properties.publicIpId',
            type: {
              name: 'String'
            }
          },
          loadBalancerId: {
            required: false,
            readOnly: true,
            serializedName: 'properties.loadBalancerId',
            type: {
              name: 'String'
            }
          },
          networkSecurityGroupId: {
            required: false,
            readOnly: true,
            serializedName: 'properties.networkSecurityGroupId',
            type: {
              name: 'String'
            }
          },
          extendedProperties: {
            required: false,
            serializedName: 'properties.extendedProperties',
            type: {
              name: 'Dictionary',
              value: {
                  required: false,
                  serializedName: 'StringElementType',
                  type: {
                    name: 'String'
                  }
              }
            }
          },
          provisioningState: {
            required: false,
            readOnly: true,
            serializedName: 'properties.provisioningState',
            type: {
              name: 'String'
            }
          },
          uniqueIdentifier: {
            required: false,
            readOnly: true,
            serializedName: 'properties.uniqueIdentifier',
            type: {
              name: 'String'
            }
          }
        }
      }
    };
  }
}

module.exports = Lab;
