package insights

// Copyright (c) Microsoft and contributors.  All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Code generated by Microsoft (R) AutoRest Code Generator 1.0.1.0
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.

import (
	"github.com/Azure/go-autorest/autorest"
	"github.com/Azure/go-autorest/autorest/date"
	"github.com/Azure/go-autorest/autorest/to"
	"net/http"
)

// ComparisonOperationType enumerates the values for comparison operation type.
type ComparisonOperationType string

const (
	// Equals specifies the equals state for comparison operation type.
	Equals ComparisonOperationType = "Equals"
	// GreaterThan specifies the greater than state for comparison operation
	// type.
	GreaterThan ComparisonOperationType = "GreaterThan"
	// GreaterThanOrEqual specifies the greater than or equal state for
	// comparison operation type.
	GreaterThanOrEqual ComparisonOperationType = "GreaterThanOrEqual"
	// LessThan specifies the less than state for comparison operation type.
	LessThan ComparisonOperationType = "LessThan"
	// LessThanOrEqual specifies the less than or equal state for comparison
	// operation type.
	LessThanOrEqual ComparisonOperationType = "LessThanOrEqual"
	// NotEquals specifies the not equals state for comparison operation type.
	NotEquals ComparisonOperationType = "NotEquals"
)

// ConditionOperator enumerates the values for condition operator.
type ConditionOperator string

const (
	// ConditionOperatorGreaterThan specifies the condition operator greater
	// than state for condition operator.
	ConditionOperatorGreaterThan ConditionOperator = "GreaterThan"
	// ConditionOperatorGreaterThanOrEqual specifies the condition operator
	// greater than or equal state for condition operator.
	ConditionOperatorGreaterThanOrEqual ConditionOperator = "GreaterThanOrEqual"
	// ConditionOperatorLessThan specifies the condition operator less than
	// state for condition operator.
	ConditionOperatorLessThan ConditionOperator = "LessThan"
	// ConditionOperatorLessThanOrEqual specifies the condition operator less
	// than or equal state for condition operator.
	ConditionOperatorLessThanOrEqual ConditionOperator = "LessThanOrEqual"
)

// MetricStatisticType enumerates the values for metric statistic type.
type MetricStatisticType string

const (
	// Average specifies the average state for metric statistic type.
	Average MetricStatisticType = "Average"
	// Max specifies the max state for metric statistic type.
	Max MetricStatisticType = "Max"
	// Min specifies the min state for metric statistic type.
	Min MetricStatisticType = "Min"
	// Sum specifies the sum state for metric statistic type.
	Sum MetricStatisticType = "Sum"
)

// RecurrenceFrequency enumerates the values for recurrence frequency.
type RecurrenceFrequency string

const (
	// Day specifies the day state for recurrence frequency.
	Day RecurrenceFrequency = "Day"
	// Hour specifies the hour state for recurrence frequency.
	Hour RecurrenceFrequency = "Hour"
	// Minute specifies the minute state for recurrence frequency.
	Minute RecurrenceFrequency = "Minute"
	// Month specifies the month state for recurrence frequency.
	Month RecurrenceFrequency = "Month"
	// None specifies the none state for recurrence frequency.
	None RecurrenceFrequency = "None"
	// Second specifies the second state for recurrence frequency.
	Second RecurrenceFrequency = "Second"
	// Week specifies the week state for recurrence frequency.
	Week RecurrenceFrequency = "Week"
	// Year specifies the year state for recurrence frequency.
	Year RecurrenceFrequency = "Year"
)

// ScaleDirection enumerates the values for scale direction.
type ScaleDirection string

const (
	// ScaleDirectionDecrease specifies the scale direction decrease state for
	// scale direction.
	ScaleDirectionDecrease ScaleDirection = "Decrease"
	// ScaleDirectionIncrease specifies the scale direction increase state for
	// scale direction.
	ScaleDirectionIncrease ScaleDirection = "Increase"
	// ScaleDirectionNone specifies the scale direction none state for scale
	// direction.
	ScaleDirectionNone ScaleDirection = "None"
)

// ScaleType enumerates the values for scale type.
type ScaleType string

