// *** 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.gcp.compute.inputs;

import com.pulumi.core.Output;
import com.pulumi.core.annotations.Import;
import com.pulumi.gcp.compute.inputs.ResourcePolicySnapshotSchedulePolicyRetentionPolicyArgs;
import com.pulumi.gcp.compute.inputs.ResourcePolicySnapshotSchedulePolicyScheduleArgs;
import com.pulumi.gcp.compute.inputs.ResourcePolicySnapshotSchedulePolicySnapshotPropertiesArgs;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;


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

    public static final ResourcePolicySnapshotSchedulePolicyArgs Empty = new ResourcePolicySnapshotSchedulePolicyArgs();

    /**
     * Retention policy applied to snapshots created by this resource policy.
     * Structure is documented below.
     * 
     */
    @Import(name="retentionPolicy")
    private @Nullable Output<ResourcePolicySnapshotSchedulePolicyRetentionPolicyArgs> retentionPolicy;

    /**
     * @return Retention policy applied to snapshots created by this resource policy.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ResourcePolicySnapshotSchedulePolicyRetentionPolicyArgs>> retentionPolicy() {
        return Optional.ofNullable(this.retentionPolicy);
    }

    /**
     * Contains one of an `hourlySchedule`, `dailySchedule`, or `weeklySchedule`.
     * Structure is documented below.
     * 
     */
    @Import(name="schedule", required=true)
    private Output<ResourcePolicySnapshotSchedulePolicyScheduleArgs> schedule;

    /**
     * @return Contains one of an `hourlySchedule`, `dailySchedule`, or `weeklySchedule`.
     * Structure is documented below.
     * 
     */
    public Output<ResourcePolicySnapshotSchedulePolicyScheduleArgs> schedule() {
        return this.schedule;
    }

    /**
     * Properties with which the snapshots are created, such as labels.
     * Structure is documented below.
     * 
     */
    @Import(name="snapshotProperties")
    private @Nullable Output<ResourcePolicySnapshotSchedulePolicySnapshotPropertiesArgs> snapshotProperties;

    /**
     * @return Properties with which the snapshots are created, such as labels.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ResourcePolicySnapshotSchedulePolicySnapshotPropertiesArgs>> snapshotProperties() {
        return Optional.ofNullable(this.snapshotProperties);
    }

    private ResourcePolicySnapshotSchedulePolicyArgs() {}

    private ResourcePolicySnapshotSchedulePolicyArgs(ResourcePolicySnapshotSchedulePolicyArgs $) {
        this.retentionPolicy = $.retentionPolicy;
        this.schedule = $.schedule;
        this.snapshotProperties = $.snapshotProperties;
    }

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

    public static final class Builder {
        private ResourcePolicySnapshotSchedulePolicyArgs $;

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

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

        /**
         * @param retentionPolicy Retention policy applied to snapshots created by this resource policy.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder retentionPolicy(@Nullable Output<ResourcePolicySnapshotSchedulePolicyRetentionPolicyArgs> retentionPolicy) {
            $.retentionPolicy = retentionPolicy;
            return this;
        }

        /**
         * @param retentionPolicy Retention policy applied to snapshots created by this resource policy.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder retentionPolicy(ResourcePolicySnapshotSchedulePolicyRetentionPolicyArgs retentionPolicy) {
            return retentionPolicy(Output.of(retentionPolicy));
        }

        /**
         * @param schedule Contains one of an `hourlySchedule`, `dailySchedule`, or `weeklySchedule`.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder schedule(Output<ResourcePolicySnapshotSchedulePolicyScheduleArgs> schedule) {
            $.schedule = schedule;
            return this;
        }

        /**
         * @param schedule Contains one of an `hourlySchedule`, `dailySchedule`, or `weeklySchedule`.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder schedule(ResourcePolicySnapshotSchedulePolicyScheduleArgs schedule) {
            return schedule(Output.of(schedule));
        }

        /**
         * @param snapshotProperties Properties with which the snapshots are created, such as labels.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder snapshotProperties(@Nullable Output<ResourcePolicySnapshotSchedulePolicySnapshotPropertiesArgs> snapshotProperties) {
            $.snapshotProperties = snapshotProperties;
            return this;
        }

        /**
         * @param snapshotProperties Properties with which the snapshots are created, such as labels.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder snapshotProperties(ResourcePolicySnapshotSchedulePolicySnapshotPropertiesArgs snapshotProperties) {
            return snapshotProperties(Output.of(snapshotProperties));
        }

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

}
