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

import com.pulumi.core.annotations.CustomType;
import com.pulumi.gcp.compute.outputs.GetRouterNatLogConfig;
import com.pulumi.gcp.compute.outputs.GetRouterNatRule;
import com.pulumi.gcp.compute.outputs.GetRouterNatSubnetwork;
import java.lang.Boolean;
import java.lang.Integer;
import java.lang.String;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;

@CustomType
public final class GetRouterNatResult {
    private List<String> drainNatIps;
    private Boolean enableDynamicPortAllocation;
    private Boolean enableEndpointIndependentMapping;
    private Integer icmpIdleTimeoutSec;
    /**
     * @return The provider-assigned unique ID for this managed resource.
     * 
     */
    private String id;
    private List<GetRouterNatLogConfig> logConfigs;
    private Integer maxPortsPerVm;
    private Integer minPortsPerVm;
    private String name;
    private String natIpAllocateOption;
    private List<String> natIps;
    private @Nullable String project;
    private @Nullable String region;
    private String router;
    private List<GetRouterNatRule> rules;
    private String sourceSubnetworkIpRangesToNat;
    private List<GetRouterNatSubnetwork> subnetworks;
    private Integer tcpEstablishedIdleTimeoutSec;
    private Integer tcpTimeWaitTimeoutSec;
    private Integer tcpTransitoryIdleTimeoutSec;
    private Integer udpIdleTimeoutSec;

    private GetRouterNatResult() {}
    public List<String> drainNatIps() {
        return this.drainNatIps;
    }
    public Boolean enableDynamicPortAllocation() {
        return this.enableDynamicPortAllocation;
    }
    public Boolean enableEndpointIndependentMapping() {
        return this.enableEndpointIndependentMapping;
    }
    public Integer icmpIdleTimeoutSec() {
        return this.icmpIdleTimeoutSec;
    }
    /**
     * @return The provider-assigned unique ID for this managed resource.
     * 
     */
    public String id() {
        return this.id;
    }
    public List<GetRouterNatLogConfig> logConfigs() {
        return this.logConfigs;
    }
    public Integer maxPortsPerVm() {
        return this.maxPortsPerVm;
    }
    public Integer minPortsPerVm() {
        return this.minPortsPerVm;
    }
    public String name() {
        return this.name;
    }
    public String natIpAllocateOption() {
        return this.natIpAllocateOption;
    }
    public List<String> natIps() {
        return this.natIps;
    }
    public Optional<String> project() {
        return Optional.ofNullable(this.project);
    }
    public Optional<String> region() {
        return Optional.ofNullable(this.region);
    }
    public String router() {
        return this.router;
    }
    public List<GetRouterNatRule> rules() {
        return this.rules;
    }
    public String sourceSubnetworkIpRangesToNat() {
        return this.sourceSubnetworkIpRangesToNat;
    }
    public List<GetRouterNatSubnetwork> subnetworks() {
        return this.subnetworks;
    }
    public Integer tcpEstablishedIdleTimeoutSec() {
        return this.tcpEstablishedIdleTimeoutSec;
    }
    public Integer tcpTimeWaitTimeoutSec() {
        return this.tcpTimeWaitTimeoutSec;
    }
    public Integer tcpTransitoryIdleTimeoutSec() {
        return this.tcpTransitoryIdleTimeoutSec;
    }
    public Integer udpIdleTimeoutSec() {
        return this.udpIdleTimeoutSec;
    }

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

