// *** WARNING: this file was generated by pulumi-java-gen. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***

package com.pulumi.azure.databoxedge.inputs;

import com.pulumi.azure.databoxedge.inputs.OrderContactArgs;
import com.pulumi.azure.databoxedge.inputs.OrderReturnTrackingArgs;
import com.pulumi.azure.databoxedge.inputs.OrderShipmentAddressArgs;
import com.pulumi.azure.databoxedge.inputs.OrderShipmentHistoryArgs;
import com.pulumi.azure.databoxedge.inputs.OrderShipmentTrackingArgs;
import com.pulumi.azure.databoxedge.inputs.OrderStatusArgs;
import com.pulumi.core.Output;
import com.pulumi.core.annotations.Import;
import java.lang.String;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;


public final class OrderState extends com.pulumi.resources.ResourceArgs {

    public static final OrderState Empty = new OrderState();

    /**
     * A `contact` block as defined below.
     * 
     */
    @Import(name="contact")
    private @Nullable Output<OrderContactArgs> contact;

    /**
     * @return A `contact` block as defined below.
     * 
     */
    public Optional<Output<OrderContactArgs>> contact() {
        return Optional.ofNullable(this.contact);
    }

    /**
     * The name of the Databox Edge Device this order is for. Changing this forces a new Databox Edge Order to be created.
     * 
     */
    @Import(name="deviceName")
    private @Nullable Output<String> deviceName;

    /**
     * @return The name of the Databox Edge Device this order is for. Changing this forces a new Databox Edge Order to be created.
     * 
     */
    public Optional<Output<String>> deviceName() {
        return Optional.ofNullable(this.deviceName);
    }

    /**
     * The contact person name. Changing this forces a new Databox Edge Order to be created.
     * 
     */
    @Import(name="name")
    private @Nullable Output<String> name;

    /**
     * @return The contact person name. Changing this forces a new Databox Edge Order to be created.
     * 
     */
    public Optional<Output<String>> name() {
        return Optional.ofNullable(this.name);
    }

    /**
     * The name of the Resource Group where the Databox Edge Order should exist. Changing this forces a new Databox Edge Order to be created.
     * 
     */
    @Import(name="resourceGroupName")
    private @Nullable Output<String> resourceGroupName;

    /**
     * @return The name of the Resource Group where the Databox Edge Order should exist. Changing this forces a new Databox Edge Order to be created.
     * 
     */
    public Optional<Output<String>> resourceGroupName() {
        return Optional.ofNullable(this.resourceGroupName);
    }

    /**
     * Tracking information for the package returned from the customer whether it has an original or a replacement device. A `return_tracking` block as defined below.
     * 
     */
    @Import(name="returnTrackings")
    private @Nullable Output<List<OrderReturnTrackingArgs>> returnTrackings;

    /**
     * @return Tracking information for the package returned from the customer whether it has an original or a replacement device. A `return_tracking` block as defined below.
     * 
     */
    public Optional<Output<List<OrderReturnTrackingArgs>>> returnTrackings() {
        return Optional.ofNullable(this.returnTrackings);
    }

    /**
     * Serial number of the device being tracked.
     * 
     */
    @Import(name="serialNumber")
    private @Nullable Output<String> serialNumber;

    /**
     * @return Serial number of the device being tracked.
     * 
     */
    public Optional<Output<String>> serialNumber() {
        return Optional.ofNullable(this.serialNumber);
    }

    /**
     * A `shipment_address` block as defined below.
     * 
     */
    @Import(name="shipmentAddress")
    private @Nullable Output<OrderShipmentAddressArgs> shipmentAddress;

    /**
     * @return A `shipment_address` block as defined below.
     * 
     */
    public Optional<Output<OrderShipmentAddressArgs>> shipmentAddress() {
        return Optional.ofNullable(this.shipmentAddress);
    }

    /**
     * List of status changes in the order. A `shipment_history` block as defined below.
     * 
     */
    @Import(name="shipmentHistories")
    private @Nullable Output<List<OrderShipmentHistoryArgs>> shipmentHistories;

