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

package com.azure.resourcemanager.customerinsights.models;

import com.azure.core.http.rest.Response;
import com.azure.core.util.Context;
import com.azure.resourcemanager.customerinsights.fluent.models.InteractionResourceFormatInner;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Map;

/** An immutable client-side representation of InteractionResourceFormat. */
public interface InteractionResourceFormat {
    /**
     * 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 idPropertyNames property: The id property names. Properties which uniquely identify an interaction
     * instance.
     *
     * @return the idPropertyNames value.
     */
    List<String> idPropertyNames();

    /**
     * Gets the participantProfiles property: Profiles that participated in the interaction.
     *
     * @return the participantProfiles value.
     */
    List<Participant> participantProfiles();

    /**
     * Gets the primaryParticipantProfilePropertyName property: The primary participant property name for an interaction
     * ,This is used to logically represent the agent of the interaction, Specify the participant name here from
     * ParticipantName.
     *
     * @return the primaryParticipantProfilePropertyName value.
     */
    String primaryParticipantProfilePropertyName();

    /**
     * Gets the dataSourcePrecedenceRules property: This is specific to interactions modeled as activities. Data sources
     * are used to determine where data is stored and also in precedence rules.
     *
     * @return the dataSourcePrecedenceRules value.
     */
    List<DataSourcePrecedence> dataSourcePrecedenceRules();

    /**
     * Gets the isActivity property: An interaction can be tagged as an activity only during create. This enables the
     * interaction to be editable and can enable merging of properties from multiple data sources based on precedence,
     * which is defined at a link level.
     *
     * @return the isActivity value.
     */
    Boolean isActivity();

    /**
     * Gets the namePropertiesName property: The data source name.
     *
     * @return the namePropertiesName value.
     */
    String namePropertiesName();

    /**
     * Gets the dataSourceType property: The data source type.
     *
     * @return the dataSourceType value.
     */
    DataSourceType dataSourceType();

    /**
     * Gets the status property: The data source status.
     *
     * @return the status value.
     */
    Status status();

    /**
     * Gets the idPropertiesId property: The data source ID.
     *
     * @return the idPropertiesId value.
     */
    Integer idPropertiesId();

    /**
     * Gets the dataSourceReferenceId property: The data source reference id.
     *
     * @return the dataSourceReferenceId value.
     */
    String dataSourceReferenceId();

    /**
     * Gets the apiEntitySetName property: The api entity set name. This becomes the odata entity set name for the
     * entity Type being referred in this object.
     *
     * @return the apiEntitySetName value.
     */
    String apiEntitySetName();

    /**
     * Gets the entityType property: Type of entity.
     *
     * @return the entityType value.
     */
    EntityTypes entityType();

    /**
     * Gets the fields property: The properties of the Profile.
     *
     * @return the fields value.
     */
    List<PropertyDefinition> fields();

    /**
     * Gets the instancesCount property: The instance count.
     *
     * @return the instancesCount value.
     */
    Integer instancesCount();

    /**
     * Gets the lastChangedUtc property: The last changed time for the type definition.
     *
     * @return the lastChangedUtc value.
     */
    OffsetDateTime lastChangedUtc();

    /**
     * Gets the provisioningState property: Provisioning state.
     *
     * @return the provisioningState value.
     */
    ProvisioningStates provisioningState();

    /**
     * Gets the schemaItemTypeLink property: The schema org link. This helps ACI identify and suggest semantic models.
     *
     * @return the schemaItemTypeLink value.
     */
    String schemaItemTypeLink();

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

    /**
     * Gets the timestampFieldName property: The timestamp property name. Represents the time when the interaction or
     * profile update happened.
     *
     * @return the timestampFieldName value.
     */
    String timestampFieldName();

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

    /**
     * Gets the attributes property: The attributes for the Type.
     *
     * @return the attributes value.
     */
    Map<String, List<String>> attributes();

    /**
     * Gets the description property: Localized descriptions for the property.
     *
     * @return the description value.
     */
    Map<String, String> description();

    /**
     * Gets the displayName property: Localized display names for the property.
     *
     * @return the displayName value.
     */
    Map<String, String> displayName();

    /**
     * Gets the localizedAttributes property: Any custom localized attributes for the Type.
     *
     * @return the localizedAttributes value.
     */
    Map<String, Map<String, String>> localizedAttributes();