    public static Builder builder(GetRouterNatResult defaults) {
        return new Builder(defaults);
    }
    @CustomType.Builder
    public static final class Builder {
        private List<String> drainNatIps;
        private Boolean enableDynamicPortAllocation;
        private Boolean enableEndpointIndependentMapping;
        private Integer icmpIdleTimeoutSec;
        private String id;
        private List<GetRouterNatLogConfig> logConfigs;
        private Integer maxPortsPerVm;
        private Integer minPortsPerVm;
        private String name;
        private String natIpAllocateOption;
        private List<String> natIps;
        private @Nullable String project;
        private @Nullable String region;
        private String router;
        private List<GetRouterNatRule> rules;
        private String sourceSubnetworkIpRangesToNat;
        private List<GetRouterNatSubnetwork> subnetworks;
        private Integer tcpEstablishedIdleTimeoutSec;
        private Integer tcpTimeWaitTimeoutSec;
        private Integer tcpTransitoryIdleTimeoutSec;
        private Integer udpIdleTimeoutSec;
        public Builder() {}
        public Builder(GetRouterNatResult defaults) {
    	      Objects.requireNonNull(defaults);
    	      this.drainNatIps = defaults.drainNatIps;
    	      this.enableDynamicPortAllocation = defaults.enableDynamicPortAllocation;
    	      this.enableEndpointIndependentMapping = defaults.enableEndpointIndependentMapping;
    	      this.icmpIdleTimeoutSec = defaults.icmpIdleTimeoutSec;
    	      this.id = defaults.id;
    	      this.logConfigs = defaults.logConfigs;
    	      this.maxPortsPerVm = defaults.maxPortsPerVm;
    	      this.minPortsPerVm = defaults.minPortsPerVm;
    	      this.name = defaults.name;
    	      this.natIpAllocateOption = defaults.natIpAllocateOption;
    	      this.natIps = defaults.natIps;
    	      this.project = defaults.project;
    	      this.region = defaults.region;
    	      this.router = defaults.router;
    	      this.rules = defaults.rules;
    	      this.sourceSubnetworkIpRangesToNat = defaults.sourceSubnetworkIpRangesToNat;
    	      this.subnetworks = defaults.subnetworks;
    	      this.tcpEstablishedIdleTimeoutSec = defaults.tcpEstablishedIdleTimeoutSec;
    	      this.tcpTimeWaitTimeoutSec = defaults.tcpTimeWaitTimeoutSec;
    	      this.tcpTransitoryIdleTimeoutSec = defaults.tcpTransitoryIdleTimeoutSec;
    	      this.udpIdleTimeoutSec = defaults.udpIdleTimeoutSec;
        }

