// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
// Code generated by Microsoft (R) AutoRest Code Generator.

package com.azure.resourcemanager.appcontainers.fluent.models;

import com.azure.core.annotation.Fluent;
import com.azure.resourcemanager.appcontainers.models.AppLogsConfiguration;
import com.azure.resourcemanager.appcontainers.models.CustomDomainConfiguration;
import com.azure.resourcemanager.appcontainers.models.DaprConfiguration;
import com.azure.resourcemanager.appcontainers.models.EnvironmentProvisioningState;
import com.azure.resourcemanager.appcontainers.models.KedaConfiguration;
import com.azure.resourcemanager.appcontainers.models.VnetConfiguration;
import com.azure.resourcemanager.appcontainers.models.WorkloadProfile;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

/** Managed environment resource specific properties. */
@Fluent
public final class ManagedEnvironmentProperties {
    /*
     * Provisioning state of the Environment.
     */
    @JsonProperty(value = "provisioningState", access = JsonProperty.Access.WRITE_ONLY)
    private EnvironmentProvisioningState provisioningState;

    /*
     * Azure Monitor instrumentation key used by Dapr to export Service to Service communication telemetry
     */
    @JsonProperty(value = "daprAIInstrumentationKey")
    private String daprAIInstrumentationKey;

    /*
     * Application Insights connection string used by Dapr to export Service to Service communication telemetry
     */
    @JsonProperty(value = "daprAIConnectionString")
    private String daprAIConnectionString;

    /*
     * Vnet configuration for the environment
     */
    @JsonProperty(value = "vnetConfiguration")
    private VnetConfiguration vnetConfiguration;

    /*
     * Any errors that occurred during deployment or deployment validation
     */
    @JsonProperty(value = "deploymentErrors", access = JsonProperty.Access.WRITE_ONLY)
    private String deploymentErrors;

    /*
     * Default Domain Name for the cluster
     */
    @JsonProperty(value = "defaultDomain", access = JsonProperty.Access.WRITE_ONLY)
    private String defaultDomain;

    /*
     * Static IP of the Environment
     */
    @JsonProperty(value = "staticIp", access = JsonProperty.Access.WRITE_ONLY)
    private String staticIp;

    /*
     * Cluster configuration which enables the log daemon to export
     * app logs to a destination. Currently only "log-analytics" is
     * supported
     */
    @JsonProperty(value = "appLogsConfiguration")
    private AppLogsConfiguration appLogsConfiguration;

    /*
     * Whether or not this Managed Environment is zone-redundant.
     */
    @JsonProperty(value = "zoneRedundant")
    private Boolean zoneRedundant;

    /*
     * Custom domain configuration for the environment
     */
    @JsonProperty(value = "customDomainConfiguration")
    private CustomDomainConfiguration customDomainConfiguration;

    /*
     * The endpoint of the eventstream of the Environment.
     */
    @JsonProperty(value = "eventStreamEndpoint", access = JsonProperty.Access.WRITE_ONLY)
    private String eventStreamEndpoint;

    /*
     * Workload profiles configured for the Managed Environment.
     */
    @JsonProperty(value = "workloadProfiles")
    private List<WorkloadProfile> workloadProfiles;

    /*
     * The configuration of Keda component.
     */
    @JsonProperty(value = "kedaConfiguration")
    private KedaConfiguration kedaConfiguration;

    /*
     * The configuration of Dapr component.
     */
    @JsonProperty(value = "daprConfiguration")
    private DaprConfiguration daprConfiguration;

    /*
     * Name of the platform-managed resource group created for the Managed Environment to host infrastructure
     * resources. If a subnet ID is provided, this resource group will be created in the same subscription as the
     * subnet.
     */
    @JsonProperty(value = "infrastructureResourceGroup")
    private String infrastructureResourceGroup;

    /** Creates an instance of ManagedEnvironmentProperties class. */
    public ManagedEnvironmentProperties() {
    }