    /**
     * Gets the smallImage property: Small Image associated with the Property or EntityType.
     *
     * @return the smallImage value.
     */
    String smallImage();

    /**
     * Gets the mediumImage property: Medium Image associated with the Property or EntityType.
     *
     * @return the mediumImage value.
     */
    String mediumImage();

    /**
     * Gets the largeImage property: Large Image associated with the Property or EntityType.
     *
     * @return the largeImage value.
     */
    String largeImage();

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

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

    /** The entirety of the InteractionResourceFormat definition. */
    interface Definition
        extends DefinitionStages.Blank, DefinitionStages.WithParentResource, DefinitionStages.WithCreate {
    }
    /** The InteractionResourceFormat definition stages. */
    interface DefinitionStages {
        /** The first stage of the InteractionResourceFormat definition. */
        interface Blank extends WithParentResource {
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify parent resource. */
        interface WithParentResource {
            /**
             * Specifies resourceGroupName, hubName.
             *
             * @param resourceGroupName The name of the resource group.
             * @param hubName The name of the hub.
             * @return the next definition stage.
             */
            WithCreate withExistingHub(String resourceGroupName, String hubName);
        }
        /**
         * The stage of the InteractionResourceFormat 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.WithIdPropertyNames,
                DefinitionStages.WithParticipantProfiles,
                DefinitionStages.WithPrimaryParticipantProfilePropertyName,
                DefinitionStages.WithIsActivity,
                DefinitionStages.WithApiEntitySetName,
                DefinitionStages.WithEntityType,
                DefinitionStages.WithFields,
                DefinitionStages.WithInstancesCount,
                DefinitionStages.WithSchemaItemTypeLink,
                DefinitionStages.WithTimestampFieldName,
                DefinitionStages.WithTypeName,
                DefinitionStages.WithAttributes,
                DefinitionStages.WithDescription,
                DefinitionStages.WithDisplayName,
                DefinitionStages.WithLocalizedAttributes,
                DefinitionStages.WithSmallImage,
                DefinitionStages.WithMediumImage,
                DefinitionStages.WithLargeImage {
            /**
             * Executes the create request.
             *
             * @return the created resource.
             */
            InteractionResourceFormat create();

