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

package com.azure.resourcemanager.mobilenetwork.models;

import com.azure.core.annotation.Fluent;
import com.azure.core.util.logging.ClientLogger;
import com.fasterxml.jackson.annotation.JsonProperty;

/** QoS policy. */
@Fluent
public class QosPolicy {
    /*
     * QoS Flow 5G QoS Indicator value. The 5QI identifies a specific QoS forwarding treatment to be provided to a
     * flow. This must not be a standardized 5QI value corresponding to a GBR (guaranteed bit rate) QoS Flow. The
     * illegal GBR 5QI values are: 1, 2, 3, 4, 65, 66, 67, 71, 72, 73, 74, 75, 76, 82, 83, 84, and 85. See 3GPP
     * TS23.501 section 5.7.2.1 for a full description of the 5QI parameter, and table 5.7.4-1 for the definition of
     * which are the GBR 5QI values.
     */
    @JsonProperty(value = "5qi")
    private Integer fiveQi;

    /*
     * QoS Flow allocation and retention priority (ARP) level. Flows with higher priority preempt flows with lower
     * priority, if the settings of `preemptionCapability` and `preemptionVulnerability` allow it. 1 is the highest
     * level of priority. If this field is not specified then `5qi` is used to derive the ARP value. See 3GPP TS23.501
     * section 5.7.2.2 for a full description of the ARP parameters.
     */
    @JsonProperty(value = "allocationAndRetentionPriorityLevel")
    private Integer allocationAndRetentionPriorityLevel;

    /*
     * QoS Flow preemption capability. The preemption capability of a QoS Flow controls whether it can preempt another
     * QoS Flow with a lower priority level. See 3GPP TS23.501 section 5.7.2.2 for a full description of the ARP
     * parameters.
     */
    @JsonProperty(value = "preemptionCapability")
    private PreemptionCapability preemptionCapability;

    /*
     * QoS Flow preemption vulnerability. The preemption vulnerability of a QoS Flow controls whether it can be
     * preempted by a QoS Flow with a higher priority level. See 3GPP TS23.501 section 5.7.2.2 for a full description
     * of the ARP parameters.
     */
    @JsonProperty(value = "preemptionVulnerability")
    private PreemptionVulnerability preemptionVulnerability;

    /*
     * The maximum bit rate (MBR) for all service data flows that use this data flow policy rule or service.
     */
    @JsonProperty(value = "maximumBitRate", required = true)
    private Ambr maximumBitRate;

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

    /**
     * Get the fiveQi property: QoS Flow 5G QoS Indicator value. The 5QI identifies a specific QoS forwarding treatment
     * to be provided to a flow. This must not be a standardized 5QI value corresponding to a GBR (guaranteed bit rate)
     * QoS Flow. The illegal GBR 5QI values are: 1, 2, 3, 4, 65, 66, 67, 71, 72, 73, 74, 75, 76, 82, 83, 84, and 85. See
     * 3GPP TS23.501 section 5.7.2.1 for a full description of the 5QI parameter, and table 5.7.4-1 for the definition
     * of which are the GBR 5QI values.
     *
     * @return the fiveQi value.
     */
    public Integer fiveQi() {
        return this.fiveQi;
    }

    /**
     * Set the fiveQi property: QoS Flow 5G QoS Indicator value. The 5QI identifies a specific QoS forwarding treatment
     * to be provided to a flow. This must not be a standardized 5QI value corresponding to a GBR (guaranteed bit rate)
     * QoS Flow. The illegal GBR 5QI values are: 1, 2, 3, 4, 65, 66, 67, 71, 72, 73, 74, 75, 76, 82, 83, 84, and 85. See
     * 3GPP TS23.501 section 5.7.2.1 for a full description of the 5QI parameter, and table 5.7.4-1 for the definition
     * of which are the GBR 5QI values.
     *
     * @param fiveQi the fiveQi value to set.
     * @return the QosPolicy object itself.
     */
    public QosPolicy withFiveQi(Integer fiveQi) {
        this.fiveQi = fiveQi;
        return this;
    }

