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

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

import com.azure.core.annotation.Fluent;
import com.azure.core.util.CoreUtils;
import com.azure.core.util.logging.ClientLogger;
import com.azure.resourcemanager.desktopvirtualization.models.CommandLineSetting;
import com.azure.resourcemanager.desktopvirtualization.models.RemoteApplicationType;
import com.fasterxml.jackson.annotation.JsonProperty;

/** Schema for Application properties. */
@Fluent
public final class ApplicationProperties {
    /*
     * ObjectId of Application. (internal use)
     */
    @JsonProperty(value = "objectId", access = JsonProperty.Access.WRITE_ONLY)
    private String objectId;

    /*
     * Description of Application.
     */
    @JsonProperty(value = "description")
    private String description;

    /*
     * Friendly name of Application.
     */
    @JsonProperty(value = "friendlyName")
    private String friendlyName;

    /*
     * Specifies a path for the executable file for the application.
     */
    @JsonProperty(value = "filePath")
    private String filePath;

    /*
     * Specifies the package family name for MSIX applications
     */
    @JsonProperty(value = "msixPackageFamilyName")
    private String msixPackageFamilyName;

    /*
     * Specifies the package application Id for MSIX applications
     */
    @JsonProperty(value = "msixPackageApplicationId")
    private String msixPackageApplicationId;

    /*
     * Resource Type of Application.
     */
    @JsonProperty(value = "applicationType")
    private RemoteApplicationType applicationType;

    /*
     * Specifies whether this published application can be launched with command line arguments provided by the client,
     * command line arguments specified at publish time, or no command line arguments at all.
     */
    @JsonProperty(value = "commandLineSetting", required = true)
    private CommandLineSetting commandLineSetting;

    /*
     * Command Line Arguments for Application.
     */
    @JsonProperty(value = "commandLineArguments")
    private String commandLineArguments;

    /*
     * Specifies whether to show the RemoteApp program in the RD Web Access server.
     */
    @JsonProperty(value = "showInPortal")
    private Boolean showInPortal;

    /*
     * Path to icon.
     */
    @JsonProperty(value = "iconPath")
    private String iconPath;

    /*
     * Index of the icon.
     */
    @JsonProperty(value = "iconIndex")
    private Integer iconIndex;

    /*
     * Hash of the icon.
     */
    @JsonProperty(value = "iconHash", access = JsonProperty.Access.WRITE_ONLY)
    private String iconHash;

    /*
     * the icon a 64 bit string as a byte array.
     */
    @JsonProperty(value = "iconContent", access = JsonProperty.Access.WRITE_ONLY)
    private byte[] iconContent;

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

    /**
     * Get the objectId property: ObjectId of Application. (internal use).
     *
     * @return the objectId value.
     */
    public String objectId() {
        return this.objectId;
    }

    /**
     * Get the description property: Description of Application.
     *
     * @return the description value.
     */
    public String description() {
        return this.description;
    }

    /**
     * Set the description property: Description of Application.
     *
     * @param description the description value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withDescription(String description) {
        this.description = description;
        return this;
    }

    /**
     * Get the friendlyName property: Friendly name of Application.
     *
     * @return the friendlyName value.
     */
    public String friendlyName() {
        return this.friendlyName;
    }

    /**
     * Set the friendlyName property: Friendly name of Application.
     *
     * @param friendlyName the friendlyName value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withFriendlyName(String friendlyName) {
        this.friendlyName = friendlyName;
        return this;
    }

    /**
     * Get the filePath property: Specifies a path for the executable file for the application.
     *
     * @return the filePath value.
     */
    public String filePath() {
        return this.filePath;
    }

    /**
     * Set the filePath property: Specifies a path for the executable file for the application.
     *
     * @param filePath the filePath value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withFilePath(String filePath) {
        this.filePath = filePath;
        return this;
    }

    /**
     * Get the msixPackageFamilyName property: Specifies the package family name for MSIX applications.
     *
     * @return the msixPackageFamilyName value.
     */
    public String msixPackageFamilyName() {
        return this.msixPackageFamilyName;
    }