    /**
     * Get the provisioningState property: Provisioning state of the Environment.
     *
     * @return the provisioningState value.
     */
    public EnvironmentProvisioningState provisioningState() {
        return this.provisioningState;
    }

    /**
     * Get the daprAIInstrumentationKey property: Azure Monitor instrumentation key used by Dapr to export Service to
     * Service communication telemetry.
     *
     * @return the daprAIInstrumentationKey value.
     */
    public String daprAIInstrumentationKey() {
        return this.daprAIInstrumentationKey;
    }

    /**
     * Set the daprAIInstrumentationKey property: Azure Monitor instrumentation key used by Dapr to export Service to
     * Service communication telemetry.
     *
     * @param daprAIInstrumentationKey the daprAIInstrumentationKey value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withDaprAIInstrumentationKey(String daprAIInstrumentationKey) {
        this.daprAIInstrumentationKey = daprAIInstrumentationKey;
        return this;
    }

    /**
     * Get the daprAIConnectionString property: Application Insights connection string used by Dapr to export Service to
     * Service communication telemetry.
     *
     * @return the daprAIConnectionString value.
     */
    public String daprAIConnectionString() {
        return this.daprAIConnectionString;
    }

    /**
     * Set the daprAIConnectionString property: Application Insights connection string used by Dapr to export Service to
     * Service communication telemetry.
     *
     * @param daprAIConnectionString the daprAIConnectionString value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withDaprAIConnectionString(String daprAIConnectionString) {
        this.daprAIConnectionString = daprAIConnectionString;
        return this;
    }

    /**
     * Get the vnetConfiguration property: Vnet configuration for the environment.
     *
     * @return the vnetConfiguration value.
     */
    public VnetConfiguration vnetConfiguration() {
        return this.vnetConfiguration;
    }

    /**
     * Set the vnetConfiguration property: Vnet configuration for the environment.
     *
     * @param vnetConfiguration the vnetConfiguration value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withVnetConfiguration(VnetConfiguration vnetConfiguration) {
        this.vnetConfiguration = vnetConfiguration;
        return this;
    }

    /**
     * Get the deploymentErrors property: Any errors that occurred during deployment or deployment validation.
     *
     * @return the deploymentErrors value.
     */
    public String deploymentErrors() {
        return this.deploymentErrors;
    }

    /**
     * Get the defaultDomain property: Default Domain Name for the cluster.
     *
     * @return the defaultDomain value.
     */
    public String defaultDomain() {
        return this.defaultDomain;
    }

    /**
     * Get the staticIp property: Static IP of the Environment.
     *
     * @return the staticIp value.
     */
    public String staticIp() {
        return this.staticIp;
    }

    /**
     * Get the appLogsConfiguration property: Cluster configuration which enables the log daemon to export app logs to a
     * destination. Currently only "log-analytics" is supported.
     *
     * @return the appLogsConfiguration value.
     */
    public AppLogsConfiguration appLogsConfiguration() {
        return this.appLogsConfiguration;
    }

    /**
     * Set the appLogsConfiguration property: Cluster configuration which enables the log daemon to export app logs to a
     * destination. Currently only "log-analytics" is supported.
     *
     * @param appLogsConfiguration the appLogsConfiguration value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withAppLogsConfiguration(AppLogsConfiguration appLogsConfiguration) {
        this.appLogsConfiguration = appLogsConfiguration;
        return this;
    }

    /**
     * Get the zoneRedundant property: Whether or not this Managed Environment is zone-redundant.
     *
     * @return the zoneRedundant value.
     */
    public Boolean zoneRedundant() {
        return this.zoneRedundant;
    }

    /**
     * Set the zoneRedundant property: Whether or not this Managed Environment is zone-redundant.
     *
     * @param zoneRedundant the zoneRedundant value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withZoneRedundant(Boolean zoneRedundant) {
        this.zoneRedundant = zoneRedundant;
        return this;
    }

    /**
     * Get the customDomainConfiguration property: Custom domain configuration for the environment.
     *
     * @return the customDomainConfiguration value.
     */
    public CustomDomainConfiguration customDomainConfiguration() {
        return this.customDomainConfiguration;
    }

