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

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

import com.azure.core.annotation.Fluent;
import com.azure.resourcemanager.devhub.models.DockerfileGenerationMode;
import com.azure.resourcemanager.devhub.models.GenerationLanguage;
import com.azure.resourcemanager.devhub.models.GenerationManifestType;
import com.azure.resourcemanager.devhub.models.ManifestGenerationMode;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * Artifact Generation Properties
 *
 * <p>Properties used for generating artifacts such as Dockerfiles and manifests.
 */
@Fluent
public final class ArtifactGenerationProperties {
    /*
     * The programming language used.
     */
    @JsonProperty(value = "generationLanguage")
    private GenerationLanguage generationLanguage;

    /*
     * The version of the language image used for execution in the generated dockerfile.
     */
    @JsonProperty(value = "languageVersion")
    private String languageVersion;

    /*
     * The version of the language image used for building the code in the generated dockerfile.
     */
    @JsonProperty(value = "builderVersion")
    private String builderVersion;

    /*
     * The port the application is exposed on.
     */
    @JsonProperty(value = "port")
    private String port;

    /*
     * The name of the app.
     */
    @JsonProperty(value = "appName")
    private String appName;

    /*
     * The directory to output the generated Dockerfile to.
     */
    @JsonProperty(value = "dockerfileOutputDirectory")
    private String dockerfileOutputDirectory;

    /*
     * The directory to output the generated manifests to.
     */
    @JsonProperty(value = "manifestOutputDirectory")
    private String manifestOutputDirectory;

    /*
     * The mode of generation to be used for generating Dockerfiles.
     */
    @JsonProperty(value = "dockerfileGenerationMode")
    private DockerfileGenerationMode dockerfileGenerationMode;

    /*
     * The mode of generation to be used for generating Manifest.
     */
    @JsonProperty(value = "manifestGenerationMode")
    private ManifestGenerationMode manifestGenerationMode;

    /*
     * Determines the type of manifests to be generated.
     */
    @JsonProperty(value = "manifestType")
    private GenerationManifestType manifestType;

    /*
     * The name of the image to be generated.
     */
    @JsonProperty(value = "imageName")
    private String imageName;

    /*
     * The namespace to deploy the application to.
     */
    @JsonProperty(value = "namespace")
    private String namespace;

    /*
     * The tag to apply to the generated image.
     */
    @JsonProperty(value = "imageTag")
    private String imageTag;

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

    /**
     * Get the generationLanguage property: The programming language used.
     *
     * @return the generationLanguage value.
     */
    public GenerationLanguage generationLanguage() {
        return this.generationLanguage;
    }

    /**
     * Set the generationLanguage property: The programming language used.
     *
     * @param generationLanguage the generationLanguage value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withGenerationLanguage(GenerationLanguage generationLanguage) {
        this.generationLanguage = generationLanguage;
        return this;
    }

    /**
     * Get the languageVersion property: The version of the language image used for execution in the generated
     * dockerfile.
     *
     * @return the languageVersion value.
     */
    public String languageVersion() {
        return this.languageVersion;
    }

    /**
     * Set the languageVersion property: The version of the language image used for execution in the generated
     * dockerfile.
     *
     * @param languageVersion the languageVersion value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withLanguageVersion(String languageVersion) {
        this.languageVersion = languageVersion;
        return this;
    }

    /**
     * Get the builderVersion property: The version of the language image used for building the code in the generated
     * dockerfile.
     *
     * @return the builderVersion value.
     */
    public String builderVersion() {
        return this.builderVersion;
    }

    /**
     * Set the builderVersion property: The version of the language image used for building the code in the generated
     * dockerfile.
     *
     * @param builderVersion the builderVersion value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withBuilderVersion(String builderVersion) {
        this.builderVersion = builderVersion;
        return this;
    }

    /**
     * Get the port property: The port the application is exposed on.
     *
     * @return the port value.
     */
    public String port() {
        return this.port;
    }

    /**
     * Set the port property: The port the application is exposed on.
     *
     * @param port the port value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withPort(String port) {
        this.port = port;
        return this;
    }

    /**
     * Get the appName property: The name of the app.
     *
     * @return the appName value.
     */
    public String appName() {
        return this.appName;
    }

