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

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

import com.azure.core.annotation.Fluent;
import com.azure.resourcemanager.managementgroups.models.EntityParentGroupInfo;
import com.azure.resourcemanager.managementgroups.models.Permissions;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

/** The generic properties of an entity. */
@Fluent
public final class EntityInfoProperties {
    /*
     * The AAD Tenant ID associated with the entity. For example, 00000000-0000-0000-0000-000000000000
     */
    @JsonProperty(value = "tenantId")
    private String tenantId;

    /*
     * The friendly name of the management group.
     */
    @JsonProperty(value = "displayName")
    private String displayName;

    /*
     * (Optional) The ID of the parent management group.
     */
    @JsonProperty(value = "parent")
    private EntityParentGroupInfo parent;

    /*
     * The users specific permissions to this item.
     */
    @JsonProperty(value = "permissions")
    private Permissions permissions;

    /*
     * The users specific permissions to this item.
     */
    @JsonProperty(value = "inheritedPermissions")
    private Permissions inheritedPermissions;

    /*
     * Number of Descendants
     */
    @JsonProperty(value = "numberOfDescendants")
    private Integer numberOfDescendants;

    /*
     * Number of Children
     *
     * Number of children is the number of Groups and Subscriptions that are exactly one level underneath the current
     * Group.
     */
    @JsonProperty(value = "numberOfChildren")
    private Integer numberOfChildren;

    /*
     * Number of Child Groups
     *
     * Number of children is the number of Groups that are exactly one level underneath the current Group.
     */
    @JsonProperty(value = "numberOfChildGroups")
    private Integer numberOfChildGroups;

    /*
     * The parent display name chain from the root group to the immediate parent
     */
    @JsonProperty(value = "parentDisplayNameChain")
    private List<String> parentDisplayNameChain;

    /*
     * The parent name chain from the root group to the immediate parent
     */
    @JsonProperty(value = "parentNameChain")
    private List<String> parentNameChain;

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

    /**
     * Get the tenantId property: The AAD Tenant ID associated with the entity. For example,
     * 00000000-0000-0000-0000-000000000000.
     *
     * @return the tenantId value.
     */
    public String tenantId() {
        return this.tenantId;
    }

    /**
     * Set the tenantId property: The AAD Tenant ID associated with the entity. For example,
     * 00000000-0000-0000-0000-000000000000.
     *
     * @param tenantId the tenantId value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withTenantId(String tenantId) {
        this.tenantId = tenantId;
        return this;
    }

    /**
     * Get the displayName property: The friendly name of the management group.
     *
     * @return the displayName value.
     */
    public String displayName() {
        return this.displayName;
    }

    /**
     * Set the displayName property: The friendly name of the management group.
     *
     * @param displayName the displayName value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withDisplayName(String displayName) {
        this.displayName = displayName;
        return this;
    }

    /**
     * Get the parent property: (Optional) The ID of the parent management group.
     *
     * @return the parent value.
     */
    public EntityParentGroupInfo parent() {
        return this.parent;
    }

    /**
     * Set the parent property: (Optional) The ID of the parent management group.
     *
     * @param parent the parent value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withParent(EntityParentGroupInfo parent) {
        this.parent = parent;
        return this;
    }

    /**
     * Get the permissions property: The users specific permissions to this item.
     *
     * @return the permissions value.
     */
    public Permissions permissions() {
        return this.permissions;
    }

    /**
     * Set the permissions property: The users specific permissions to this item.
     *
     * @param permissions the permissions value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withPermissions(Permissions permissions) {
        this.permissions = permissions;
        return this;
    }

    /**
     * Get the inheritedPermissions property: The users specific permissions to this item.
     *
     * @return the inheritedPermissions value.
     */
    public Permissions inheritedPermissions() {
        return this.inheritedPermissions;
    }

    /**
     * Set the inheritedPermissions property: The users specific permissions to this item.
     *
     * @param inheritedPermissions the inheritedPermissions value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withInheritedPermissions(Permissions inheritedPermissions) {
        this.inheritedPermissions = inheritedPermissions;
        return this;
    }

    /**
     * Get the numberOfDescendants property: Number of Descendants.
     *
     * @return the numberOfDescendants value.
     */
    public Integer numberOfDescendants() {
        return this.numberOfDescendants;
    }

    /**
     * Set the numberOfDescendants property: Number of Descendants.
     *
     * @param numberOfDescendants the numberOfDescendants value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withNumberOfDescendants(Integer numberOfDescendants) {
        this.numberOfDescendants = numberOfDescendants;
        return this;
    }

    /**
     * Get the numberOfChildren property: Number of Children
     *
     * <p>Number of children is the number of Groups and Subscriptions that are exactly one level underneath the current
     * Group.
     *
     * @return the numberOfChildren value.
     */
    public Integer numberOfChildren() {
        return this.numberOfChildren;
    }

    /**
     * Set the numberOfChildren property: Number of Children
     *
     * <p>Number of children is the number of Groups and Subscriptions that are exactly one level underneath the current
     * Group.
     *
     * @param numberOfChildren the numberOfChildren value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withNumberOfChildren(Integer numberOfChildren) {
        this.numberOfChildren = numberOfChildren;
        return this;
    }

    /**
     * Get the numberOfChildGroups property: Number of Child Groups
     *
     * <p>Number of children is the number of Groups that are exactly one level underneath the current Group.
     *
     * @return the numberOfChildGroups value.
     */
    public Integer numberOfChildGroups() {
        return this.numberOfChildGroups;
    }

    /**
     * Set the numberOfChildGroups property: Number of Child Groups
     *
     * <p>Number of children is the number of Groups that are exactly one level underneath the current Group.
     *
     * @param numberOfChildGroups the numberOfChildGroups value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withNumberOfChildGroups(Integer numberOfChildGroups) {
        this.numberOfChildGroups = numberOfChildGroups;
        return this;
    }

    /**
     * Get the parentDisplayNameChain property: The parent display name chain from the root group to the immediate
     * parent.
     *
     * @return the parentDisplayNameChain value.
     */
    public List<String> parentDisplayNameChain() {
        return this.parentDisplayNameChain;
    }

    /**
     * Set the parentDisplayNameChain property: The parent display name chain from the root group to the immediate
     * parent.
     *
     * @param parentDisplayNameChain the parentDisplayNameChain value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withParentDisplayNameChain(List<String> parentDisplayNameChain) {
        this.parentDisplayNameChain = parentDisplayNameChain;
        return this;
    }

    /**
     * Get the parentNameChain property: The parent name chain from the root group to the immediate parent.
     *
     * @return the parentNameChain value.
     */
    public List<String> parentNameChain() {
        return this.parentNameChain;
    }

    /**
     * Set the parentNameChain property: The parent name chain from the root group to the immediate parent.
     *
     * @param parentNameChain the parentNameChain value to set.
     * @return the EntityInfoProperties object itself.
     */
    public EntityInfoProperties withParentNameChain(List<String> parentNameChain) {
        this.parentNameChain = parentNameChain;
        return this;
    }

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