            /**
             * Executes the create request.
             *
             * @param context The context to associate with this operation.
             * @return the created resource.
             */
            InteractionResourceFormat create(Context context);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify idPropertyNames. */
        interface WithIdPropertyNames {
            /**
             * Specifies the idPropertyNames property: The id property names. Properties which uniquely identify an
             * interaction instance..
             *
             * @param idPropertyNames The id property names. Properties which uniquely identify an interaction instance.
             * @return the next definition stage.
             */
            WithCreate withIdPropertyNames(List<String> idPropertyNames);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify participantProfiles. */
        interface WithParticipantProfiles {
            /**
             * Specifies the participantProfiles property: Profiles that participated in the interaction..
             *
             * @param participantProfiles Profiles that participated in the interaction.
             * @return the next definition stage.
             */
            WithCreate withParticipantProfiles(List<Participant> participantProfiles);
        }
        /**
         * The stage of the InteractionResourceFormat definition allowing to specify
         * primaryParticipantProfilePropertyName.
         */
        interface WithPrimaryParticipantProfilePropertyName {
            /**
             * Specifies the primaryParticipantProfilePropertyName property: The primary participant property name for
             * an interaction ,This is used to logically represent the agent of the interaction, Specify the participant
             * name here from ParticipantName..
             *
             * @param primaryParticipantProfilePropertyName The primary participant property name for an interaction
             *     ,This is used to logically represent the agent of the interaction, Specify the participant name here
             *     from ParticipantName.
             * @return the next definition stage.
             */
            WithCreate withPrimaryParticipantProfilePropertyName(String primaryParticipantProfilePropertyName);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify isActivity. */
        interface WithIsActivity {
            /**
             * Specifies the isActivity property: An interaction can be tagged as an activity only during create. This
             * enables the interaction to be editable and can enable merging of properties from multiple data sources
             * based on precedence, which is defined at a link level..
             *
             * @param isActivity An interaction can be tagged as an activity only during create. This enables the
             *     interaction to be editable and can enable merging of properties from multiple data sources based on
             *     precedence, which is defined at a link level.
             * @return the next definition stage.
             */
            WithCreate withIsActivity(Boolean isActivity);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify apiEntitySetName. */
        interface WithApiEntitySetName {
            /**
             * Specifies the apiEntitySetName property: The api entity set name. This becomes the odata entity set name
             * for the entity Type being referred in this object..
             *
             * @param apiEntitySetName The api entity set name. This becomes the odata entity set name for the entity
             *     Type being referred in this object.
             * @return the next definition stage.
             */
            WithCreate withApiEntitySetName(String apiEntitySetName);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify entityType. */
        interface WithEntityType {
            /**
             * Specifies the entityType property: Type of entity..
             *
             * @param entityType Type of entity.
             * @return the next definition stage.
             */
            WithCreate withEntityType(EntityTypes entityType);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify fields. */
        interface WithFields {
            /**
             * Specifies the fields property: The properties of the Profile..
             *
             * @param fields The properties of the Profile.
             * @return the next definition stage.
             */
            WithCreate withFields(List<PropertyDefinition> fields);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify instancesCount. */
        interface WithInstancesCount {
            /**
             * Specifies the instancesCount property: The instance count..
             *
             * @param instancesCount The instance count.
             * @return the next definition stage.
             */
            WithCreate withInstancesCount(Integer instancesCount);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify schemaItemTypeLink. */
        interface WithSchemaItemTypeLink {
            /**
             * Specifies the schemaItemTypeLink property: The schema org link. This helps ACI identify and suggest
             * semantic models..
             *
             * @param schemaItemTypeLink The schema org link. This helps ACI identify and suggest semantic models.
             * @return the next definition stage.
             */
            WithCreate withSchemaItemTypeLink(String schemaItemTypeLink);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify timestampFieldName. */
        interface WithTimestampFieldName {
            /**
             * Specifies the timestampFieldName property: The timestamp property name. Represents the time when the
             * interaction or profile update happened..
             *
             * @param timestampFieldName The timestamp property name. Represents the time when the interaction or
             *     profile update happened.
             * @return the next definition stage.
             */
            WithCreate withTimestampFieldName(String timestampFieldName);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify typeName. */
        interface WithTypeName {
            /**
             * Specifies the typeName property: The name of the entity..
             *
             * @param typeName The name of the entity.
             * @return the next definition stage.
             */
            WithCreate withTypeName(String typeName);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify attributes. */
        interface WithAttributes {
            /**
             * Specifies the attributes property: The attributes for the Type..
             *
             * @param attributes The attributes for the Type.
             * @return the next definition stage.
             */
            WithCreate withAttributes(Map<String, List<String>> attributes);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify description. */
        interface WithDescription {
            /**
             * Specifies the description property: Localized descriptions for the property..
             *
             * @param description Localized descriptions for the property.
             * @return the next definition stage.
             */
            WithCreate withDescription(Map<String, String> description);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify displayName. */
        interface WithDisplayName {
            /**
             * Specifies the displayName property: Localized display names for the property..
             *
             * @param displayName Localized display names for the property.
             * @return the next definition stage.
             */
            WithCreate withDisplayName(Map<String, String> displayName);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify localizedAttributes. */
        interface WithLocalizedAttributes {
            /**
             * Specifies the localizedAttributes property: Any custom localized attributes for the Type..
             *
             * @param localizedAttributes Any custom localized attributes for the Type.
             * @return the next definition stage.
             */
            WithCreate withLocalizedAttributes(Map<String, Map<String, String>> localizedAttributes);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify smallImage. */
        interface WithSmallImage {
            /**
             * Specifies the smallImage property: Small Image associated with the Property or EntityType..
             *
             * @param smallImage Small Image associated with the Property or EntityType.
             * @return the next definition stage.
             */
            WithCreate withSmallImage(String smallImage);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify mediumImage. */
        interface WithMediumImage {
            /**
             * Specifies the mediumImage property: Medium Image associated with the Property or EntityType..
             *
             * @param mediumImage Medium Image associated with the Property or EntityType.
             * @return the next definition stage.
             */
            WithCreate withMediumImage(String mediumImage);
        }
        /** The stage of the InteractionResourceFormat definition allowing to specify largeImage. */
        interface WithLargeImage {
            /**
             * Specifies the largeImage property: Large Image associated with the Property or EntityType..
             *
             * @param largeImage Large Image associated with the Property or EntityType.
             * @return the next definition stage.
             */
            WithCreate withLargeImage(String largeImage);
        }
    }
    /**
     * Begins update for the InteractionResourceFormat resource.
     *
     * @return the stage of resource update.
     */
    InteractionResourceFormat.Update update();