    /**
     * Set the msixPackageFamilyName property: Specifies the package family name for MSIX applications.
     *
     * @param msixPackageFamilyName the msixPackageFamilyName value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withMsixPackageFamilyName(String msixPackageFamilyName) {
        this.msixPackageFamilyName = msixPackageFamilyName;
        return this;
    }

    /**
     * Get the msixPackageApplicationId property: Specifies the package application Id for MSIX applications.
     *
     * @return the msixPackageApplicationId value.
     */
    public String msixPackageApplicationId() {
        return this.msixPackageApplicationId;
    }

    /**
     * Set the msixPackageApplicationId property: Specifies the package application Id for MSIX applications.
     *
     * @param msixPackageApplicationId the msixPackageApplicationId value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withMsixPackageApplicationId(String msixPackageApplicationId) {
        this.msixPackageApplicationId = msixPackageApplicationId;
        return this;
    }

    /**
     * Get the applicationType property: Resource Type of Application.
     *
     * @return the applicationType value.
     */
    public RemoteApplicationType applicationType() {
        return this.applicationType;
    }

    /**
     * Set the applicationType property: Resource Type of Application.
     *
     * @param applicationType the applicationType value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withApplicationType(RemoteApplicationType applicationType) {
        this.applicationType = applicationType;
        return this;
    }

    /**
     * Get the commandLineSetting property: Specifies whether this published application can be launched with command
     * line arguments provided by the client, command line arguments specified at publish time, or no command line
     * arguments at all.
     *
     * @return the commandLineSetting value.
     */
    public CommandLineSetting commandLineSetting() {
        return this.commandLineSetting;
    }

    /**
     * Set the commandLineSetting property: Specifies whether this published application can be launched with command
     * line arguments provided by the client, command line arguments specified at publish time, or no command line
     * arguments at all.
     *
     * @param commandLineSetting the commandLineSetting value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withCommandLineSetting(CommandLineSetting commandLineSetting) {
        this.commandLineSetting = commandLineSetting;
        return this;
    }

    /**
     * Get the commandLineArguments property: Command Line Arguments for Application.
     *
     * @return the commandLineArguments value.
     */
    public String commandLineArguments() {
        return this.commandLineArguments;
    }

    /**
     * Set the commandLineArguments property: Command Line Arguments for Application.
     *
     * @param commandLineArguments the commandLineArguments value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withCommandLineArguments(String commandLineArguments) {
        this.commandLineArguments = commandLineArguments;
        return this;
    }

    /**
     * Get the showInPortal property: Specifies whether to show the RemoteApp program in the RD Web Access server.
     *
     * @return the showInPortal value.
     */
    public Boolean showInPortal() {
        return this.showInPortal;
    }

    /**
     * Set the showInPortal property: Specifies whether to show the RemoteApp program in the RD Web Access server.
     *
     * @param showInPortal the showInPortal value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withShowInPortal(Boolean showInPortal) {
        this.showInPortal = showInPortal;
        return this;
    }

    /**
     * Get the iconPath property: Path to icon.
     *
     * @return the iconPath value.
     */
    public String iconPath() {
        return this.iconPath;
    }

    /**
     * Set the iconPath property: Path to icon.
     *
     * @param iconPath the iconPath value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withIconPath(String iconPath) {
        this.iconPath = iconPath;
        return this;
    }

    /**
     * Get the iconIndex property: Index of the icon.
     *
     * @return the iconIndex value.
     */
    public Integer iconIndex() {
        return this.iconIndex;
    }

    /**
     * Set the iconIndex property: Index of the icon.
     *
     * @param iconIndex the iconIndex value to set.
     * @return the ApplicationProperties object itself.
     */
    public ApplicationProperties withIconIndex(Integer iconIndex) {
        this.iconIndex = iconIndex;
        return this;
    }

    /**
     * Get the iconHash property: Hash of the icon.
     *
     * @return the iconHash value.
     */
    public String iconHash() {
        return this.iconHash;
    }

    /**
     * Get the iconContent property: the icon a 64 bit string as a byte array.
     *
     * @return the iconContent value.
     */
    public byte[] iconContent() {
        return CoreUtils.clone(this.iconContent);
    }

    /**
     * Validates the instance.
     *
     * @throws IllegalArgumentException thrown if the instance is not valid.
     */
    public void validate() {
        if (commandLineSetting() == null) {
            throw LOGGER
                .logExceptionAsError(
                    new IllegalArgumentException(
                        "Missing required property commandLineSetting in model ApplicationProperties"));
        }
    }

    private static final ClientLogger LOGGER = new ClientLogger(ApplicationProperties.class);
}