    /**
     * Get the allocationAndRetentionPriorityLevel property: QoS Flow allocation and retention priority (ARP) level.
     * Flows with higher priority preempt flows with lower priority, if the settings of `preemptionCapability` and
     * `preemptionVulnerability` allow it. 1 is the highest level of priority. If this field is not specified then `5qi`
     * is used to derive the ARP value. See 3GPP TS23.501 section 5.7.2.2 for a full description of the ARP parameters.
     *
     * @return the allocationAndRetentionPriorityLevel value.
     */
    public Integer allocationAndRetentionPriorityLevel() {
        return this.allocationAndRetentionPriorityLevel;
    }

    /**
     * Set the allocationAndRetentionPriorityLevel property: QoS Flow allocation and retention priority (ARP) level.
     * Flows with higher priority preempt flows with lower priority, if the settings of `preemptionCapability` and
     * `preemptionVulnerability` allow it. 1 is the highest level of priority. If this field is not specified then `5qi`
     * is used to derive the ARP value. See 3GPP TS23.501 section 5.7.2.2 for a full description of the ARP parameters.
     *
     * @param allocationAndRetentionPriorityLevel the allocationAndRetentionPriorityLevel value to set.
     * @return the QosPolicy object itself.
     */
    public QosPolicy withAllocationAndRetentionPriorityLevel(Integer allocationAndRetentionPriorityLevel) {
        this.allocationAndRetentionPriorityLevel = allocationAndRetentionPriorityLevel;
        return this;
    }

    /**
     * Get the preemptionCapability property: QoS Flow preemption capability. The preemption capability of a QoS Flow
     * controls whether it can preempt another QoS Flow with a lower priority level. See 3GPP TS23.501 section 5.7.2.2
     * for a full description of the ARP parameters.
     *
     * @return the preemptionCapability value.
     */
    public PreemptionCapability preemptionCapability() {
        return this.preemptionCapability;
    }

    /**
     * Set the preemptionCapability property: QoS Flow preemption capability. The preemption capability of a QoS Flow
     * controls whether it can preempt another QoS Flow with a lower priority level. See 3GPP TS23.501 section 5.7.2.2
     * for a full description of the ARP parameters.
     *
     * @param preemptionCapability the preemptionCapability value to set.
     * @return the QosPolicy object itself.
     */
    public QosPolicy withPreemptionCapability(PreemptionCapability preemptionCapability) {
        this.preemptionCapability = preemptionCapability;
        return this;
    }

    /**
     * Get the preemptionVulnerability property: QoS Flow preemption vulnerability. The preemption vulnerability of a
     * QoS Flow controls whether it can be preempted by a QoS Flow with a higher priority level. See 3GPP TS23.501
     * section 5.7.2.2 for a full description of the ARP parameters.
     *
     * @return the preemptionVulnerability value.
     */
    public PreemptionVulnerability preemptionVulnerability() {
        return this.preemptionVulnerability;
    }

    /**
     * Set the preemptionVulnerability property: QoS Flow preemption vulnerability. The preemption vulnerability of a
     * QoS Flow controls whether it can be preempted by a QoS Flow with a higher priority level. See 3GPP TS23.501
     * section 5.7.2.2 for a full description of the ARP parameters.
     *
     * @param preemptionVulnerability the preemptionVulnerability value to set.
     * @return the QosPolicy object itself.
     */
    public QosPolicy withPreemptionVulnerability(PreemptionVulnerability preemptionVulnerability) {
        this.preemptionVulnerability = preemptionVulnerability;
        return this;
    }

    /**
     * Get the maximumBitRate property: The maximum bit rate (MBR) for all service data flows that use this data flow
     * policy rule or service.
     *
     * @return the maximumBitRate value.
     */
    public Ambr maximumBitRate() {
        return this.maximumBitRate;
    }

    /**
     * Set the maximumBitRate property: The maximum bit rate (MBR) for all service data flows that use this data flow
     * policy rule or service.
     *
     * @param maximumBitRate the maximumBitRate value to set.
     * @return the QosPolicy object itself.
     */
    public QosPolicy withMaximumBitRate(Ambr maximumBitRate) {
        this.maximumBitRate = maximumBitRate;
        return this;
    }

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

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