    /**
     * @return List of status changes in the order. A `shipment_history` block as defined below.
     * 
     */
    public Optional<Output<List<OrderShipmentHistoryArgs>>> shipmentHistories() {
        return Optional.ofNullable(this.shipmentHistories);
    }

    /**
     * Tracking information for the package delivered to the customer whether it has an original or a replacement device. A `shipment_tracking` block as defined below.
     * 
     */
    @Import(name="shipmentTrackings")
    private @Nullable Output<List<OrderShipmentTrackingArgs>> shipmentTrackings;

    /**
     * @return Tracking information for the package delivered to the customer whether it has an original or a replacement device. A `shipment_tracking` block as defined below.
     * 
     */
    public Optional<Output<List<OrderShipmentTrackingArgs>>> shipmentTrackings() {
        return Optional.ofNullable(this.shipmentTrackings);
    }

    /**
     * The current status of the order. A `status` block as defined below.
     * 
     */
    @Import(name="statuses")
    private @Nullable Output<List<OrderStatusArgs>> statuses;

    /**
     * @return The current status of the order. A `status` block as defined below.
     * 
     */
    public Optional<Output<List<OrderStatusArgs>>> statuses() {
        return Optional.ofNullable(this.statuses);
    }

    private OrderState() {}

    private OrderState(OrderState $) {
        this.contact = $.contact;
        this.deviceName = $.deviceName;
        this.name = $.name;
        this.resourceGroupName = $.resourceGroupName;
        this.returnTrackings = $.returnTrackings;
        this.serialNumber = $.serialNumber;
        this.shipmentAddress = $.shipmentAddress;
        this.shipmentHistories = $.shipmentHistories;
        this.shipmentTrackings = $.shipmentTrackings;
        this.statuses = $.statuses;
    }

    public static Builder builder() {
        return new Builder();
    }
    public static Builder builder(OrderState defaults) {
        return new Builder(defaults);
    }

    public static final class Builder {
        private OrderState $;

        public Builder() {
            $ = new OrderState();
        }

        public Builder(OrderState defaults) {
            $ = new OrderState(Objects.requireNonNull(defaults));
        }

        /**
         * @param contact A `contact` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder contact(@Nullable Output<OrderContactArgs> contact) {
            $.contact = contact;
            return this;
        }

        /**
         * @param contact A `contact` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder contact(OrderContactArgs contact) {
            return contact(Output.of(contact));
        }

        /**
         * @param deviceName The name of the Databox Edge Device this order is for. Changing this forces a new Databox Edge Order to be created.
         * 
         * @return builder
         * 
         */
        public Builder deviceName(@Nullable Output<String> deviceName) {
            $.deviceName = deviceName;
            return this;
        }

        /**
         * @param deviceName The name of the Databox Edge Device this order is for. Changing this forces a new Databox Edge Order to be created.
         * 
         * @return builder
         * 
         */
        public Builder deviceName(String deviceName) {
            return deviceName(Output.of(deviceName));
        }

        /**
         * @param name The contact person name. Changing this forces a new Databox Edge Order to be created.
         * 
         * @return builder
         * 
         */
        public Builder name(@Nullable Output<String> name) {
            $.name = name;
            return this;
        }

        /**
         * @param name The contact person name. Changing this forces a new Databox Edge Order to be created.
         * 
         * @return builder
         * 
         */
        public Builder name(String name) {
            return name(Output.of(name));
        }

        /**
         * @param resourceGroupName The name of the Resource Group where the Databox Edge Order should exist. Changing this forces a new Databox Edge Order to be created.
         * 
         * @return builder
         * 
         */
        public Builder resourceGroupName(@Nullable Output<String> resourceGroupName) {
            $.resourceGroupName = resourceGroupName;
            return this;
        }

        /**
         * @param resourceGroupName The name of the Resource Group where the Databox Edge Order should exist. Changing this forces a new Databox Edge Order to be created.
         * 
         * @return builder
         * 
         */
        public Builder resourceGroupName(String resourceGroupName) {
            return resourceGroupName(Output.of(resourceGroupName));
        }

