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

package com.azure.resourcemanager.vmwarecloudsimple.models;

import com.azure.core.management.Region;
import com.azure.core.util.Context;
import com.azure.resourcemanager.vmwarecloudsimple.fluent.models.ResourcePoolInner;
import com.azure.resourcemanager.vmwarecloudsimple.fluent.models.VirtualMachineInner;
import com.azure.resourcemanager.vmwarecloudsimple.fluent.models.VirtualNicInner;
import java.util.List;
import java.util.Map;

/** An immutable client-side representation of VirtualMachine. */
public interface VirtualMachine {
    /**
     * 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 amountOfRam property: The amount of memory.
     *
     * @return the amountOfRam value.
     */
    int amountOfRam();

    /**
     * Gets the controllers property: The list of Virtual Disks' Controllers.
     *
     * @return the controllers value.
     */
    List<VirtualDiskController> controllers();

    /**
     * Gets the customization property: Virtual machine properties.
     *
     * @return the customization value.
     */
    GuestOSCustomization customization();

    /**
     * Gets the disks property: The list of Virtual Disks.
     *
     * @return the disks value.
     */
    List<VirtualDisk> disks();

    /**
     * Gets the dnsname property: The DNS name of Virtual Machine in VCenter.
     *
     * @return the dnsname value.
     */
    String dnsname();

    /**
     * Gets the exposeToGuestVM property: Expose Guest OS or not.
     *
     * @return the exposeToGuestVM value.
     */
    Boolean exposeToGuestVM();

    /**
     * Gets the folder property: The path to virtual machine folder in VCenter.
     *
     * @return the folder value.
     */
    String folder();

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

    /**
     * Gets the guestOSType property: The Guest OS type.
     *
     * @return the guestOSType value.
     */
    GuestOSType guestOSType();

    /**
     * Gets the nics property: The list of Virtual NICs.
     *
     * @return the nics value.
     */
    List<VirtualNic> nics();

    /**
     * Gets the numberOfCores property: The number of CPU cores.
     *
     * @return the numberOfCores value.
     */
    int numberOfCores();

    /**
     * Gets the password property: Password for login. Deprecated - use customization property.
     *
     * @return the password value.
     */
    String password();

    /**
     * Gets the privateCloudId property: Private Cloud Id.
     *
     * @return the privateCloudId value.
     */
    String privateCloudId();

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

    /**
     * Gets the publicIp property: The public ip of Virtual Machine.
     *
     * @return the publicIp value.
     */
    String publicIp();

    /**
     * Gets the resourcePool property: Virtual Machines Resource Pool.
     *
     * @return the resourcePool value.
     */
    ResourcePool resourcePool();

    /**
     * Gets the status property: The status of Virtual machine.
     *
     * @return the status value.
     */
    VirtualMachineStatus status();

    /**
     * Gets the templateId property: Virtual Machine Template Id.
     *
     * @return the templateId value.
     */
    String templateId();

    /**
     * Gets the username property: Username for login. Deprecated - use customization property.
     *
     * @return the username value.
     */
    String username();

    /**
     * Gets the vSphereNetworks property: The list of Virtual VSphere Networks.
     *
     * @return the vSphereNetworks value.
     */
    List<String> vSphereNetworks();

    /**
     * Gets the vmId property: The internal id of Virtual Machine in VCenter.
     *
     * @return the vmId value.
     */
    String vmId();

    /**
     * Gets the vmwaretools property: VMware tools version.
     *
     * @return the vmwaretools value.
     */
    String vmwaretools();

    /**
     * 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.vmwarecloudsimple.fluent.models.VirtualMachineInner object.
     *
     * @return the inner object.
     */
    VirtualMachineInner innerModel();

    /** The entirety of the VirtualMachine definition. */
    interface Definition
        extends DefinitionStages.Blank,
            DefinitionStages.WithLocation,
            DefinitionStages.WithResourceGroup,
            DefinitionStages.WithCreate {
    }
    /** The VirtualMachine definition stages. */
    interface DefinitionStages {
        /** The first stage of the VirtualMachine definition. */
        interface Blank extends WithLocation {
        }
        /** The stage of the VirtualMachine 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.
             */
            WithResourceGroup withRegion(Region location);

            /**
             * Specifies the region for the resource.
             *
             * @param location The geo-location where the resource lives.
             * @return the next definition stage.
             */
            WithResourceGroup withRegion(String location);
        }
        /** The stage of the VirtualMachine definition allowing to specify parent resource. */
        interface WithResourceGroup {
            /**
             * Specifies resourceGroupName.
             *
             * @param resourceGroupName The name of the resource group.
             * @return the next definition stage.
             */
            WithCreate withExistingResourceGroup(String resourceGroupName);
        }
        /**
         * The stage of the VirtualMachine 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.WithAmountOfRam,
                DefinitionStages.WithCustomization,
                DefinitionStages.WithDisks,
                DefinitionStages.WithExposeToGuestVM,
                DefinitionStages.WithNics,
                DefinitionStages.WithNumberOfCores,
                DefinitionStages.WithPassword,
                DefinitionStages.WithPrivateCloudId,
                DefinitionStages.WithResourcePool,
                DefinitionStages.WithTemplateId,
                DefinitionStages.WithUsername,
                DefinitionStages.WithVSphereNetworks,
                DefinitionStages.WithReferer {
            /**
             * Executes the create request.
             *
             * @return the created resource.
             */
            VirtualMachine create();