const (
	// ChangeCount specifies the change count state for scale type.
	ChangeCount ScaleType = "ChangeCount"
	// ExactCount specifies the exact count state for scale type.
	ExactCount ScaleType = "ExactCount"
	// PercentChangeCount specifies the percent change count state for scale
	// type.
	PercentChangeCount ScaleType = "PercentChangeCount"
)

// TimeAggregationOperator enumerates the values for time aggregation operator.
type TimeAggregationOperator string

const (
	// TimeAggregationOperatorAverage specifies the time aggregation operator
	// average state for time aggregation operator.
	TimeAggregationOperatorAverage TimeAggregationOperator = "Average"
	// TimeAggregationOperatorLast specifies the time aggregation operator last
	// state for time aggregation operator.
	TimeAggregationOperatorLast TimeAggregationOperator = "Last"
	// TimeAggregationOperatorMaximum specifies the time aggregation operator
	// maximum state for time aggregation operator.
	TimeAggregationOperatorMaximum TimeAggregationOperator = "Maximum"
	// TimeAggregationOperatorMinimum specifies the time aggregation operator
	// minimum state for time aggregation operator.
	TimeAggregationOperatorMinimum TimeAggregationOperator = "Minimum"
	// TimeAggregationOperatorTotal specifies the time aggregation operator
	// total state for time aggregation operator.
	TimeAggregationOperatorTotal TimeAggregationOperator = "Total"
)

// TimeAggregationType enumerates the values for time aggregation type.
type TimeAggregationType string

const (
	// TimeAggregationTypeAverage specifies the time aggregation type average
	// state for time aggregation type.
	TimeAggregationTypeAverage TimeAggregationType = "Average"
	// TimeAggregationTypeCount specifies the time aggregation type count state
	// for time aggregation type.
	TimeAggregationTypeCount TimeAggregationType = "Count"
	// TimeAggregationTypeMaximum specifies the time aggregation type maximum
	// state for time aggregation type.
	TimeAggregationTypeMaximum TimeAggregationType = "Maximum"
	// TimeAggregationTypeMinimum specifies the time aggregation type minimum
	// state for time aggregation type.
	TimeAggregationTypeMinimum TimeAggregationType = "Minimum"
	// TimeAggregationTypeTotal specifies the time aggregation type total state
	// for time aggregation type.
	TimeAggregationTypeTotal TimeAggregationType = "Total"
)

// AlertRule is an alert rule.
type AlertRule struct {
	Name            *string        `json:"name,omitempty"`
	Description     *string        `json:"description,omitempty"`
	IsEnabled       *bool          `json:"isEnabled,omitempty"`
	Condition       *RuleCondition `json:"condition,omitempty"`
	Actions         *[]RuleAction  `json:"actions,omitempty"`
	LastUpdatedTime *date.Time     `json:"lastUpdatedTime,omitempty"`
}

// AlertRuleResource is the alert rule resource.
type AlertRuleResource struct {
	autorest.Response `json:"-"`
	ID                *string             `json:"id,omitempty"`
	Name              *string             `json:"name,omitempty"`
	Type              *string             `json:"type,omitempty"`
	Location          *string             `json:"location,omitempty"`
	Tags              *map[string]*string `json:"tags,omitempty"`
	*AlertRule        `json:"properties,omitempty"`
}

// AlertRuleResourceCollection is represents a collection of alert rule
// resources.
type AlertRuleResourceCollection struct {
	autorest.Response `json:"-"`
	Value             *[]AlertRuleResource `json:"value,omitempty"`
}

// AutoscaleNotification is autoscale notification.
type AutoscaleNotification struct {
	Operation *string                `json:"operation,omitempty"`
	Email     *EmailNotification     `json:"email,omitempty"`
	Webhooks  *[]WebhookNotification `json:"webhooks,omitempty"`
}

// AutoscaleProfile is autoscale profile.
type AutoscaleProfile struct {
	Name       *string        `json:"name,omitempty"`
	Capacity   *ScaleCapacity `json:"capacity,omitempty"`
	Rules      *[]ScaleRule   `json:"rules,omitempty"`
	FixedDate  *TimeWindow    `json:"fixedDate,omitempty"`
	Recurrence *Recurrence    `json:"recurrence,omitempty"`
}

