// *** 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.aws.backup;

import com.pulumi.aws.backup.inputs.ReportPlanReportDeliveryChannelArgs;
import com.pulumi.aws.backup.inputs.ReportPlanReportSettingArgs;
import com.pulumi.core.Output;
import com.pulumi.core.annotations.Import;
import java.lang.String;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;


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

    public static final ReportPlanArgs Empty = new ReportPlanArgs();

    /**
     * The description of the report plan with a maximum of 1,024 characters
     * 
     */
    @Import(name="description")
    private @Nullable Output<String> description;

    /**
     * @return The description of the report plan with a maximum of 1,024 characters
     * 
     */
    public Optional<Output<String>> description() {
        return Optional.ofNullable(this.description);
    }

    /**
     * The unique name of the report plan. The name must be between 1 and 256 characters, starting with a letter, and consisting of letters, numbers, and underscores.
     * 
     */
    @Import(name="name")
    private @Nullable Output<String> name;

    /**
     * @return The unique name of the report plan. The name must be between 1 and 256 characters, starting with a letter, and consisting of letters, numbers, and underscores.
     * 
     */
    public Optional<Output<String>> name() {
        return Optional.ofNullable(this.name);
    }

    /**
     * An object that contains information about where and how to deliver your reports, specifically your Amazon S3 bucket name, S3 key prefix, and the formats of your reports. Detailed below.
     * 
     */
    @Import(name="reportDeliveryChannel", required=true)
    private Output<ReportPlanReportDeliveryChannelArgs> reportDeliveryChannel;

    /**
     * @return An object that contains information about where and how to deliver your reports, specifically your Amazon S3 bucket name, S3 key prefix, and the formats of your reports. Detailed below.
     * 
     */
    public Output<ReportPlanReportDeliveryChannelArgs> reportDeliveryChannel() {
        return this.reportDeliveryChannel;
    }

    /**
     * An object that identifies the report template for the report. Reports are built using a report template. Detailed below.
     * 
     */
    @Import(name="reportSetting", required=true)
    private Output<ReportPlanReportSettingArgs> reportSetting;

    /**
     * @return An object that identifies the report template for the report. Reports are built using a report template. Detailed below.
     * 
     */
    public Output<ReportPlanReportSettingArgs> reportSetting() {
        return this.reportSetting;
    }

    /**
     * Metadata that you can assign to help organize the report plans you create. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.
     * 
     */
    @Import(name="tags")
    private @Nullable Output<Map<String,String>> tags;

    /**
     * @return Metadata that you can assign to help organize the report plans you create. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.
     * 
     */
    public Optional<Output<Map<String,String>>> tags() {
        return Optional.ofNullable(this.tags);
    }

    private ReportPlanArgs() {}

    private ReportPlanArgs(ReportPlanArgs $) {
        this.description = $.description;
        this.name = $.name;
        this.reportDeliveryChannel = $.reportDeliveryChannel;
        this.reportSetting = $.reportSetting;
        this.tags = $.tags;
    }

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

    public static final class Builder {
        private ReportPlanArgs $;

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

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

        /**
         * @param description The description of the report plan with a maximum of 1,024 characters
         * 
         * @return builder
         * 
         */
        public Builder description(@Nullable Output<String> description) {
            $.description = description;
            return this;
        }

        /**
         * @param description The description of the report plan with a maximum of 1,024 characters
         * 
         * @return builder
         * 
         */
        public Builder description(String description) {
            return description(Output.of(description));
        }

        /**
         * @param name The unique name of the report plan. The name must be between 1 and 256 characters, starting with a letter, and consisting of letters, numbers, and underscores.
         * 
         * @return builder
         * 
         */
        public Builder name(@Nullable Output<String> name) {
            $.name = name;
            return this;
        }

        /**
         * @param name The unique name of the report plan. The name must be between 1 and 256 characters, starting with a letter, and consisting of letters, numbers, and underscores.
         * 
         * @return builder
         * 
         */
        public Builder name(String name) {
            return name(Output.of(name));
        }

        /**
         * @param reportDeliveryChannel An object that contains information about where and how to deliver your reports, specifically your Amazon S3 bucket name, S3 key prefix, and the formats of your reports. Detailed below.
         * 
         * @return builder
         * 
         */
        public Builder reportDeliveryChannel(Output<ReportPlanReportDeliveryChannelArgs> reportDeliveryChannel) {
            $.reportDeliveryChannel = reportDeliveryChannel;
            return this;
        }

        /**
         * @param reportDeliveryChannel An object that contains information about where and how to deliver your reports, specifically your Amazon S3 bucket name, S3 key prefix, and the formats of your reports. Detailed below.
         * 
         * @return builder
         * 
         */
        public Builder reportDeliveryChannel(ReportPlanReportDeliveryChannelArgs reportDeliveryChannel) {
            return reportDeliveryChannel(Output.of(reportDeliveryChannel));
        }

        /**
         * @param reportSetting An object that identifies the report template for the report. Reports are built using a report template. Detailed below.
         * 
         * @return builder
         * 
         */
        public Builder reportSetting(Output<ReportPlanReportSettingArgs> reportSetting) {
            $.reportSetting = reportSetting;
            return this;
        }

        /**
         * @param reportSetting An object that identifies the report template for the report. Reports are built using a report template. Detailed below.
         * 
         * @return builder
         * 
         */
        public Builder reportSetting(ReportPlanReportSettingArgs reportSetting) {
            return reportSetting(Output.of(reportSetting));
        }

        /**
         * @param tags Metadata that you can assign to help organize the report plans you create. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.
         * 
         * @return builder
         * 
         */
        public Builder tags(@Nullable Output<Map<String,String>> tags) {
            $.tags = tags;
            return this;
        }

        /**
         * @param tags Metadata that you can assign to help organize the report plans you create. If configured with a provider `default_tags` configuration block present, tags with matching keys will overwrite those defined at the provider-level.
         * 
         * @return builder
         * 
         */
        public Builder tags(Map<String,String> tags) {
            return tags(Output.of(tags));
        }

        public ReportPlanArgs build() {
            $.reportDeliveryChannel = Objects.requireNonNull($.reportDeliveryChannel, "expected parameter 'reportDeliveryChannel' to be non-null");
            $.reportSetting = Objects.requireNonNull($.reportSetting, "expected parameter 'reportSetting' to be non-null");
            return $;
        }
    }

}