            /**
             * Executes the create request.
             *
             * @param context The context to associate with this operation.
             * @return the created resource.
             */
            VirtualMachine create(Context context);
        }
        /** The stage of the VirtualMachine 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 VirtualMachine definition allowing to specify amountOfRam. */
        interface WithAmountOfRam {
            /**
             * Specifies the amountOfRam property: The amount of memory.
             *
             * @param amountOfRam The amount of memory.
             * @return the next definition stage.
             */
            WithCreate withAmountOfRam(int amountOfRam);
        }
        /** The stage of the VirtualMachine definition allowing to specify customization. */
        interface WithCustomization {
            /**
             * Specifies the customization property: Virtual machine properties.
             *
             * @param customization Virtual machine properties.
             * @return the next definition stage.
             */
            WithCreate withCustomization(GuestOSCustomization customization);
        }
        /** The stage of the VirtualMachine definition allowing to specify disks. */
        interface WithDisks {
            /**
             * Specifies the disks property: The list of Virtual Disks.
             *
             * @param disks The list of Virtual Disks.
             * @return the next definition stage.
             */
            WithCreate withDisks(List<VirtualDisk> disks);
        }
        /** The stage of the VirtualMachine definition allowing to specify exposeToGuestVM. */
        interface WithExposeToGuestVM {
            /**
             * Specifies the exposeToGuestVM property: Expose Guest OS or not.
             *
             * @param exposeToGuestVM Expose Guest OS or not.
             * @return the next definition stage.
             */
            WithCreate withExposeToGuestVM(Boolean exposeToGuestVM);
        }
        /** The stage of the VirtualMachine definition allowing to specify nics. */
        interface WithNics {
            /**
             * Specifies the nics property: The list of Virtual NICs.
             *
             * @param nics The list of Virtual NICs.
             * @return the next definition stage.
             */
            WithCreate withNics(List<VirtualNicInner> nics);
        }
        /** The stage of the VirtualMachine definition allowing to specify numberOfCores. */
        interface WithNumberOfCores {
            /**
             * Specifies the numberOfCores property: The number of CPU cores.
             *
             * @param numberOfCores The number of CPU cores.
             * @return the next definition stage.
             */
            WithCreate withNumberOfCores(int numberOfCores);
        }
        /** The stage of the VirtualMachine definition allowing to specify password. */
        interface WithPassword {
            /**
             * Specifies the password property: Password for login. Deprecated - use customization property.
             *
             * @param password Password for login. Deprecated - use customization property.
             * @return the next definition stage.
             */
            WithCreate withPassword(String password);
        }
        /** The stage of the VirtualMachine definition allowing to specify privateCloudId. */
        interface WithPrivateCloudId {
            /**
             * Specifies the privateCloudId property: Private Cloud Id.
             *
             * @param privateCloudId Private Cloud Id.
             * @return the next definition stage.
             */
            WithCreate withPrivateCloudId(String privateCloudId);
        }
        /** The stage of the VirtualMachine definition allowing to specify resourcePool. */
        interface WithResourcePool {
            /**
             * Specifies the resourcePool property: Virtual Machines Resource Pool.
             *
             * @param resourcePool Virtual Machines Resource Pool.
             * @return the next definition stage.
             */
            WithCreate withResourcePool(ResourcePoolInner resourcePool);
        }
        /** The stage of the VirtualMachine definition allowing to specify templateId. */
        interface WithTemplateId {
            /**
             * Specifies the templateId property: Virtual Machine Template Id.
             *
             * @param templateId Virtual Machine Template Id.
             * @return the next definition stage.
             */
            WithCreate withTemplateId(String templateId);
        }
        /** The stage of the VirtualMachine definition allowing to specify username. */
        interface WithUsername {
            /**
             * Specifies the username property: Username for login. Deprecated - use customization property.
             *
             * @param username Username for login. Deprecated - use customization property.
             * @return the next definition stage.
             */
            WithCreate withUsername(String username);
        }
        /** The stage of the VirtualMachine definition allowing to specify vSphereNetworks. */
        interface WithVSphereNetworks {
            /**
             * Specifies the vSphereNetworks property: The list of Virtual VSphere Networks.
             *
             * @param vSphereNetworks The list of Virtual VSphere Networks.
             * @return the next definition stage.
             */
            WithCreate withVSphereNetworks(List<String> vSphereNetworks);
        }
        /** The stage of the VirtualMachine definition allowing to specify referer. */
        interface WithReferer {
            /**
             * Specifies the referer property: referer url.
             *
             * @param referer referer url.
             * @return the next definition stage.
             */
            WithCreate withReferer(String referer);
        }
    }
    /**
     * Begins update for the VirtualMachine resource.
     *
     * @return the stage of resource update.
     */
    VirtualMachine.Update update();

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

        /**
         * Executes the update request.
         *
         * @param context The context to associate with this operation.
         * @return the updated resource.
         */
        VirtualMachine apply(Context context);
    }
    /** The VirtualMachine update stages. */
    interface UpdateStages {
        /** The stage of the VirtualMachine update allowing to specify tags. */
        interface WithTags {
            /**
             * Specifies the tags property: The tags key:value pairs.
             *
             * @param tags The tags key:value pairs.
             * @return the next definition stage.
             */
            Update withTags(Map<String, String> tags);
        }
    }
    /**
     * Refreshes the resource to sync with Azure.
     *
     * @return the refreshed resource.
     */
    VirtualMachine refresh();

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