// AutoscaleSetting is a setting that contains all of the configuration for the
// automatic scaling of a resource.
type AutoscaleSetting struct {
	Profiles          *[]AutoscaleProfile      `json:"profiles,omitempty"`
	Notifications     *[]AutoscaleNotification `json:"notifications,omitempty"`
	Enabled           *bool                    `json:"enabled,omitempty"`
	Name              *string                  `json:"name,omitempty"`
	TargetResourceURI *string                  `json:"targetResourceUri,omitempty"`
}

// AutoscaleSettingResource is the autoscale setting resource.
type AutoscaleSettingResource struct {
	autorest.Response `json:"-"`
	ID                *string             `json:"id,omitempty"`
	Name              *string             `json:"name,omitempty"`
	Type              *string             `json:"type,omitempty"`
	Location          *string             `json:"location,omitempty"`
	Tags              *map[string]*string `json:"tags,omitempty"`
	*AutoscaleSetting `json:"properties,omitempty"`
}

// AutoscaleSettingResourceCollection is represents a collection of autoscale
// setting resources.
type AutoscaleSettingResourceCollection struct {
	autorest.Response `json:"-"`
	Value             *[]AutoscaleSettingResource `json:"value,omitempty"`
	NextLink          *string                     `json:"nextLink,omitempty"`
}

// AutoscaleSettingResourceCollectionPreparer prepares a request to retrieve the next set of results. It returns
// nil if no more results exist.
func (client AutoscaleSettingResourceCollection) AutoscaleSettingResourceCollectionPreparer() (*http.Request, error) {
	if client.NextLink == nil || len(to.String(client.NextLink)) <= 0 {
		return nil, nil
	}
	return autorest.Prepare(&http.Request{},
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(client.NextLink)))
}

// EmailNotification is email notification of an autoscale event.
type EmailNotification struct {
	SendToSubscriptionAdministrator    *bool     `json:"sendToSubscriptionAdministrator,omitempty"`
	SendToSubscriptionCoAdministrators *bool     `json:"sendToSubscriptionCoAdministrators,omitempty"`
	CustomEmails                       *[]string `json:"customEmails,omitempty"`
}

// Incident is an alert incident indicates the activation status of an alert
// rule.
type Incident struct {
	autorest.Response `json:"-"`
	Name              *string    `json:"name,omitempty"`
	RuleName          *string    `json:"ruleName,omitempty"`
	IsActive          *bool      `json:"isActive,omitempty"`
	ActivatedTime     *date.Time `json:"activatedTime,omitempty"`
	ResolvedTime      *date.Time `json:"resolvedTime,omitempty"`
}

// IncidentListResult is the List incidents operation response.
type IncidentListResult struct {
	autorest.Response `json:"-"`
	Value             *[]Incident `json:"value,omitempty"`
}

// LocationThresholdRuleCondition is a rule condition based on a certain number
// of locations failing.
type LocationThresholdRuleCondition struct {
	DataSource          *RuleDataSource `json:"dataSource,omitempty"`
	WindowSize          *string         `json:"windowSize,omitempty"`
	FailedLocationCount *int32          `json:"failedLocationCount,omitempty"`
}

// LogProfileCollection is represents a collection of log profiles.
type LogProfileCollection struct {
	autorest.Response `json:"-"`
	Value             *[]LogProfileResource `json:"value,omitempty"`
}

// LogProfileProperties is the log profile properties.
type LogProfileProperties struct {
	StorageAccountID *string          `json:"storageAccountId,omitempty"`
	ServiceBusRuleID *string          `json:"serviceBusRuleId,omitempty"`
	Locations        *[]string        `json:"locations,omitempty"`
	Categories       *[]string        `json:"categories,omitempty"`
	RetentionPolicy  *RetentionPolicy `json:"retentionPolicy,omitempty"`
}

// LogProfileResource is the log profile resource.
type LogProfileResource struct {
	autorest.Response     `json:"-"`
	ID                    *string             `json:"id,omitempty"`
	Name                  *string             `json:"name,omitempty"`
	Type                  *string             `json:"type,omitempty"`
	Location              *string             `json:"location,omitempty"`
	Tags                  *map[string]*string `json:"tags,omitempty"`
	*LogProfileProperties `json:"properties,omitempty"`
}