        @CustomType.Setter
        public Builder drainNatIps(List<String> drainNatIps) {
            this.drainNatIps = Objects.requireNonNull(drainNatIps);
            return this;
        }
        public Builder drainNatIps(String... drainNatIps) {
            return drainNatIps(List.of(drainNatIps));
        }
        @CustomType.Setter
        public Builder enableDynamicPortAllocation(Boolean enableDynamicPortAllocation) {
            this.enableDynamicPortAllocation = Objects.requireNonNull(enableDynamicPortAllocation);
            return this;
        }
        @CustomType.Setter
        public Builder enableEndpointIndependentMapping(Boolean enableEndpointIndependentMapping) {
            this.enableEndpointIndependentMapping = Objects.requireNonNull(enableEndpointIndependentMapping);
            return this;
        }
        @CustomType.Setter
        public Builder icmpIdleTimeoutSec(Integer icmpIdleTimeoutSec) {
            this.icmpIdleTimeoutSec = Objects.requireNonNull(icmpIdleTimeoutSec);
            return this;
        }
        @CustomType.Setter
        public Builder id(String id) {
            this.id = Objects.requireNonNull(id);
            return this;
        }
        @CustomType.Setter
        public Builder logConfigs(List<GetRouterNatLogConfig> logConfigs) {
            this.logConfigs = Objects.requireNonNull(logConfigs);
            return this;
        }
        public Builder logConfigs(GetRouterNatLogConfig... logConfigs) {
            return logConfigs(List.of(logConfigs));
        }
        @CustomType.Setter
        public Builder maxPortsPerVm(Integer maxPortsPerVm) {
            this.maxPortsPerVm = Objects.requireNonNull(maxPortsPerVm);
            return this;
        }
        @CustomType.Setter
        public Builder minPortsPerVm(Integer minPortsPerVm) {
            this.minPortsPerVm = Objects.requireNonNull(minPortsPerVm);
            return this;
        }
        @CustomType.Setter
        public Builder name(String name) {
            this.name = Objects.requireNonNull(name);
            return this;
        }
        @CustomType.Setter
        public Builder natIpAllocateOption(String natIpAllocateOption) {
            this.natIpAllocateOption = Objects.requireNonNull(natIpAllocateOption);
            return this;
        }
        @CustomType.Setter
        public Builder natIps(List<String> natIps) {
            this.natIps = Objects.requireNonNull(natIps);
            return this;
        }
        public Builder natIps(String... natIps) {
            return natIps(List.of(natIps));
        }
        @CustomType.Setter
        public Builder project(@Nullable String project) {
            this.project = project;
            return this;
        }
        @CustomType.Setter
        public Builder region(@Nullable String region) {
            this.region = region;
            return this;
        }
        @CustomType.Setter
        public Builder router(String router) {
            this.router = Objects.requireNonNull(router);
            return this;
        }
        @CustomType.Setter
        public Builder rules(List<GetRouterNatRule> rules) {
            this.rules = Objects.requireNonNull(rules);
            return this;
        }
        public Builder rules(GetRouterNatRule... rules) {
            return rules(List.of(rules));
        }
        @CustomType.Setter
        public Builder sourceSubnetworkIpRangesToNat(String sourceSubnetworkIpRangesToNat) {
            this.sourceSubnetworkIpRangesToNat = Objects.requireNonNull(sourceSubnetworkIpRangesToNat);
            return this;
        }
        @CustomType.Setter
        public Builder subnetworks(List<GetRouterNatSubnetwork> subnetworks) {
            this.subnetworks = Objects.requireNonNull(subnetworks);
            return this;
        }
        public Builder subnetworks(GetRouterNatSubnetwork... subnetworks) {
            return subnetworks(List.of(subnetworks));
        }
        @CustomType.Setter
        public Builder tcpEstablishedIdleTimeoutSec(Integer tcpEstablishedIdleTimeoutSec) {
            this.tcpEstablishedIdleTimeoutSec = Objects.requireNonNull(tcpEstablishedIdleTimeoutSec);
            return this;
        }
        @CustomType.Setter
        public Builder tcpTimeWaitTimeoutSec(Integer tcpTimeWaitTimeoutSec) {
            this.tcpTimeWaitTimeoutSec = Objects.requireNonNull(tcpTimeWaitTimeoutSec);
            return this;
        }
        @CustomType.Setter
        public Builder tcpTransitoryIdleTimeoutSec(Integer tcpTransitoryIdleTimeoutSec) {
            this.tcpTransitoryIdleTimeoutSec = Objects.requireNonNull(tcpTransitoryIdleTimeoutSec);
            return this;
        }
        @CustomType.Setter
        public Builder udpIdleTimeoutSec(Integer udpIdleTimeoutSec) {
            this.udpIdleTimeoutSec = Objects.requireNonNull(udpIdleTimeoutSec);
            return this;
        }
        public GetRouterNatResult build() {
            final var o = new GetRouterNatResult();
            o.drainNatIps = drainNatIps;
            o.enableDynamicPortAllocation = enableDynamicPortAllocation;
            o.enableEndpointIndependentMapping = enableEndpointIndependentMapping;
            o.icmpIdleTimeoutSec = icmpIdleTimeoutSec;
            o.id = id;
            o.logConfigs = logConfigs;
            o.maxPortsPerVm = maxPortsPerVm;
            o.minPortsPerVm = minPortsPerVm;
            o.name = name;
            o.natIpAllocateOption = natIpAllocateOption;
            o.natIps = natIps;
            o.project = project;
            o.region = region;
            o.router = router;
            o.rules = rules;
            o.sourceSubnetworkIpRangesToNat = sourceSubnetworkIpRangesToNat;
            o.subnetworks = subnetworks;
            o.tcpEstablishedIdleTimeoutSec = tcpEstablishedIdleTimeoutSec;
            o.tcpTimeWaitTimeoutSec = tcpTimeWaitTimeoutSec;
            o.tcpTransitoryIdleTimeoutSec = tcpTransitoryIdleTimeoutSec;
            o.udpIdleTimeoutSec = udpIdleTimeoutSec;
            return o;
        }
    }
}
