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

package com.azure.resourcemanager.confidentialledger.models;

import com.azure.core.annotation.Fluent;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

/**
 * LedgerProperties
 *
 * <p>Additional Confidential Ledger properties.
 */
@Fluent
public final class LedgerProperties {
    /*
     * Unique name for the Confidential Ledger.
     */
    @JsonProperty(value = "ledgerName", access = JsonProperty.Access.WRITE_ONLY)
    private String ledgerName;

    /*
     * Endpoint for calling Ledger Service.
     */
    @JsonProperty(value = "ledgerUri", access = JsonProperty.Access.WRITE_ONLY)
    private String ledgerUri;

    /*
     * Endpoint for accessing network identity.
     */
    @JsonProperty(value = "identityServiceUri", access = JsonProperty.Access.WRITE_ONLY)
    private String identityServiceUri;

    /*
     * Internal namespace for the Ledger
     */
    @JsonProperty(value = "ledgerInternalNamespace", access = JsonProperty.Access.WRITE_ONLY)
    private String ledgerInternalNamespace;

    /*
     * Object representing RunningState for Ledger.
     */
    @JsonProperty(value = "runningState")
    private RunningState runningState;

    /*
     * Type of Confidential Ledger
     */
    @JsonProperty(value = "ledgerType")
    private LedgerType ledgerType;

    /*
     * Provisioning state of Ledger Resource
     */
    @JsonProperty(value = "provisioningState", access = JsonProperty.Access.WRITE_ONLY)
    private ProvisioningState provisioningState;

    /*
     * Array of all AAD based Security Principals.
     */
    @JsonProperty(value = "aadBasedSecurityPrincipals")
    private List<AadBasedSecurityPrincipal> aadBasedSecurityPrincipals;

    /*
     * Array of all cert based Security Principals.
     */
    @JsonProperty(value = "certBasedSecurityPrincipals")
    private List<CertBasedSecurityPrincipal> certBasedSecurityPrincipals;

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

    /**
     * Get the ledgerName property: Unique name for the Confidential Ledger.
     *
     * @return the ledgerName value.
     */
    public String ledgerName() {
        return this.ledgerName;
    }

    /**
     * Get the ledgerUri property: Endpoint for calling Ledger Service.
     *
     * @return the ledgerUri value.
     */
    public String ledgerUri() {
        return this.ledgerUri;
    }

    /**
     * Get the identityServiceUri property: Endpoint for accessing network identity.
     *
     * @return the identityServiceUri value.
     */
    public String identityServiceUri() {
        return this.identityServiceUri;
    }

    /**
     * Get the ledgerInternalNamespace property: Internal namespace for the Ledger.
     *
     * @return the ledgerInternalNamespace value.
     */
    public String ledgerInternalNamespace() {
        return this.ledgerInternalNamespace;
    }

    /**
     * Get the runningState property: Object representing RunningState for Ledger.
     *
     * @return the runningState value.
     */
    public RunningState runningState() {
        return this.runningState;
    }

    /**
     * Set the runningState property: Object representing RunningState for Ledger.
     *
     * @param runningState the runningState value to set.
     * @return the LedgerProperties object itself.
     */
    public LedgerProperties withRunningState(RunningState runningState) {
        this.runningState = runningState;
        return this;
    }

    /**
     * Get the ledgerType property: Type of Confidential Ledger.
     *
     * @return the ledgerType value.
     */
    public LedgerType ledgerType() {
        return this.ledgerType;
    }

    /**
     * Set the ledgerType property: Type of Confidential Ledger.
     *
     * @param ledgerType the ledgerType value to set.
     * @return the LedgerProperties object itself.
     */
    public LedgerProperties withLedgerType(LedgerType ledgerType) {
        this.ledgerType = ledgerType;
        return this;
    }

    /**
     * Get the provisioningState property: Provisioning state of Ledger Resource.
     *
     * @return the provisioningState value.
     */
    public ProvisioningState provisioningState() {
        return this.provisioningState;
    }

    /**
     * Get the aadBasedSecurityPrincipals property: Array of all AAD based Security Principals.
     *
     * @return the aadBasedSecurityPrincipals value.
     */
    public List<AadBasedSecurityPrincipal> aadBasedSecurityPrincipals() {
        return this.aadBasedSecurityPrincipals;
    }

    /**
     * Set the aadBasedSecurityPrincipals property: Array of all AAD based Security Principals.
     *
     * @param aadBasedSecurityPrincipals the aadBasedSecurityPrincipals value to set.
     * @return the LedgerProperties object itself.
     */
    public LedgerProperties withAadBasedSecurityPrincipals(List<AadBasedSecurityPrincipal> aadBasedSecurityPrincipals) {
        this.aadBasedSecurityPrincipals = aadBasedSecurityPrincipals;
        return this;
    }

    /**
     * Get the certBasedSecurityPrincipals property: Array of all cert based Security Principals.
     *
     * @return the certBasedSecurityPrincipals value.
     */
    public List<CertBasedSecurityPrincipal> certBasedSecurityPrincipals() {
        return this.certBasedSecurityPrincipals;
    }

    /**
     * Set the certBasedSecurityPrincipals property: Array of all cert based Security Principals.
     *
     * @param certBasedSecurityPrincipals the certBasedSecurityPrincipals value to set.
     * @return the LedgerProperties object itself.
     */
    public LedgerProperties withCertBasedSecurityPrincipals(
        List<CertBasedSecurityPrincipal> certBasedSecurityPrincipals) {
        this.certBasedSecurityPrincipals = certBasedSecurityPrincipals;
        return this;
    }

    /**
     * Validates the instance.
     *
     * @throws IllegalArgumentException thrown if the instance is not valid.
     */
    public void validate() {
        if (aadBasedSecurityPrincipals() != null) {
            aadBasedSecurityPrincipals().forEach(e -> e.validate());
        }
        if (certBasedSecurityPrincipals() != null) {
            certBasedSecurityPrincipals().forEach(e -> e.validate());
        }
    }
}