// LogSettings is part of MultiTenantDiagnosticSettings. Specifies the settings
// for a particular log.
type LogSettings struct {
	Category        *string          `json:"category,omitempty"`
	Enabled         *bool            `json:"enabled,omitempty"`
	RetentionPolicy *RetentionPolicy `json:"retentionPolicy,omitempty"`
}

// ManagementEventAggregationCondition is how the data that is collected should
// be combined over time.
type ManagementEventAggregationCondition struct {
	Operator   ConditionOperator `json:"operator,omitempty"`
	Threshold  *float64          `json:"threshold,omitempty"`
	WindowSize *string           `json:"windowSize,omitempty"`
}

// ManagementEventRuleCondition is a management event rule condition.
type ManagementEventRuleCondition struct {
	DataSource  *RuleDataSource                      `json:"dataSource,omitempty"`
	Aggregation *ManagementEventAggregationCondition `json:"aggregation,omitempty"`
}

// MetricSettings is part of MultiTenantDiagnosticSettings. Specifies the
// settings for a particular metric.
type MetricSettings struct {
	TimeGrain       *string          `json:"timeGrain,omitempty"`
	Enabled         *bool            `json:"enabled,omitempty"`
	RetentionPolicy *RetentionPolicy `json:"retentionPolicy,omitempty"`
}

// MetricTrigger is the trigger that results in a scaling action.
type MetricTrigger struct {
	MetricName        *string                 `json:"metricName,omitempty"`
	MetricResourceURI *string                 `json:"metricResourceUri,omitempty"`
	TimeGrain         *string                 `json:"timeGrain,omitempty"`
	Statistic         MetricStatisticType     `json:"statistic,omitempty"`
	TimeWindow        *string                 `json:"timeWindow,omitempty"`
	TimeAggregation   TimeAggregationType     `json:"timeAggregation,omitempty"`
	Operator          ComparisonOperationType `json:"operator,omitempty"`
	Threshold         *float64                `json:"threshold,omitempty"`
}

// Recurrence is the repeating times at which this profile begins. This element
// is not used if the FixedDate element is used.
type Recurrence struct {
	Frequency RecurrenceFrequency `json:"frequency,omitempty"`
	Schedule  *RecurrentSchedule  `json:"schedule,omitempty"`
}

// RecurrentSchedule is the scheduling constraints for when the profile begins.
type RecurrentSchedule struct {
	TimeZone *string   `json:"timeZone,omitempty"`
	Days     *[]string `json:"days,omitempty"`
	Hours    *[]int32  `json:"hours,omitempty"`
	Minutes  *[]int32  `json:"minutes,omitempty"`
}

// Resource is an azure resource object
type Resource struct {
	ID       *string             `json:"id,omitempty"`
	Name     *string             `json:"name,omitempty"`
	Type     *string             `json:"type,omitempty"`
	Location *string             `json:"location,omitempty"`
	Tags     *map[string]*string `json:"tags,omitempty"`
}

// RetentionPolicy is specifies the retention policy for the log.
type RetentionPolicy struct {
	Enabled *bool  `json:"enabled,omitempty"`
	Days    *int32 `json:"days,omitempty"`
}

// RuleAction is the action that is performed when the alert rule becomes
// active, and when an alert condition is resolved.
type RuleAction struct {
}

// RuleCondition is the condition that results in the alert rule being
// activated.
type RuleCondition struct {
}

// RuleDataSource is the resource from which the rule collects its data.
type RuleDataSource struct {
}

// RuleEmailAction is specifies the action to send email when the rule
// condition is evaluated. The discriminator is always RuleEmailAction in this
// case.
type RuleEmailAction struct {
	SendToServiceOwners *bool     `json:"sendToServiceOwners,omitempty"`
	CustomEmails        *[]string `json:"customEmails,omitempty"`
}

// RuleManagementEventClaimsDataSource is the claims for a rule management
// event data source.
type RuleManagementEventClaimsDataSource struct {
	EmailAddress *string `json:"emailAddress,omitempty"`
}

