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

package com.azure.resourcemanager.securityinsights.models;

import com.azure.core.management.SystemData;
import com.azure.core.util.Context;
import com.azure.resourcemanager.securityinsights.fluent.models.MetadataModelInner;
import java.time.LocalDate;
import java.util.List;

/** An immutable client-side representation of MetadataModel. */
public interface MetadataModel {
    /**
     * 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 etag property: Etag of the azure resource.
     *
     * @return the etag value.
     */
    String etag();

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

    /**
     * Gets the contentId property: Static ID for the content. Used to identify dependencies and content from solutions
     * or community. Hard-coded/static for out of the box content and solutions. Dynamic for user-created. This is the
     * resource name.
     *
     * @return the contentId value.
     */
    String contentId();

    /**
     * Gets the parentId property: Full parent resource ID of the content item the metadata is for. This is the full
     * resource ID including the scope (subscription and resource group).
     *
     * @return the parentId value.
     */
    String parentId();

    /**
     * Gets the version property: Version of the content. Default and recommended format is numeric (e.g. 1, 1.0, 1.0.0,
     * 1.0.0.0), following ARM template best practices. Can also be any string, but then we cannot guarantee any version
     * checks.
     *
     * @return the version value.
     */
    String version();

    /**
     * Gets the kind property: The kind of content the metadata is for.
     *
     * @return the kind value.
     */
    Kind kind();

    /**
     * Gets the source property: Source of the content. This is where/how it was created.
     *
     * @return the source value.
     */
    MetadataSource source();

    /**
     * Gets the author property: The creator of the content item.
     *
     * @return the author value.
     */
    MetadataAuthor author();

    /**
     * Gets the support property: Support information for the metadata - type, name, contact information.
     *
     * @return the support value.
     */
    MetadataSupport support();

    /**
     * Gets the dependencies property: Dependencies for the content item, what other content items it requires to work.
     * Can describe more complex dependencies using a recursive/nested structure. For a single dependency an
     * id/kind/version can be supplied or operator/criteria for complex formats.
     *
     * @return the dependencies value.
     */
    MetadataDependencies dependencies();

    /**
     * Gets the categories property: Categories for the solution content item.
     *
     * @return the categories value.
     */
    MetadataCategories categories();

    /**
     * Gets the providers property: Providers for the solution content item.
     *
     * @return the providers value.
     */
    List<String> providers();

    /**
     * Gets the firstPublishDate property: first publish date solution content item.
     *
     * @return the firstPublishDate value.
     */
    LocalDate firstPublishDate();

    /**
     * Gets the lastPublishDate property: last publish date for the solution content item.
     *
     * @return the lastPublishDate value.
     */
    LocalDate lastPublishDate();

    /**
     * Gets the customVersion property: The custom version of the content. A optional free text.
     *
     * @return the customVersion value.
     */
    String customVersion();

    /**
     * Gets the contentSchemaVersion property: Schema version of the content. Can be used to distinguish between
     * different flow based on the schema version.
     *
     * @return the contentSchemaVersion value.
     */
    String contentSchemaVersion();

    /**
     * Gets the icon property: the icon identifier. this id can later be fetched from the solution template.
     *
     * @return the icon value.
     */
    String icon();

    /**
     * Gets the threatAnalysisTactics property: the tactics the resource covers.
     *
     * @return the threatAnalysisTactics value.
     */
    List<String> threatAnalysisTactics();

    /**
     * Gets the threatAnalysisTechniques property: the techniques the resource covers, these have to be aligned with the
     * tactics being used.
     *
     * @return the threatAnalysisTechniques value.
     */
    List<String> threatAnalysisTechniques();

    /**
     * Gets the previewImages property: preview image file names. These will be taken from the solution artifacts.
     *
     * @return the previewImages value.
     */
    List<String> previewImages();

    /**
     * Gets the previewImagesDark property: preview image file names. These will be taken from the solution artifacts.
     * used for dark theme support.
     *
     * @return the previewImagesDark value.
     */
    List<String> previewImagesDark();

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

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

