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

package com.azure.resourcemanager.networkcloud.models;

import com.azure.core.management.Region;
import com.azure.core.management.SystemData;
import com.azure.core.util.Context;
import com.azure.resourcemanager.networkcloud.fluent.models.AgentPoolInner;
import java.util.List;
import java.util.Map;

/** An immutable client-side representation of AgentPool. */
public interface AgentPool {
    /**
     * Gets the id property: Fully qualified resource Id for the resource.
     *
     * @return the id value.
     */
    String id();

    /**
     * Gets the name property: The name of the resource.
     *
     * @return the name value.
     */
    String name();

    /**
     * Gets the type property: The type of the resource.
     *
     * @return the type value.
     */
    String type();

    /**
     * Gets the location property: The geo-location where the resource lives.
     *
     * @return the location value.
     */
    String location();

    /**
     * Gets the tags property: Resource tags.
     *
     * @return the tags value.
     */
    Map<String, String> tags();

    /**
     * Gets the extendedLocation property: ExtendedLocation represents the Azure custom location where the resource will
     * be created.
     *
     * <p>The extended location of the cluster associated with the resource.
     *
     * @return the extendedLocation value.
     */
    ExtendedLocation extendedLocation();

    /**
     * Gets the systemData property: Azure Resource Manager metadata containing createdBy and modifiedBy information.
     *
     * @return the systemData value.
     */
    SystemData systemData();

    /**
     * Gets the administratorConfiguration property: AdministratorConfiguration represents the administrative
     * credentials that will be applied to the control plane and agent pool nodes in Kubernetes clusters.
     *
     * <p>The administrator credentials to be used for the nodes in this agent pool.
     *
     * @return the administratorConfiguration value.
     */
    AdministratorConfiguration administratorConfiguration();

    /**
     * Gets the agentOptions property: AgentOptions are configurations that will be applied to each agent in an agent
     * pool.
     *
     * <p>The configurations that will be applied to each agent in this agent pool.
     *
     * @return the agentOptions value.
     */
    AgentOptions agentOptions();

    /**
     * Gets the attachedNetworkConfiguration property: AttachedNetworkConfiguration represents the set of workload
     * networks to attach to a resource.
     *
     * <p>The configuration of networks being attached to the agent pool for use by the workloads that run on this
     * Kubernetes cluster.
     *
     * @return the attachedNetworkConfiguration value.
     */
    AttachedNetworkConfiguration attachedNetworkConfiguration();

    /**
     * Gets the availabilityZones property: The list of availability zones of the Network Cloud cluster used for the
     * provisioning of nodes in this agent pool. If not specified, all availability zones will be used.
     *
     * @return the availabilityZones value.
     */
    List<String> availabilityZones();

    /**
     * Gets the count property: The number of virtual machines that use this configuration.
     *
     * @return the count value.
     */
    long count();

    /**
     * Gets the detailedStatus property: The current status of the agent pool.
     *
     * @return the detailedStatus value.
     */
    AgentPoolDetailedStatus detailedStatus();

    /**
     * Gets the detailedStatusMessage property: The descriptive message about the current detailed status.
     *
     * @return the detailedStatusMessage value.
     */
    String detailedStatusMessage();

    /**
     * Gets the kubernetesVersion property: The Kubernetes version running in this agent pool.
     *
     * @return the kubernetesVersion value.
     */
    String kubernetesVersion();

    /**
     * Gets the labels property: The labels applied to the nodes in this agent pool.
     *
     * @return the labels value.
     */
    List<KubernetesLabel> labels();

    /**
     * Gets the mode property: The selection of how this agent pool is utilized, either as a system pool or a user pool.
     * System pools run the features and critical services for the Kubernetes Cluster, while user pools are dedicated to
     * user workloads. Every Kubernetes cluster must contain at least one system node pool with at least one node.
     *
     * @return the mode value.
     */
    AgentPoolMode mode();

    /**
     * Gets the provisioningState property: The provisioning state of the agent pool.
     *
     * @return the provisioningState value.
     */
    AgentPoolProvisioningState provisioningState();