// RuleManagementEventDataSource is a rule management event data source. The
// discriminator fields is always RuleManagementEventDataSource in this case.
type RuleManagementEventDataSource struct {
	EventName            *string                              `json:"eventName,omitempty"`
	EventSource          *string                              `json:"eventSource,omitempty"`
	Level                *string                              `json:"level,omitempty"`
	OperationName        *string                              `json:"operationName,omitempty"`
	ResourceGroupName    *string                              `json:"resourceGroupName,omitempty"`
	ResourceProviderName *string                              `json:"resourceProviderName,omitempty"`
	ResourceURI          *string                              `json:"resourceUri,omitempty"`
	Status               *string                              `json:"status,omitempty"`
	SubStatus            *string                              `json:"subStatus,omitempty"`
	Claims               *RuleManagementEventClaimsDataSource `json:"claims,omitempty"`
}

// RuleMetricDataSource is a rule metric data source. The discriminator value
// is always RuleMetricDataSource in this case.
type RuleMetricDataSource struct {
	ResourceURI *string `json:"resourceUri,omitempty"`
	MetricName  *string `json:"metricName,omitempty"`
}

// RuleWebhookAction is specifies the action to post to service when the rule
// condition is evaluated. The discriminator is always RuleWebhookAction in
// this case.
type RuleWebhookAction struct {
	ServiceURI *string             `json:"serviceUri,omitempty"`
	Properties *map[string]*string `json:"properties,omitempty"`
}

// ScaleAction is the parameters for the scaling action.
type ScaleAction struct {
	Direction ScaleDirection `json:"direction,omitempty"`
	Type      ScaleType      `json:"type,omitempty"`
	Value     *string        `json:"value,omitempty"`
	Cooldown  *string        `json:"cooldown,omitempty"`
}

// ScaleCapacity is the number of instances that can be used during this
// profile.
type ScaleCapacity struct {
	Minimum *string `json:"minimum,omitempty"`
	Maximum *string `json:"maximum,omitempty"`
	Default *string `json:"default,omitempty"`
}

// ScaleRule is a rule that provide the triggers and parameters for the scaling
// action.
type ScaleRule struct {
	MetricTrigger *MetricTrigger `json:"metricTrigger,omitempty"`
	ScaleAction   *ScaleAction   `json:"scaleAction,omitempty"`
}

// ServiceDiagnosticSettings is the diagnostic settings for service.
type ServiceDiagnosticSettings struct {
	StorageAccountID *string           `json:"storageAccountId,omitempty"`
	ServiceBusRuleID *string           `json:"serviceBusRuleId,omitempty"`
	Metrics          *[]MetricSettings `json:"metrics,omitempty"`
	Logs             *[]LogSettings    `json:"logs,omitempty"`
	WorkspaceID      *string           `json:"workspaceId,omitempty"`
}

// ServiceDiagnosticSettingsResource is description of a service diagnostic
// setting
type ServiceDiagnosticSettingsResource struct {
	autorest.Response          `json:"-"`
	ID                         *string             `json:"id,omitempty"`
	Name                       *string             `json:"name,omitempty"`
	Type                       *string             `json:"type,omitempty"`
	Location                   *string             `json:"location,omitempty"`
	Tags                       *map[string]*string `json:"tags,omitempty"`
	*ServiceDiagnosticSettings `json:"properties,omitempty"`
}

// ThresholdRuleCondition is a rule condition based on a metric crossing a
// threshold.
type ThresholdRuleCondition struct {
	DataSource      *RuleDataSource         `json:"dataSource,omitempty"`
	Operator        ConditionOperator       `json:"operator,omitempty"`
	Threshold       *float64                `json:"threshold,omitempty"`
	WindowSize      *string                 `json:"windowSize,omitempty"`
	TimeAggregation TimeAggregationOperator `json:"timeAggregation,omitempty"`
}

// TimeWindow is a specific date-time for the profile.
type TimeWindow struct {
	TimeZone *string    `json:"timeZone,omitempty"`
	Start    *date.Time `json:"start,omitempty"`
	End      *date.Time `json:"end,omitempty"`
}

// WebhookNotification is webhook notification of an autoscale event.
type WebhookNotification struct {
	ServiceURI *string             `json:"serviceUri,omitempty"`
	Properties *map[string]*string `json:"properties,omitempty"`
}