    /**
     * Set the appName property: The name of the app.
     *
     * @param appName the appName value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withAppName(String appName) {
        this.appName = appName;
        return this;
    }

    /**
     * Get the dockerfileOutputDirectory property: The directory to output the generated Dockerfile to.
     *
     * @return the dockerfileOutputDirectory value.
     */
    public String dockerfileOutputDirectory() {
        return this.dockerfileOutputDirectory;
    }

    /**
     * Set the dockerfileOutputDirectory property: The directory to output the generated Dockerfile to.
     *
     * @param dockerfileOutputDirectory the dockerfileOutputDirectory value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withDockerfileOutputDirectory(String dockerfileOutputDirectory) {
        this.dockerfileOutputDirectory = dockerfileOutputDirectory;
        return this;
    }

    /**
     * Get the manifestOutputDirectory property: The directory to output the generated manifests to.
     *
     * @return the manifestOutputDirectory value.
     */
    public String manifestOutputDirectory() {
        return this.manifestOutputDirectory;
    }

    /**
     * Set the manifestOutputDirectory property: The directory to output the generated manifests to.
     *
     * @param manifestOutputDirectory the manifestOutputDirectory value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withManifestOutputDirectory(String manifestOutputDirectory) {
        this.manifestOutputDirectory = manifestOutputDirectory;
        return this;
    }

    /**
     * Get the dockerfileGenerationMode property: The mode of generation to be used for generating Dockerfiles.
     *
     * @return the dockerfileGenerationMode value.
     */
    public DockerfileGenerationMode dockerfileGenerationMode() {
        return this.dockerfileGenerationMode;
    }

    /**
     * Set the dockerfileGenerationMode property: The mode of generation to be used for generating Dockerfiles.
     *
     * @param dockerfileGenerationMode the dockerfileGenerationMode value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withDockerfileGenerationMode(
        DockerfileGenerationMode dockerfileGenerationMode) {
        this.dockerfileGenerationMode = dockerfileGenerationMode;
        return this;
    }

    /**
     * Get the manifestGenerationMode property: The mode of generation to be used for generating Manifest.
     *
     * @return the manifestGenerationMode value.
     */
    public ManifestGenerationMode manifestGenerationMode() {
        return this.manifestGenerationMode;
    }

    /**
     * Set the manifestGenerationMode property: The mode of generation to be used for generating Manifest.
     *
     * @param manifestGenerationMode the manifestGenerationMode value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withManifestGenerationMode(ManifestGenerationMode manifestGenerationMode) {
        this.manifestGenerationMode = manifestGenerationMode;
        return this;
    }

    /**
     * Get the manifestType property: Determines the type of manifests to be generated.
     *
     * @return the manifestType value.
     */
    public GenerationManifestType manifestType() {
        return this.manifestType;
    }

    /**
     * Set the manifestType property: Determines the type of manifests to be generated.
     *
     * @param manifestType the manifestType value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withManifestType(GenerationManifestType manifestType) {
        this.manifestType = manifestType;
        return this;
    }

    /**
     * Get the imageName property: The name of the image to be generated.
     *
     * @return the imageName value.
     */
    public String imageName() {
        return this.imageName;
    }

    /**
     * Set the imageName property: The name of the image to be generated.
     *
     * @param imageName the imageName value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withImageName(String imageName) {
        this.imageName = imageName;
        return this;
    }

    /**
     * Get the namespace property: The namespace to deploy the application to.
     *
     * @return the namespace value.
     */
    public String namespace() {
        return this.namespace;
    }

    /**
     * Set the namespace property: The namespace to deploy the application to.
     *
     * @param namespace the namespace value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withNamespace(String namespace) {
        this.namespace = namespace;
        return this;
    }

    /**
     * Get the imageTag property: The tag to apply to the generated image.
     *
     * @return the imageTag value.
     */
    public String imageTag() {
        return this.imageTag;
    }

    /**
     * Set the imageTag property: The tag to apply to the generated image.
     *
     * @param imageTag the imageTag value to set.
     * @return the ArtifactGenerationProperties object itself.
     */
    public ArtifactGenerationProperties withImageTag(String imageTag) {
        this.imageTag = imageTag;
        return this;
    }

    /**
     * Validates the instance.
     *
     * @throws IllegalArgumentException thrown if the instance is not valid.
     */
    public void validate() {
    }
}