    /** The entirety of the MetadataModel definition. */
    interface Definition
        extends DefinitionStages.Blank, DefinitionStages.WithParentResource, DefinitionStages.WithCreate {
    }
    /** The MetadataModel definition stages. */
    interface DefinitionStages {
        /** The first stage of the MetadataModel definition. */
        interface Blank extends WithParentResource {
        }
        /** The stage of the MetadataModel definition allowing to specify parent resource. */
        interface WithParentResource {
            /**
             * Specifies resourceGroupName, workspaceName.
             *
             * @param resourceGroupName The name of the resource group. The name is case insensitive.
             * @param workspaceName The name of the workspace.
             * @return the next definition stage.
             */
            WithCreate withExistingWorkspace(String resourceGroupName, String workspaceName);
        }
        /**
         * The stage of the MetadataModel 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.WithEtag,
                DefinitionStages.WithContentId,
                DefinitionStages.WithParentId,
                DefinitionStages.WithVersion,
                DefinitionStages.WithKind,
                DefinitionStages.WithSource,
                DefinitionStages.WithAuthor,
                DefinitionStages.WithSupport,
                DefinitionStages.WithDependencies,
                DefinitionStages.WithCategories,
                DefinitionStages.WithProviders,
                DefinitionStages.WithFirstPublishDate,
                DefinitionStages.WithLastPublishDate,
                DefinitionStages.WithCustomVersion,
                DefinitionStages.WithContentSchemaVersion,
                DefinitionStages.WithIcon,
                DefinitionStages.WithThreatAnalysisTactics,
                DefinitionStages.WithThreatAnalysisTechniques,
                DefinitionStages.WithPreviewImages,
                DefinitionStages.WithPreviewImagesDark {
            /**
             * Executes the create request.
             *
             * @return the created resource.
             */
            MetadataModel create();