    /**
     * Gets the taints property: The taints applied to the nodes in this agent pool.
     *
     * @return the taints value.
     */
    List<KubernetesLabel> taints();

    /**
     * Gets the upgradeSettings property: AgentPoolUpgradeSettings specifies the upgrade settings for an agent pool.
     *
     * <p>The configuration of the agent pool.
     *
     * @return the upgradeSettings value.
     */
    AgentPoolUpgradeSettings upgradeSettings();

    /**
     * Gets the vmSkuName property: The name of the VM SKU that determines the size of resources allocated for node VMs.
     *
     * @return the vmSkuName value.
     */
    String vmSkuName();

    /**
     * Gets the region of the resource.
     *
     * @return the region of the resource.
     */
    Region region();

    /**
     * Gets the name of the resource region.
     *
     * @return the name of the resource region.
     */
    String regionName();

    /**
     * Gets the name of the resource group.
     *
     * @return the name of the resource group.
     */
    String resourceGroupName();

    /**
     * Gets the inner com.azure.resourcemanager.networkcloud.fluent.models.AgentPoolInner object.
     *
     * @return the inner object.
     */
    AgentPoolInner innerModel();

    /** The entirety of the AgentPool definition. */
    interface Definition
        extends DefinitionStages.Blank,
            DefinitionStages.WithLocation,
            DefinitionStages.WithParentResource,
            DefinitionStages.WithCount,
            DefinitionStages.WithMode,
            DefinitionStages.WithVmSkuName,
            DefinitionStages.WithCreate {
    }

    /** The AgentPool definition stages. */
    interface DefinitionStages {
        /** The first stage of the AgentPool definition. */
        interface Blank extends WithLocation {
        }

        /** The stage of the AgentPool definition allowing to specify location. */
        interface WithLocation {
            /**
             * Specifies the region for the resource.
             *
             * @param location The geo-location where the resource lives.
             * @return the next definition stage.
             */
            WithParentResource withRegion(Region location);

            /**
             * Specifies the region for the resource.
             *
             * @param location The geo-location where the resource lives.
             * @return the next definition stage.
             */
            WithParentResource withRegion(String location);
        }

        /** The stage of the AgentPool definition allowing to specify parent resource. */
        interface WithParentResource {
            /**
             * Specifies resourceGroupName, kubernetesClusterName.
             *
             * @param resourceGroupName The name of the resource group. The name is case insensitive.
             * @param kubernetesClusterName The name of the Kubernetes cluster.
             * @return the next definition stage.
             */
            WithCount withExistingKubernetesCluster(String resourceGroupName, String kubernetesClusterName);
        }

        /** The stage of the AgentPool definition allowing to specify count. */
        interface WithCount {
            /**
             * Specifies the count property: The number of virtual machines that use this configuration..
             *
             * @param count The number of virtual machines that use this configuration.
             * @return the next definition stage.
             */
            WithMode withCount(long count);
        }

        /** The stage of the AgentPool definition allowing to specify mode. */
        interface WithMode {
            /**
             * Specifies the mode property: The selection of how this agent pool is utilized, either as a system pool or
             * a user pool. System pools run the features and critical services for the Kubernetes Cluster, while user
             * pools are dedicated to user workloads. Every Kubernetes cluster must contain at least one system node
             * pool with at least one node..
             *
             * @param mode The selection of how this agent pool is utilized, either as a system pool or a user pool.
             *     System pools run the features and critical services for the Kubernetes Cluster, while user pools are
             *     dedicated to user workloads. Every Kubernetes cluster must contain at least one system node pool with
             *     at least one node.
             * @return the next definition stage.
             */
            WithVmSkuName withMode(AgentPoolMode mode);
        }

        /** The stage of the AgentPool definition allowing to specify vmSkuName. */
        interface WithVmSkuName {
            /**
             * Specifies the vmSkuName property: The name of the VM SKU that determines the size of resources allocated
             * for node VMs..
             *
             * @param vmSkuName The name of the VM SKU that determines the size of resources allocated for node VMs.
             * @return the next definition stage.
             */
            WithCreate withVmSkuName(String vmSkuName);
        }