    /**
     * Set the customDomainConfiguration property: Custom domain configuration for the environment.
     *
     * @param customDomainConfiguration the customDomainConfiguration value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withCustomDomainConfiguration(
        CustomDomainConfiguration customDomainConfiguration) {
        this.customDomainConfiguration = customDomainConfiguration;
        return this;
    }

    /**
     * Get the eventStreamEndpoint property: The endpoint of the eventstream of the Environment.
     *
     * @return the eventStreamEndpoint value.
     */
    public String eventStreamEndpoint() {
        return this.eventStreamEndpoint;
    }

    /**
     * Get the workloadProfiles property: Workload profiles configured for the Managed Environment.
     *
     * @return the workloadProfiles value.
     */
    public List<WorkloadProfile> workloadProfiles() {
        return this.workloadProfiles;
    }

    /**
     * Set the workloadProfiles property: Workload profiles configured for the Managed Environment.
     *
     * @param workloadProfiles the workloadProfiles value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withWorkloadProfiles(List<WorkloadProfile> workloadProfiles) {
        this.workloadProfiles = workloadProfiles;
        return this;
    }

    /**
     * Get the kedaConfiguration property: The configuration of Keda component.
     *
     * @return the kedaConfiguration value.
     */
    public KedaConfiguration kedaConfiguration() {
        return this.kedaConfiguration;
    }

    /**
     * Set the kedaConfiguration property: The configuration of Keda component.
     *
     * @param kedaConfiguration the kedaConfiguration value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withKedaConfiguration(KedaConfiguration kedaConfiguration) {
        this.kedaConfiguration = kedaConfiguration;
        return this;
    }

    /**
     * Get the daprConfiguration property: The configuration of Dapr component.
     *
     * @return the daprConfiguration value.
     */
    public DaprConfiguration daprConfiguration() {
        return this.daprConfiguration;
    }

    /**
     * Set the daprConfiguration property: The configuration of Dapr component.
     *
     * @param daprConfiguration the daprConfiguration value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withDaprConfiguration(DaprConfiguration daprConfiguration) {
        this.daprConfiguration = daprConfiguration;
        return this;
    }

    /**
     * Get the infrastructureResourceGroup property: Name of the platform-managed resource group created for the Managed
     * Environment to host infrastructure resources. If a subnet ID is provided, this resource group will be created in
     * the same subscription as the subnet.
     *
     * @return the infrastructureResourceGroup value.
     */
    public String infrastructureResourceGroup() {
        return this.infrastructureResourceGroup;
    }

    /**
     * Set the infrastructureResourceGroup property: Name of the platform-managed resource group created for the Managed
     * Environment to host infrastructure resources. If a subnet ID is provided, this resource group will be created in
     * the same subscription as the subnet.
     *
     * @param infrastructureResourceGroup the infrastructureResourceGroup value to set.
     * @return the ManagedEnvironmentProperties object itself.
     */
    public ManagedEnvironmentProperties withInfrastructureResourceGroup(String infrastructureResourceGroup) {
        this.infrastructureResourceGroup = infrastructureResourceGroup;
        return this;
    }

    /**
     * Validates the instance.
     *
     * @throws IllegalArgumentException thrown if the instance is not valid.
     */
    public void validate() {
        if (vnetConfiguration() != null) {
            vnetConfiguration().validate();
        }
        if (appLogsConfiguration() != null) {
            appLogsConfiguration().validate();
        }
        if (customDomainConfiguration() != null) {
            customDomainConfiguration().validate();
        }
        if (workloadProfiles() != null) {
            workloadProfiles().forEach(e -> e.validate());
        }
        if (kedaConfiguration() != null) {
            kedaConfiguration().validate();
        }
        if (daprConfiguration() != null) {
            daprConfiguration().validate();
        }
    }
}