            /**
             * Executes the create request.
             *
             * @param context The context to associate with this operation.
             * @return the created resource.
             */
            MetadataModel create(Context context);
        }
        /** The stage of the MetadataModel definition allowing to specify etag. */
        interface WithEtag {
            /**
             * Specifies the etag property: Etag of the azure resource.
             *
             * @param etag Etag of the azure resource.
             * @return the next definition stage.
             */
            WithCreate withEtag(String etag);
        }
        /** The stage of the MetadataModel definition allowing to specify contentId. */
        interface WithContentId {
            /**
             * Specifies the contentId property: Static ID for the content. Used to identify dependencies and content
             * from solutions or community. Hard-coded/static for out of the box content and solutions. Dynamic for
             * user-created. This is the resource name.
             *
             * @param contentId Static ID for the content. Used to identify dependencies and content from solutions or
             *     community. Hard-coded/static for out of the box content and solutions. Dynamic for user-created. This
             *     is the resource name.
             * @return the next definition stage.
             */
            WithCreate withContentId(String contentId);
        }
        /** The stage of the MetadataModel definition allowing to specify parentId. */
        interface WithParentId {
            /**
             * Specifies the parentId property: Full parent resource ID of the content item the metadata is for. This is
             * the full resource ID including the scope (subscription and resource group).
             *
             * @param parentId Full parent resource ID of the content item the metadata is for. This is the full
             *     resource ID including the scope (subscription and resource group).
             * @return the next definition stage.
             */
            WithCreate withParentId(String parentId);
        }
        /** The stage of the MetadataModel definition allowing to specify version. */
        interface WithVersion {
            /**
             * Specifies the version property: Version of the content. Default and recommended format is numeric (e.g.
             * 1, 1.0, 1.0.0, 1.0.0.0), following ARM template best practices. Can also be any string, but then we
             * cannot guarantee any version checks.
             *
             * @param version Version of the content. Default and recommended format is numeric (e.g. 1, 1.0, 1.0.0,
             *     1.0.0.0), following ARM template best practices. Can also be any string, but then we cannot guarantee
             *     any version checks.
             * @return the next definition stage.
             */
            WithCreate withVersion(String version);
        }
        /** The stage of the MetadataModel definition allowing to specify kind. */
        interface WithKind {
            /**
             * Specifies the kind property: The kind of content the metadata is for..
             *
             * @param kind The kind of content the metadata is for.
             * @return the next definition stage.
             */
            WithCreate withKind(Kind kind);
        }
        /** The stage of the MetadataModel definition allowing to specify source. */
        interface WithSource {
            /**
             * Specifies the source property: Source of the content. This is where/how it was created..
             *
             * @param source Source of the content. This is where/how it was created.
             * @return the next definition stage.
             */
            WithCreate withSource(MetadataSource source);
        }
        /** The stage of the MetadataModel definition allowing to specify author. */
        interface WithAuthor {
            /**
             * Specifies the author property: The creator of the content item..
             *
             * @param author The creator of the content item.
             * @return the next definition stage.
             */
            WithCreate withAuthor(MetadataAuthor author);
        }
        /** The stage of the MetadataModel definition allowing to specify support. */
        interface WithSupport {
            /**
             * Specifies the support property: Support information for the metadata - type, name, contact information.
             *
             * @param support Support information for the metadata - type, name, contact information.
             * @return the next definition stage.
             */
            WithCreate withSupport(MetadataSupport support);
        }
        /** The stage of the MetadataModel definition allowing to specify dependencies. */
        interface WithDependencies {
            /**
             * Specifies the dependencies property: Dependencies for the content item, what other content items it
             * requires to work. Can describe more complex dependencies using a recursive/nested structure. For a single
             * dependency an id/kind/version can be supplied or operator/criteria for complex formats..
             *
             * @param dependencies Dependencies for the content item, what other content items it requires to work. Can
             *     describe more complex dependencies using a recursive/nested structure. For a single dependency an
             *     id/kind/version can be supplied or operator/criteria for complex formats.
             * @return the next definition stage.
             */
            WithCreate withDependencies(MetadataDependencies dependencies);
        }
        /** The stage of the MetadataModel definition allowing to specify categories. */
        interface WithCategories {
            /**
             * Specifies the categories property: Categories for the solution content item.
             *
             * @param categories Categories for the solution content item.
             * @return the next definition stage.
             */
            WithCreate withCategories(MetadataCategories categories);
        }
        /** The stage of the MetadataModel definition allowing to specify providers. */
        interface WithProviders {
            /**
             * Specifies the providers property: Providers for the solution content item.
             *
             * @param providers Providers for the solution content item.
             * @return the next definition stage.
             */
            WithCreate withProviders(List<String> providers);
        }
        /** The stage of the MetadataModel definition allowing to specify firstPublishDate. */
        interface WithFirstPublishDate {
            /**
             * Specifies the firstPublishDate property: first publish date solution content item.
             *
             * @param firstPublishDate first publish date solution content item.
             * @return the next definition stage.
             */
            WithCreate withFirstPublishDate(LocalDate firstPublishDate);
        }
        /** The stage of the MetadataModel definition allowing to specify lastPublishDate. */
        interface WithLastPublishDate {
            /**
             * Specifies the lastPublishDate property: last publish date for the solution content item.
             *
             * @param lastPublishDate last publish date for the solution content item.
             * @return the next definition stage.
             */
            WithCreate withLastPublishDate(LocalDate lastPublishDate);
        }
        /** The stage of the MetadataModel definition allowing to specify customVersion. */
        interface WithCustomVersion {
            /**
             * Specifies the customVersion property: The custom version of the content. A optional free text.
             *
             * @param customVersion The custom version of the content. A optional free text.
             * @return the next definition stage.
             */
            WithCreate withCustomVersion(String customVersion);
        }
        /** The stage of the MetadataModel definition allowing to specify contentSchemaVersion. */
        interface WithContentSchemaVersion {
            /**
             * Specifies the contentSchemaVersion property: Schema version of the content. Can be used to distinguish
             * between different flow based on the schema version.
             *
             * @param contentSchemaVersion Schema version of the content. Can be used to distinguish between different
             *     flow based on the schema version.
             * @return the next definition stage.
             */
            WithCreate withContentSchemaVersion(String contentSchemaVersion);
        }
        /** The stage of the MetadataModel definition allowing to specify icon. */
        interface WithIcon {
            /**
             * Specifies the icon property: the icon identifier. this id can later be fetched from the solution
             * template.
             *
             * @param icon the icon identifier. this id can later be fetched from the solution template.
             * @return the next definition stage.
             */
            WithCreate withIcon(String icon);
        }
        /** The stage of the MetadataModel definition allowing to specify threatAnalysisTactics. */
        interface WithThreatAnalysisTactics {
            /**
             * Specifies the threatAnalysisTactics property: the tactics the resource covers.
             *
             * @param threatAnalysisTactics the tactics the resource covers.
             * @return the next definition stage.
             */
            WithCreate withThreatAnalysisTactics(List<String> threatAnalysisTactics);
        }
        /** The stage of the MetadataModel definition allowing to specify threatAnalysisTechniques. */
        interface WithThreatAnalysisTechniques {
            /**
             * Specifies the threatAnalysisTechniques property: the techniques the resource covers, these have to be
             * aligned with the tactics being used.
             *
             * @param threatAnalysisTechniques the techniques the resource covers, these have to be aligned with the
             *     tactics being used.
             * @return the next definition stage.
             */
            WithCreate withThreatAnalysisTechniques(List<String> threatAnalysisTechniques);
        }
        /** The stage of the MetadataModel definition allowing to specify previewImages. */
        interface WithPreviewImages {
            /**
             * Specifies the previewImages property: preview image file names. These will be taken from the solution
             * artifacts.
             *
             * @param previewImages preview image file names. These will be taken from the solution artifacts.
             * @return the next definition stage.
             */
            WithCreate withPreviewImages(List<String> previewImages);
        }
        /** The stage of the MetadataModel definition allowing to specify previewImagesDark. */
        interface WithPreviewImagesDark {
            /**
             * Specifies the previewImagesDark property: preview image file names. These will be taken from the solution
             * artifacts. used for dark theme support.
             *
             * @param previewImagesDark preview image file names. These will be taken from the solution artifacts. used
             *     for dark theme support.
             * @return the next definition stage.
             */
            WithCreate withPreviewImagesDark(List<String> previewImagesDark);
        }
    }
    /**
     * Begins update for the MetadataModel resource.
     *
     * @return the stage of resource update.
     */
    MetadataModel.Update update();

    /** The template for MetadataModel update. */
    interface Update
        extends UpdateStages.WithEtag,
            UpdateStages.WithContentId,
            UpdateStages.WithParentId,
            UpdateStages.WithVersion,
            UpdateStages.WithKind,
            UpdateStages.WithSource,
            UpdateStages.WithAuthor,
            UpdateStages.WithSupport,
            UpdateStages.WithDependencies,
            UpdateStages.WithCategories,
            UpdateStages.WithProviders,
            UpdateStages.WithFirstPublishDate,
            UpdateStages.WithLastPublishDate,
            UpdateStages.WithCustomVersion,
            UpdateStages.WithContentSchemaVersion,
            UpdateStages.WithIcon,
            UpdateStages.WithThreatAnalysisTactics,
            UpdateStages.WithThreatAnalysisTechniques,
            UpdateStages.WithPreviewImages,
            UpdateStages.WithPreviewImagesDark {
        /**
         * Executes the update request.
         *
         * @return the updated resource.
         */
        MetadataModel apply();

        /**
         * Executes the update request.
         *
         * @param context The context to associate with this operation.
         * @return the updated resource.
         */
        MetadataModel apply(Context context);
    }
    /** The MetadataModel update stages. */
    interface UpdateStages {
        /** The stage of the MetadataModel update allowing to specify etag. */
        interface WithEtag {
            /**
             * Specifies the etag property: Etag of the azure resource.
             *
             * @param etag Etag of the azure resource.
             * @return the next definition stage.
             */
            Update withEtag(String etag);
        }
        /** The stage of the MetadataModel update allowing to specify contentId. */
        interface WithContentId {
            /**
             * Specifies the contentId property: Static ID for the content. Used to identify dependencies and content
             * from solutions or community. Hard-coded/static for out of the box content and solutions. Dynamic for
             * user-created. This is the resource name.
             *
             * @param contentId Static ID for the content. Used to identify dependencies and content from solutions or
             *     community. Hard-coded/static for out of the box content and solutions. Dynamic for user-created. This
             *     is the resource name.
             * @return the next definition stage.
             */
            Update withContentId(String contentId);
        }
        /** The stage of the MetadataModel update allowing to specify parentId. */
        interface WithParentId {
            /**
             * Specifies the parentId property: Full parent resource ID of the content item the metadata is for. This is
             * the full resource ID including the scope (subscription and resource group).
             *
             * @param parentId Full parent resource ID of the content item the metadata is for. This is the full
             *     resource ID including the scope (subscription and resource group).
             * @return the next definition stage.
             */
            Update withParentId(String parentId);
        }
        /** The stage of the MetadataModel update allowing to specify version. */
        interface WithVersion {
            /**
             * Specifies the version property: Version of the content. Default and recommended format is numeric (e.g.
             * 1, 1.0, 1.0.0, 1.0.0.0), following ARM template best practices. Can also be any string, but then we
             * cannot guarantee any version checks.
             *
             * @param version Version of the content. Default and recommended format is numeric (e.g. 1, 1.0, 1.0.0,
             *     1.0.0.0), following ARM template best practices. Can also be any string, but then we cannot guarantee
             *     any version checks.
             * @return the next definition stage.
             */
            Update withVersion(String version);
        }
        /** The stage of the MetadataModel update allowing to specify kind. */
        interface WithKind {
            /**
             * Specifies the kind property: The kind of content the metadata is for..
             *
             * @param kind The kind of content the metadata is for.
             * @return the next definition stage.
             */
            Update withKind(Kind kind);
        }
        /** The stage of the MetadataModel update allowing to specify source. */
        interface WithSource {
            /**
             * Specifies the source property: Source of the content. This is where/how it was created..
             *
             * @param source Source of the content. This is where/how it was created.
             * @return the next definition stage.
             */
            Update withSource(MetadataSource source);
        }
        /** The stage of the MetadataModel update allowing to specify author. */
        interface WithAuthor {
            /**
             * Specifies the author property: The creator of the content item..
             *
             * @param author The creator of the content item.
             * @return the next definition stage.
             */
            Update withAuthor(MetadataAuthor author);
        }
        /** The stage of the MetadataModel update allowing to specify support. */
        interface WithSupport {
            /**
             * Specifies the support property: Support information for the metadata - type, name, contact information.
             *
             * @param support Support information for the metadata - type, name, contact information.
             * @return the next definition stage.
             */
            Update withSupport(MetadataSupport support);
        }
        /** The stage of the MetadataModel update allowing to specify dependencies. */
        interface WithDependencies {
            /**
             * Specifies the dependencies property: Dependencies for the content item, what other content items it
             * requires to work. Can describe more complex dependencies using a recursive/nested structure. For a single
             * dependency an id/kind/version can be supplied or operator/criteria for complex formats..
             *
             * @param dependencies Dependencies for the content item, what other content items it requires to work. Can
             *     describe more complex dependencies using a recursive/nested structure. For a single dependency an
             *     id/kind/version can be supplied or operator/criteria for complex formats.
             * @return the next definition stage.
             */
            Update withDependencies(MetadataDependencies dependencies);
        }
        /** The stage of the MetadataModel update allowing to specify categories. */
        interface WithCategories {
            /**
             * Specifies the categories property: Categories for the solution content item.
             *
             * @param categories Categories for the solution content item.
             * @return the next definition stage.
             */
            Update withCategories(MetadataCategories categories);
        }
        /** The stage of the MetadataModel update allowing to specify providers. */
        interface WithProviders {
            /**
             * Specifies the providers property: Providers for the solution content item.
             *
             * @param providers Providers for the solution content item.
             * @return the next definition stage.
             */
            Update withProviders(List<String> providers);
        }
        /** The stage of the MetadataModel update allowing to specify firstPublishDate. */
        interface WithFirstPublishDate {
            /**
             * Specifies the firstPublishDate property: first publish date solution content item.
             *
             * @param firstPublishDate first publish date solution content item.
             * @return the next definition stage.
             */
            Update withFirstPublishDate(LocalDate firstPublishDate);
        }
        /** The stage of the MetadataModel update allowing to specify lastPublishDate. */
        interface WithLastPublishDate {
            /**
             * Specifies the lastPublishDate property: last publish date for the solution content item.
             *
             * @param lastPublishDate last publish date for the solution content item.
             * @return the next definition stage.
             */
            Update withLastPublishDate(LocalDate lastPublishDate);
        }
        /** The stage of the MetadataModel update allowing to specify customVersion. */
        interface WithCustomVersion {
            /**
             * Specifies the customVersion property: The custom version of the content. A optional free text.
             *
             * @param customVersion The custom version of the content. A optional free text.
             * @return the next definition stage.
             */
            Update withCustomVersion(String customVersion);
        }
        /** The stage of the MetadataModel update allowing to specify contentSchemaVersion. */
        interface WithContentSchemaVersion {
            /**
             * Specifies the contentSchemaVersion property: Schema version of the content. Can be used to distinguish
             * between different flow based on the schema version.
             *
             * @param contentSchemaVersion Schema version of the content. Can be used to distinguish between different
             *     flow based on the schema version.
             * @return the next definition stage.
             */
            Update withContentSchemaVersion(String contentSchemaVersion);
        }
        /** The stage of the MetadataModel update allowing to specify icon. */
        interface WithIcon {
            /**
             * Specifies the icon property: the icon identifier. this id can later be fetched from the solution
             * template.
             *
             * @param icon the icon identifier. this id can later be fetched from the solution template.
             * @return the next definition stage.
             */
            Update withIcon(String icon);
        }
        /** The stage of the MetadataModel update allowing to specify threatAnalysisTactics. */
        interface WithThreatAnalysisTactics {
            /**
             * Specifies the threatAnalysisTactics property: the tactics the resource covers.
             *
             * @param threatAnalysisTactics the tactics the resource covers.
             * @return the next definition stage.
             */
            Update withThreatAnalysisTactics(List<String> threatAnalysisTactics);
        }
        /** The stage of the MetadataModel update allowing to specify threatAnalysisTechniques. */
        interface WithThreatAnalysisTechniques {
            /**
             * Specifies the threatAnalysisTechniques property: the techniques the resource covers, these have to be
             * aligned with the tactics being used.
             *
             * @param threatAnalysisTechniques the techniques the resource covers, these have to be aligned with the
             *     tactics being used.
             * @return the next definition stage.
             */
            Update withThreatAnalysisTechniques(List<String> threatAnalysisTechniques);
        }
        /** The stage of the MetadataModel update allowing to specify previewImages. */
        interface WithPreviewImages {
            /**
             * Specifies the previewImages property: preview image file names. These will be taken from the solution
             * artifacts.
             *
             * @param previewImages preview image file names. These will be taken from the solution artifacts.
             * @return the next definition stage.
             */
            Update withPreviewImages(List<String> previewImages);
        }
        /** The stage of the MetadataModel update allowing to specify previewImagesDark. */
        interface WithPreviewImagesDark {
            /**
             * Specifies the previewImagesDark property: preview image file names. These will be taken from the solution
             * artifacts. used for dark theme support.
             *
             * @param previewImagesDark preview image file names. These will be taken from the solution artifacts. used
             *     for dark theme support.
             * @return the next definition stage.
             */
            Update withPreviewImagesDark(List<String> previewImagesDark);
        }
    }
    /**
     * Refreshes the resource to sync with Azure.
     *
     * @return the refreshed resource.
     */
    MetadataModel refresh();

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