        /**
         * The stage of the AgentPool definition which contains all the minimum required properties for the resource to
         * be created, but also allows for any other optional properties to be specified.
         */
        interface WithCreate
            extends DefinitionStages.WithTags,
                DefinitionStages.WithExtendedLocation,
                DefinitionStages.WithAdministratorConfiguration,
                DefinitionStages.WithAgentOptions,
                DefinitionStages.WithAttachedNetworkConfiguration,
                DefinitionStages.WithAvailabilityZones,
                DefinitionStages.WithLabels,
                DefinitionStages.WithTaints,
                DefinitionStages.WithUpgradeSettings {
            /**
             * Executes the create request.
             *
             * @return the created resource.
             */
            AgentPool create();

            /**
             * Executes the create request.
             *
             * @param context The context to associate with this operation.
             * @return the created resource.
             */
            AgentPool create(Context context);
        }

        /** The stage of the AgentPool definition allowing to specify tags. */
        interface WithTags {
            /**
             * Specifies the tags property: Resource tags..
             *
             * @param tags Resource tags.
             * @return the next definition stage.
             */
            WithCreate withTags(Map<String, String> tags);
        }

        /** The stage of the AgentPool definition allowing to specify extendedLocation. */
        interface WithExtendedLocation {
            /**
             * Specifies the extendedLocation property: ExtendedLocation represents the Azure custom location where the
             * resource will be created.
             *
             * <p>The extended location of the cluster associated with the resource..
             *
             * @param extendedLocation ExtendedLocation represents the Azure custom location where the resource will be
             *     created.
             *     <p>The extended location of the cluster associated with the resource.
             * @return the next definition stage.
             */
            WithCreate withExtendedLocation(ExtendedLocation extendedLocation);
        }

        /** The stage of the AgentPool definition allowing to specify administratorConfiguration. */
        interface WithAdministratorConfiguration {
            /**
             * Specifies the administratorConfiguration property: AdministratorConfiguration represents the
             * administrative credentials that will be applied to the control plane and agent pool nodes in Kubernetes
             * clusters.
             *
             * <p>The administrator credentials to be used for the nodes in this agent pool..
             *
             * @param administratorConfiguration AdministratorConfiguration represents the administrative credentials
             *     that will be applied to the control plane and agent pool nodes in Kubernetes clusters.
             *     <p>The administrator credentials to be used for the nodes in this agent pool.
             * @return the next definition stage.
             */
            WithCreate withAdministratorConfiguration(AdministratorConfiguration administratorConfiguration);
        }

        /** The stage of the AgentPool definition allowing to specify agentOptions. */
        interface WithAgentOptions {
            /**
             * Specifies the agentOptions property: AgentOptions are configurations that will be applied to each agent
             * in an agent pool.
             *
             * <p>The configurations that will be applied to each agent in this agent pool..
             *
             * @param agentOptions AgentOptions are configurations that will be applied to each agent in an agent pool.
             *     <p>The configurations that will be applied to each agent in this agent pool.
             * @return the next definition stage.
             */
            WithCreate withAgentOptions(AgentOptions agentOptions);
        }

        /** The stage of the AgentPool definition allowing to specify attachedNetworkConfiguration. */
        interface WithAttachedNetworkConfiguration {
            /**
             * Specifies the attachedNetworkConfiguration property: AttachedNetworkConfiguration represents the set of
             * workload networks to attach to a resource.
             *
             * <p>The configuration of networks being attached to the agent pool for use by the workloads that run on
             * this Kubernetes cluster..
             *
             * @param attachedNetworkConfiguration AttachedNetworkConfiguration represents the set of workload networks
             *     to attach to a resource.
             *     <p>The configuration of networks being attached to the agent pool for use by the workloads that run
             *     on this Kubernetes cluster.
             * @return the next definition stage.
             */
            WithCreate withAttachedNetworkConfiguration(AttachedNetworkConfiguration attachedNetworkConfiguration);
        }