        /**
         * @param returnTrackings Tracking information for the package returned from the customer whether it has an original or a replacement device. A `return_tracking` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder returnTrackings(@Nullable Output<List<OrderReturnTrackingArgs>> returnTrackings) {
            $.returnTrackings = returnTrackings;
            return this;
        }

        /**
         * @param returnTrackings Tracking information for the package returned from the customer whether it has an original or a replacement device. A `return_tracking` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder returnTrackings(List<OrderReturnTrackingArgs> returnTrackings) {
            return returnTrackings(Output.of(returnTrackings));
        }

        /**
         * @param returnTrackings Tracking information for the package returned from the customer whether it has an original or a replacement device. A `return_tracking` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder returnTrackings(OrderReturnTrackingArgs... returnTrackings) {
            return returnTrackings(List.of(returnTrackings));
        }

        /**
         * @param serialNumber Serial number of the device being tracked.
         * 
         * @return builder
         * 
         */
        public Builder serialNumber(@Nullable Output<String> serialNumber) {
            $.serialNumber = serialNumber;
            return this;
        }

        /**
         * @param serialNumber Serial number of the device being tracked.
         * 
         * @return builder
         * 
         */
        public Builder serialNumber(String serialNumber) {
            return serialNumber(Output.of(serialNumber));
        }

        /**
         * @param shipmentAddress A `shipment_address` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder shipmentAddress(@Nullable Output<OrderShipmentAddressArgs> shipmentAddress) {
            $.shipmentAddress = shipmentAddress;
            return this;
        }

        /**
         * @param shipmentAddress A `shipment_address` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder shipmentAddress(OrderShipmentAddressArgs shipmentAddress) {
            return shipmentAddress(Output.of(shipmentAddress));
        }

        /**
         * @param shipmentHistories List of status changes in the order. A `shipment_history` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder shipmentHistories(@Nullable Output<List<OrderShipmentHistoryArgs>> shipmentHistories) {
            $.shipmentHistories = shipmentHistories;
            return this;
        }

        /**
         * @param shipmentHistories List of status changes in the order. A `shipment_history` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder shipmentHistories(List<OrderShipmentHistoryArgs> shipmentHistories) {
            return shipmentHistories(Output.of(shipmentHistories));
        }

        /**
         * @param shipmentHistories List of status changes in the order. A `shipment_history` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder shipmentHistories(OrderShipmentHistoryArgs... shipmentHistories) {
            return shipmentHistories(List.of(shipmentHistories));
        }

        /**
         * @param shipmentTrackings Tracking information for the package delivered to the customer whether it has an original or a replacement device. A `shipment_tracking` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder shipmentTrackings(@Nullable Output<List<OrderShipmentTrackingArgs>> shipmentTrackings) {
            $.shipmentTrackings = shipmentTrackings;
            return this;
        }

        /**
         * @param shipmentTrackings Tracking information for the package delivered to the customer whether it has an original or a replacement device. A `shipment_tracking` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder shipmentTrackings(List<OrderShipmentTrackingArgs> shipmentTrackings) {
            return shipmentTrackings(Output.of(shipmentTrackings));
        }

        /**
         * @param shipmentTrackings Tracking information for the package delivered to the customer whether it has an original or a replacement device. A `shipment_tracking` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder shipmentTrackings(OrderShipmentTrackingArgs... shipmentTrackings) {
            return shipmentTrackings(List.of(shipmentTrackings));
        }

        /**
         * @param statuses The current status of the order. A `status` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder statuses(@Nullable Output<List<OrderStatusArgs>> statuses) {
            $.statuses = statuses;
            return this;
        }

        /**
         * @param statuses The current status of the order. A `status` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder statuses(List<OrderStatusArgs> statuses) {
            return statuses(Output.of(statuses));
        }

        /**
         * @param statuses The current status of the order. A `status` block as defined below.
         * 
         * @return builder
         * 
         */
        public Builder statuses(OrderStatusArgs... statuses) {
            return statuses(List.of(statuses));
        }

        public OrderState build() {
            return $;
        }
    }

}