    /** The template for InteractionResourceFormat update. */
    interface Update
        extends UpdateStages.WithIdPropertyNames,
            UpdateStages.WithParticipantProfiles,
            UpdateStages.WithPrimaryParticipantProfilePropertyName,
            UpdateStages.WithIsActivity,
            UpdateStages.WithApiEntitySetName,
            UpdateStages.WithEntityType,
            UpdateStages.WithFields,
            UpdateStages.WithInstancesCount,
            UpdateStages.WithSchemaItemTypeLink,
            UpdateStages.WithTimestampFieldName,
            UpdateStages.WithTypeName,
            UpdateStages.WithAttributes,
            UpdateStages.WithDescription,
            UpdateStages.WithDisplayName,
            UpdateStages.WithLocalizedAttributes,
            UpdateStages.WithSmallImage,
            UpdateStages.WithMediumImage,
            UpdateStages.WithLargeImage {
        /**
         * Executes the update request.
         *
         * @return the updated resource.
         */
        InteractionResourceFormat apply();

        /**
         * Executes the update request.
         *
         * @param context The context to associate with this operation.
         * @return the updated resource.
         */
        InteractionResourceFormat apply(Context context);
    }
    /** The InteractionResourceFormat update stages. */
    interface UpdateStages {
        /** The stage of the InteractionResourceFormat update allowing to specify idPropertyNames. */
        interface WithIdPropertyNames {
            /**
             * Specifies the idPropertyNames property: The id property names. Properties which uniquely identify an
             * interaction instance..
             *
             * @param idPropertyNames The id property names. Properties which uniquely identify an interaction instance.
             * @return the next definition stage.
             */
            Update withIdPropertyNames(List<String> idPropertyNames);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify participantProfiles. */
        interface WithParticipantProfiles {
            /**
             * Specifies the participantProfiles property: Profiles that participated in the interaction..
             *
             * @param participantProfiles Profiles that participated in the interaction.
             * @return the next definition stage.
             */
            Update withParticipantProfiles(List<Participant> participantProfiles);
        }
        /**
         * The stage of the InteractionResourceFormat update allowing to specify primaryParticipantProfilePropertyName.
         */
        interface WithPrimaryParticipantProfilePropertyName {
            /**
             * Specifies the primaryParticipantProfilePropertyName property: The primary participant property name for
             * an interaction ,This is used to logically represent the agent of the interaction, Specify the participant
             * name here from ParticipantName..
             *
             * @param primaryParticipantProfilePropertyName The primary participant property name for an interaction
             *     ,This is used to logically represent the agent of the interaction, Specify the participant name here
             *     from ParticipantName.
             * @return the next definition stage.
             */
            Update withPrimaryParticipantProfilePropertyName(String primaryParticipantProfilePropertyName);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify isActivity. */
        interface WithIsActivity {
            /**
             * Specifies the isActivity property: An interaction can be tagged as an activity only during create. This
             * enables the interaction to be editable and can enable merging of properties from multiple data sources
             * based on precedence, which is defined at a link level..
             *
             * @param isActivity An interaction can be tagged as an activity only during create. This enables the
             *     interaction to be editable and can enable merging of properties from multiple data sources based on
             *     precedence, which is defined at a link level.
             * @return the next definition stage.
             */
            Update withIsActivity(Boolean isActivity);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify apiEntitySetName. */
        interface WithApiEntitySetName {
            /**
             * Specifies the apiEntitySetName property: The api entity set name. This becomes the odata entity set name
             * for the entity Type being referred in this object..
             *
             * @param apiEntitySetName The api entity set name. This becomes the odata entity set name for the entity
             *     Type being referred in this object.
             * @return the next definition stage.
             */
            Update withApiEntitySetName(String apiEntitySetName);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify entityType. */
        interface WithEntityType {
            /**
             * Specifies the entityType property: Type of entity..
             *
             * @param entityType Type of entity.
             * @return the next definition stage.
             */
            Update withEntityType(EntityTypes entityType);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify fields. */
        interface WithFields {
            /**
             * Specifies the fields property: The properties of the Profile..
             *
             * @param fields The properties of the Profile.
             * @return the next definition stage.
             */
            Update withFields(List<PropertyDefinition> fields);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify instancesCount. */
        interface WithInstancesCount {
            /**
             * Specifies the instancesCount property: The instance count..
             *
             * @param instancesCount The instance count.
             * @return the next definition stage.
             */
            Update withInstancesCount(Integer instancesCount);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify schemaItemTypeLink. */
        interface WithSchemaItemTypeLink {
            /**
             * Specifies the schemaItemTypeLink property: The schema org link. This helps ACI identify and suggest
             * semantic models..
             *
             * @param schemaItemTypeLink The schema org link. This helps ACI identify and suggest semantic models.
             * @return the next definition stage.
             */
            Update withSchemaItemTypeLink(String schemaItemTypeLink);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify timestampFieldName. */
        interface WithTimestampFieldName {
            /**
             * Specifies the timestampFieldName property: The timestamp property name. Represents the time when the
             * interaction or profile update happened..
             *
             * @param timestampFieldName The timestamp property name. Represents the time when the interaction or
             *     profile update happened.
             * @return the next definition stage.
             */
            Update withTimestampFieldName(String timestampFieldName);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify typeName. */
        interface WithTypeName {
            /**
             * Specifies the typeName property: The name of the entity..
             *
             * @param typeName The name of the entity.
             * @return the next definition stage.
             */
            Update withTypeName(String typeName);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify attributes. */
        interface WithAttributes {
            /**
             * Specifies the attributes property: The attributes for the Type..
             *
             * @param attributes The attributes for the Type.
             * @return the next definition stage.
             */
            Update withAttributes(Map<String, List<String>> attributes);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify description. */
        interface WithDescription {
            /**
             * Specifies the description property: Localized descriptions for the property..
             *
             * @param description Localized descriptions for the property.
             * @return the next definition stage.
             */
            Update withDescription(Map<String, String> description);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify displayName. */
        interface WithDisplayName {
            /**
             * Specifies the displayName property: Localized display names for the property..
             *
             * @param displayName Localized display names for the property.
             * @return the next definition stage.
             */
            Update withDisplayName(Map<String, String> displayName);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify localizedAttributes. */
        interface WithLocalizedAttributes {
            /**
             * Specifies the localizedAttributes property: Any custom localized attributes for the Type..
             *
             * @param localizedAttributes Any custom localized attributes for the Type.
             * @return the next definition stage.
             */
            Update withLocalizedAttributes(Map<String, Map<String, String>> localizedAttributes);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify smallImage. */
        interface WithSmallImage {
            /**
             * Specifies the smallImage property: Small Image associated with the Property or EntityType..
             *
             * @param smallImage Small Image associated with the Property or EntityType.
             * @return the next definition stage.
             */
            Update withSmallImage(String smallImage);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify mediumImage. */
        interface WithMediumImage {
            /**
             * Specifies the mediumImage property: Medium Image associated with the Property or EntityType..
             *
             * @param mediumImage Medium Image associated with the Property or EntityType.
             * @return the next definition stage.
             */
            Update withMediumImage(String mediumImage);
        }
        /** The stage of the InteractionResourceFormat update allowing to specify largeImage. */
        interface WithLargeImage {
            /**
             * Specifies the largeImage property: Large Image associated with the Property or EntityType..
             *
             * @param largeImage Large Image associated with the Property or EntityType.
             * @return the next definition stage.
             */
            Update withLargeImage(String largeImage);
        }
    }
    /**
     * Refreshes the resource to sync with Azure.
     *
     * @return the refreshed resource.
     */
    InteractionResourceFormat refresh();

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

    /**
     * Suggests relationships to create relationship links.
     *
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     * @return the response of suggest relationship links operation along with {@link Response}.
     */
    Response<SuggestRelationshipLinksResponse> suggestRelationshipLinksWithResponse(Context context);

    /**
     * Suggests relationships to create relationship links.
     *
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     * @return the response of suggest relationship links operation.
     */
    SuggestRelationshipLinksResponse suggestRelationshipLinks();
}