        /** The stage of the AgentPool definition allowing to specify availabilityZones. */
        interface WithAvailabilityZones {
            /**
             * Specifies the availabilityZones property: The list of availability zones of the Network Cloud cluster
             * used for the provisioning of nodes in this agent pool. If not specified, all availability zones will be
             * used..
             *
             * @param availabilityZones The list of availability zones of the Network Cloud cluster used for the
             *     provisioning of nodes in this agent pool. If not specified, all availability zones will be used.
             * @return the next definition stage.
             */
            WithCreate withAvailabilityZones(List<String> availabilityZones);
        }

        /** The stage of the AgentPool definition allowing to specify labels. */
        interface WithLabels {
            /**
             * Specifies the labels property: The labels applied to the nodes in this agent pool..
             *
             * @param labels The labels applied to the nodes in this agent pool.
             * @return the next definition stage.
             */
            WithCreate withLabels(List<KubernetesLabel> labels);
        }

        /** The stage of the AgentPool definition allowing to specify taints. */
        interface WithTaints {
            /**
             * Specifies the taints property: The taints applied to the nodes in this agent pool..
             *
             * @param taints The taints applied to the nodes in this agent pool.
             * @return the next definition stage.
             */
            WithCreate withTaints(List<KubernetesLabel> taints);
        }

        /** The stage of the AgentPool definition allowing to specify upgradeSettings. */
        interface WithUpgradeSettings {
            /**
             * Specifies the upgradeSettings property: AgentPoolUpgradeSettings specifies the upgrade settings for an
             * agent pool.
             *
             * <p>The configuration of the agent pool..
             *
             * @param upgradeSettings AgentPoolUpgradeSettings specifies the upgrade settings for an agent pool.
             *     <p>The configuration of the agent pool.
             * @return the next definition stage.
             */
            WithCreate withUpgradeSettings(AgentPoolUpgradeSettings upgradeSettings);
        }
    }

    /**
     * Begins update for the AgentPool resource.
     *
     * @return the stage of resource update.
     */
    AgentPool.Update update();

    /** The template for AgentPool update. */
    interface Update extends UpdateStages.WithTags, UpdateStages.WithCount, UpdateStages.WithUpgradeSettings {
        /**
         * Executes the update request.
         *
         * @return the updated resource.
         */
        AgentPool apply();

        /**
         * Executes the update request.
         *
         * @param context The context to associate with this operation.
         * @return the updated resource.
         */
        AgentPool apply(Context context);
    }

    /** The AgentPool update stages. */
    interface UpdateStages {
        /** The stage of the AgentPool update allowing to specify tags. */
        interface WithTags {
            /**
             * Specifies the tags property: The Azure resource tags that will replace the existing ones..
             *
             * @param tags The Azure resource tags that will replace the existing ones.
             * @return the next definition stage.
             */
            Update withTags(Map<String, String> tags);
        }

        /** The stage of the AgentPool update allowing to specify count. */
        interface WithCount {
            /**
             * Specifies the count property: The number of virtual machines that use this configuration..
             *
             * @param count The number of virtual machines that use this configuration.
             * @return the next definition stage.
             */
            Update withCount(Long count);
        }

        /** The stage of the AgentPool update allowing to specify upgradeSettings. */
        interface WithUpgradeSettings {
            /**
             * Specifies the upgradeSettings property: AgentPoolUpgradeSettings specifies the upgrade settings for an
             * agent pool.
             *
             * <p>The configuration of the agent pool..
             *
             * @param upgradeSettings AgentPoolUpgradeSettings specifies the upgrade settings for an agent pool.
             *     <p>The configuration of the agent pool.
             * @return the next definition stage.
             */
            Update withUpgradeSettings(AgentPoolUpgradeSettings upgradeSettings);
        }
    }

    /**
     * Refreshes the resource to sync with Azure.
     *
     * @return the refreshed resource.
     */
    AgentPool refresh();

    /**
     * Refreshes the resource to sync with Azure.
     *
     * @param context The context to associate with this operation.
     * @return the refreshed resource.
     */
    AgentPool refresh(Context context);
}
