// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Pulumi.Serialization;
using Pulumi;

namespace Pulumiverse.Fortios
{
    /// <summary>
    /// This resource supports Create/Read/Update/Delete firewall security policy on FortiManager which could be installed to the FortiGate later
    /// 
    /// ## Example Usage
    /// 
    /// ```csharp
    /// using System.Collections.Generic;
    /// using System.Linq;
    /// using Pulumi;
    /// using Fortios = Pulumiverse.Fortios;
    /// 
    /// return await Deployment.RunAsync(() =&gt; 
    /// {
    ///     var test1 = new Fortios.FmgFirewallSecurityPolicy("test1", new()
    ///     {
    ///         Action = "accept",
    ///         AvProfiles = new[]
    ///         {
    ///             "g-default",
    ///         },
    ///         CapturePacket = "enable",
    ///         Comments = "policy test",
    ///         DnsfilterProfiles = new[]
    ///         {
    ///             "default",
    ///         },
    ///         Dstaddrs = new[]
    ///         {
    ///             "all",
    ///         },
    ///         Dstintfs = new[]
    ///         {
    ///             "any",
    ///         },
    ///         Fixedport = "enable",
    ///         Groups = new[]
    ///         {
    ///             "Guest-group",
    ///         },
    ///         Ippool = "disable",
    ///         Logtraffic = "all",
    ///         LogtrafficStart = "enable",
    ///         Nat = "enable",
    ///         PackageName = "dvm-test",
    ///         ProfileType = "single",
    ///         Schedules = new[]
    ///         {
    ///             "always",
    ///         },
    ///         Services = new[]
    ///         {
    ///             "ALL",
    ///         },
    ///         Srcaddrs = new[]
    ///         {
    ///             "all",
    ///         },
    ///         Srcintfs = new[]
    ///         {
    ///             "any",
    ///         },
    ///         TrafficShapers = new[]
    ///         {
    ///             "high-priority",
    ///         },
    ///         Users = new[]
    ///         {
    ///             "guest",
    ///         },
    ///         UtmStatus = "enable",
    ///     });
    /// 
    /// });
    /// ```
    /// </summary>
    [FortiosResourceType("fortios:index/fmgFirewallSecurityPolicy:FmgFirewallSecurityPolicy")]
    public partial class FmgFirewallSecurityPolicy : global::Pulumi.CustomResource
    {
        /// <summary>
        /// Policy action, default is deny. Enum: [allow, deny, ipsec].
        /// </summary>
        [Output("action")]
        public Output<string?> Action { get; private set; } = null!;

        /// <summary>
        /// ADOM name. default is 'root'.
        /// </summary>
        [Output("adom")]
        public Output<string?> Adom { get; private set; } = null!;

        /// <summary>
        /// Name of an existing Application list.
        /// </summary>
        [Output("applicationLists")]
        public Output<ImmutableArray<string>> ApplicationLists { get; private set; } = null!;

        /// <summary>
        /// Name of an existing Antivirus profile.
        /// </summary>
        [Output("avProfiles")]
        public Output<ImmutableArray<string>> AvProfiles { get; private set; } = null!;

        /// <summary>
        /// Enable/disable capture packets.
        /// </summary>
        [Output("capturePacket")]
        public Output<string?> CapturePacket { get; private set; } = null!;

        /// <summary>
        /// Comments.
        /// </summary>
        [Output("comments")]
        public Output<string?> Comments { get; private set; } = null!;

        /// <summary>
        /// Name of an existing DNS filter profile.
        /// </summary>
        [Output("dnsfilterProfiles")]
        public Output<ImmutableArray<string>> DnsfilterProfiles { get; private set; } = null!;

        /// <summary>
        /// Destination address and adress group names.
        /// </summary>
        [Output("dstaddrs")]
        public Output<ImmutableArray<string>> Dstaddrs { get; private set; } = null!;

        /// <summary>
        /// Outgoing interface.
        /// </summary>
        [Output("dstintfs")]
        public Output<ImmutableArray<string>> Dstintfs { get; private set; } = null!;

        /// <summary>
        /// Enable/disable to prevent source NAT from changing a session's source port.
        /// </summary>
        [Output("fixedport")]
        public Output<string?> Fixedport { get; private set; } = null!;

        /// <summary>
        /// Enable/disable Fortinet Single Sign-On.
        /// </summary>
        [Output("fsso")]
        public Output<string?> Fsso { get; private set; } = null!;

        /// <summary>
        /// Names of user groups that can authenticate with this policy.
        /// </summary>
        [Output("groups")]
        public Output<ImmutableArray<string>> Groups { get; private set; } = null!;

        /// <summary>
        /// Policy-based IPsec VPN: only traffic from the remote network can initiate a VPN. Enum: [disable, enable]
        /// </summary>
        [Output("inbound")]
        public Output<string?> Inbound { get; private set; } = null!;

        /// <summary>
        /// Enable/disable use of Destination Internet Services for this policy.
        /// </summary>
        [Output("internetService")]
        public Output<string> InternetService { get; private set; } = null!;

        /// <summary>
        /// Destination Internet Service ID.
        /// </summary>
        [Output("internetServiceIds")]
        public Output<ImmutableArray<string>> InternetServiceIds { get; private set; } = null!;

        /// <summary>
        /// Destination Internet Service Name.
        /// </summary>
        [Output("internetServiceNames")]
        public Output<ImmutableArray<string>> InternetServiceNames { get; private set; } = null!;

        /// <summary>
        /// Enable/disable use of Source Internet Services for this policy.
        /// </summary>
        [Output("internetServiceSrc")]
        public Output<string> InternetServiceSrc { get; private set; } = null!;

        /// <summary>
        /// Source Internet Service ID.
        /// </summary>
        [Output("internetServiceSrcIds")]
        public Output<ImmutableArray<string>> InternetServiceSrcIds { get; private set; } = null!;

        /// <summary>
        /// Source Internet Service Name.
        /// </summary>
        [Output("internetServiceSrcNames")]
        public Output<ImmutableArray<string>> InternetServiceSrcNames { get; private set; } = null!;

        /// <summary>
        /// Enable/disable to use IP Pools for source NAT.
        /// </summary>
        [Output("ippool")]
        public Output<string?> Ippool { get; private set; } = null!;

        /// <summary>
        /// Name of an existing IPS sensor.
        /// </summary>
        [Output("ipsSensors")]
        public Output<ImmutableArray<string>> IpsSensors { get; private set; } = null!;

        /// <summary>
        /// Enable or disable logging. Enum: [disable, all, utm]
        /// </summary>
        [Output("logtraffic")]
        public Output<string?> Logtraffic { get; private set; } = null!;

        /// <summary>
        /// Record logs when a session starts and ends. Enum: [disable, enable]
        /// </summary>
        [Output("logtrafficStart")]
        public Output<string?> LogtrafficStart { get; private set; } = null!;

        /// <summary>
        /// Policy name.
        /// </summary>
        [Output("name")]
        public Output<string> Name { get; private set; } = null!;

        /// <summary>
        /// Enable/disable source NAT.
        /// </summary>
        [Output("nat")]
        public Output<string?> Nat { get; private set; } = null!;

        /// <summary>
        /// The package name which the policy will be added to.
        /// </summary>
        [Output("packageName")]
        public Output<string?> PackageName { get; private set; } = null!;

        /// <summary>
        /// Per-IP traffic shaper.
        /// </summary>
        [Output("perIpShapers")]
        public Output<ImmutableArray<string>> PerIpShapers { get; private set; } = null!;

        /// <summary>
        /// IP Pool names.
        /// </summary>
        [Output("poolnames")]
        public Output<ImmutableArray<string>> Poolnames { get; private set; } = null!;

        /// <summary>
        /// Name of profile group.
        /// </summary>
        [Output("profileGroups")]
        public Output<ImmutableArray<string>> ProfileGroups { get; private set; } = null!;

        /// <summary>
        /// Name of an existing Protocol options profile.
        /// </summary>
        [Output("profileProtocolOptions")]
        public Output<ImmutableArray<string>> ProfileProtocolOptions { get; private set; } = null!;

        /// <summary>
        /// Determine whether the firewall policy allows security profile groups or single profiles only. Enum: [single, group]
        /// </summary>
        [Output("profileType")]
        public Output<string?> ProfileType { get; private set; } = null!;

        /// <summary>
        /// Enable/disable RADIUS Single Sign-On.
        /// </summary>
        [Output("rsso")]
        public Output<string?> Rsso { get; private set; } = null!;

        /// <summary>
        /// Schedule name.
        /// </summary>
        [Output("schedules")]
        public Output<ImmutableArray<string>> Schedules { get; private set; } = null!;

        /// <summary>
        /// Service and service group names.
        /// </summary>
        [Output("services")]
        public Output<ImmutableArray<string>> Services { get; private set; } = null!;

        /// <summary>
        /// Source address and adress group names.
        /// </summary>
        [Output("srcaddrs")]
        public Output<ImmutableArray<string>> Srcaddrs { get; private set; } = null!;

        /// <summary>
        /// Incoming interface.
        /// </summary>
        [Output("srcintfs")]
        public Output<ImmutableArray<string>> Srcintfs { get; private set; } = null!;

        /// <summary>
        /// Reverse traffic shaper.
        /// </summary>
        [Output("trafficShaperReverses")]
        public Output<ImmutableArray<string>> TrafficShaperReverses { get; private set; } = null!;

        /// <summary>
        /// Traffic shaper.
        /// </summary>
        [Output("trafficShapers")]
        public Output<ImmutableArray<string>> TrafficShapers { get; private set; } = null!;

        /// <summary>
        /// Names of individual users that can authenticate with this policy.
        /// </summary>
        [Output("users")]
        public Output<ImmutableArray<string>> Users { get; private set; } = null!;

        /// <summary>
        /// Enable/disable to add one or more security profiles (AV, IPS, etc.) to the firewall policy.
        /// </summary>
        [Output("utmStatus")]
        public Output<string?> UtmStatus { get; private set; } = null!;

        [Output("vpnTunnels")]
        public Output<ImmutableArray<string>> VpnTunnels { get; private set; } = null!;

        /// <summary>
        /// Name of an existing Web application firewall profile.
        /// </summary>
        [Output("wafProfiles")]
        public Output<ImmutableArray<string>> WafProfiles { get; private set; } = null!;

        /// <summary>
        /// Name of an existing Web filter profile.
        /// </summary>
        [Output("webfilterProfiles")]
        public Output<ImmutableArray<string>> WebfilterProfiles { get; private set; } = null!;


        /// <summary>
        /// Create a FmgFirewallSecurityPolicy resource with the given unique name, arguments, and options.
        /// </summary>
        ///
        /// <param name="name">The unique name of the resource</param>
        /// <param name="args">The arguments used to populate this resource's properties</param>
        /// <param name="options">A bag of options that control this resource's behavior</param>
        public FmgFirewallSecurityPolicy(string name, FmgFirewallSecurityPolicyArgs args, CustomResourceOptions? options = null)
            : base("fortios:index/fmgFirewallSecurityPolicy:FmgFirewallSecurityPolicy", name, args ?? new FmgFirewallSecurityPolicyArgs(), MakeResourceOptions(options, ""))
        {
        }

        private FmgFirewallSecurityPolicy(string name, Input<string> id, FmgFirewallSecurityPolicyState? state = null, CustomResourceOptions? options = null)
            : base("fortios:index/fmgFirewallSecurityPolicy:FmgFirewallSecurityPolicy", name, state, MakeResourceOptions(options, id))
        {
        }

        private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input<string>? id)
        {
            var defaultOptions = new CustomResourceOptions
            {
                Version = Utilities.Version,
                PluginDownloadURL = "github://api.github.com/pulumiverse/pulumi-fortios",
            };
            var merged = CustomResourceOptions.Merge(defaultOptions, options);
            // Override the ID if one was specified for consistency with other language SDKs.
            merged.Id = id ?? merged.Id;
            return merged;
        }
        /// <summary>
        /// Get an existing FmgFirewallSecurityPolicy resource's state with the given name, ID, and optional extra
        /// properties used to qualify the lookup.
        /// </summary>
        ///
        /// <param name="name">The unique name of the resulting resource.</param>
        /// <param name="id">The unique provider ID of the resource to lookup.</param>
        /// <param name="state">Any extra arguments used during the lookup.</param>
        /// <param name="options">A bag of options that control this resource's behavior</param>
        public static FmgFirewallSecurityPolicy Get(string name, Input<string> id, FmgFirewallSecurityPolicyState? state = null, CustomResourceOptions? options = null)
        {
            return new FmgFirewallSecurityPolicy(name, id, state, options);
        }
    }

    public sealed class FmgFirewallSecurityPolicyArgs : global::Pulumi.ResourceArgs
    {
        /// <summary>
        /// Policy action, default is deny. Enum: [allow, deny, ipsec].
        /// </summary>
        [Input("action")]
        public Input<string>? Action { get; set; }

        /// <summary>
        /// ADOM name. default is 'root'.
        /// </summary>
        [Input("adom")]
        public Input<string>? Adom { get; set; }

        [Input("applicationLists")]
        private InputList<string>? _applicationLists;

        /// <summary>
        /// Name of an existing Application list.
        /// </summary>
        public InputList<string> ApplicationLists
        {
            get => _applicationLists ?? (_applicationLists = new InputList<string>());
            set => _applicationLists = value;
        }

        [Input("avProfiles")]
        private InputList<string>? _avProfiles;

        /// <summary>
        /// Name of an existing Antivirus profile.
        /// </summary>
        public InputList<string> AvProfiles
        {
            get => _avProfiles ?? (_avProfiles = new InputList<string>());
            set => _avProfiles = value;
        }

        /// <summary>
        /// Enable/disable capture packets.
        /// </summary>
        [Input("capturePacket")]
        public Input<string>? CapturePacket { get; set; }

        /// <summary>
        /// Comments.
        /// </summary>
        [Input("comments")]
        public Input<string>? Comments { get; set; }

        [Input("dnsfilterProfiles")]
        private InputList<string>? _dnsfilterProfiles;

        /// <summary>
        /// Name of an existing DNS filter profile.
        /// </summary>
        public InputList<string> DnsfilterProfiles
        {
            get => _dnsfilterProfiles ?? (_dnsfilterProfiles = new InputList<string>());
            set => _dnsfilterProfiles = value;
        }

        [Input("dstaddrs", required: true)]
        private InputList<string>? _dstaddrs;

        /// <summary>
        /// Destination address and adress group names.
        /// </summary>
        public InputList<string> Dstaddrs
        {
            get => _dstaddrs ?? (_dstaddrs = new InputList<string>());
            set => _dstaddrs = value;
        }

        [Input("dstintfs", required: true)]
        private InputList<string>? _dstintfs;

        /// <summary>
        /// Outgoing interface.
        /// </summary>
        public InputList<string> Dstintfs
        {
            get => _dstintfs ?? (_dstintfs = new InputList<string>());
            set => _dstintfs = value;
        }

        /// <summary>
        /// Enable/disable to prevent source NAT from changing a session's source port.
        /// </summary>
        [Input("fixedport")]
        public Input<string>? Fixedport { get; set; }

        /// <summary>
        /// Enable/disable Fortinet Single Sign-On.
        /// </summary>
        [Input("fsso")]
        public Input<string>? Fsso { get; set; }

        [Input("groups")]
        private InputList<string>? _groups;

        /// <summary>
        /// Names of user groups that can authenticate with this policy.
        /// </summary>
        public InputList<string> Groups
        {
            get => _groups ?? (_groups = new InputList<string>());
            set => _groups = value;
        }

        /// <summary>
        /// Policy-based IPsec VPN: only traffic from the remote network can initiate a VPN. Enum: [disable, enable]
        /// </summary>
        [Input("inbound")]
        public Input<string>? Inbound { get; set; }

        /// <summary>
        /// Enable/disable use of Destination Internet Services for this policy.
        /// </summary>
        [Input("internetService")]
        public Input<string>? InternetService { get; set; }

        [Input("internetServiceIds")]
        private InputList<string>? _internetServiceIds;

        /// <summary>
        /// Destination Internet Service ID.
        /// </summary>
        public InputList<string> InternetServiceIds
        {
            get => _internetServiceIds ?? (_internetServiceIds = new InputList<string>());
            set => _internetServiceIds = value;
        }

        [Input("internetServiceNames")]
        private InputList<string>? _internetServiceNames;

        /// <summary>
        /// Destination Internet Service Name.
        /// </summary>
        public InputList<string> InternetServiceNames
        {
            get => _internetServiceNames ?? (_internetServiceNames = new InputList<string>());
            set => _internetServiceNames = value;
        }

        /// <summary>
        /// Enable/disable use of Source Internet Services for this policy.
        /// </summary>
        [Input("internetServiceSrc")]
        public Input<string>? InternetServiceSrc { get; set; }

        [Input("internetServiceSrcIds")]
        private InputList<string>? _internetServiceSrcIds;

        /// <summary>
        /// Source Internet Service ID.
        /// </summary>
        public InputList<string> InternetServiceSrcIds
        {
            get => _internetServiceSrcIds ?? (_internetServiceSrcIds = new InputList<string>());
            set => _internetServiceSrcIds = value;
        }

        [Input("internetServiceSrcNames")]
        private InputList<string>? _internetServiceSrcNames;

        /// <summary>
        /// Source Internet Service Name.
        /// </summary>
        public InputList<string> InternetServiceSrcNames
        {
            get => _internetServiceSrcNames ?? (_internetServiceSrcNames = new InputList<string>());
            set => _internetServiceSrcNames = value;
        }

        /// <summary>
        /// Enable/disable to use IP Pools for source NAT.
        /// </summary>
        [Input("ippool")]
        public Input<string>? Ippool { get; set; }

        [Input("ipsSensors")]
        private InputList<string>? _ipsSensors;

        /// <summary>
        /// Name of an existing IPS sensor.
        /// </summary>
        public InputList<string> IpsSensors
        {
            get => _ipsSensors ?? (_ipsSensors = new InputList<string>());
            set => _ipsSensors = value;
        }

        /// <summary>
        /// Enable or disable logging. Enum: [disable, all, utm]
        /// </summary>
        [Input("logtraffic")]
        public Input<string>? Logtraffic { get; set; }

        /// <summary>
        /// Record logs when a session starts and ends. Enum: [disable, enable]
        /// </summary>
        [Input("logtrafficStart")]
        public Input<string>? LogtrafficStart { get; set; }

        /// <summary>
        /// Policy name.
        /// </summary>
        [Input("name")]
        public Input<string>? Name { get; set; }

        /// <summary>
        /// Enable/disable source NAT.
        /// </summary>
        [Input("nat")]
        public Input<string>? Nat { get; set; }

        /// <summary>
        /// The package name which the policy will be added to.
        /// </summary>
        [Input("packageName")]
        public Input<string>? PackageName { get; set; }

        [Input("perIpShapers")]
        private InputList<string>? _perIpShapers;

        /// <summary>
        /// Per-IP traffic shaper.
        /// </summary>
        public InputList<string> PerIpShapers
        {
            get => _perIpShapers ?? (_perIpShapers = new InputList<string>());
            set => _perIpShapers = value;
        }

        [Input("poolnames")]
        private InputList<string>? _poolnames;

        /// <summary>
        /// IP Pool names.
        /// </summary>
        public InputList<string> Poolnames
        {
            get => _poolnames ?? (_poolnames = new InputList<string>());
            set => _poolnames = value;
        }

        [Input("profileGroups")]
        private InputList<string>? _profileGroups;

        /// <summary>
        /// Name of profile group.
        /// </summary>
        public InputList<string> ProfileGroups
        {
            get => _profileGroups ?? (_profileGroups = new InputList<string>());
            set => _profileGroups = value;
        }

        [Input("profileProtocolOptions")]
        private InputList<string>? _profileProtocolOptions;

        /// <summary>
        /// Name of an existing Protocol options profile.
        /// </summary>
        public InputList<string> ProfileProtocolOptions
        {
            get => _profileProtocolOptions ?? (_profileProtocolOptions = new InputList<string>());
            set => _profileProtocolOptions = value;
        }

        /// <summary>
        /// Determine whether the firewall policy allows security profile groups or single profiles only. Enum: [single, group]
        /// </summary>
        [Input("profileType")]
        public Input<string>? ProfileType { get; set; }

        /// <summary>
        /// Enable/disable RADIUS Single Sign-On.
        /// </summary>
        [Input("rsso")]
        public Input<string>? Rsso { get; set; }

        [Input("schedules", required: true)]
        private InputList<string>? _schedules;

        /// <summary>
        /// Schedule name.
        /// </summary>
        public InputList<string> Schedules
        {
            get => _schedules ?? (_schedules = new InputList<string>());
            set => _schedules = value;
        }

        [Input("services", required: true)]
        private InputList<string>? _services;

        /// <summary>
        /// Service and service group names.
        /// </summary>
        public InputList<string> Services
        {
            get => _services ?? (_services = new InputList<string>());
            set => _services = value;
        }

        [Input("srcaddrs", required: true)]
        private InputList<string>? _srcaddrs;

        /// <summary>
        /// Source address and adress group names.
        /// </summary>
        public InputList<string> Srcaddrs
        {
            get => _srcaddrs ?? (_srcaddrs = new InputList<string>());
            set => _srcaddrs = value;
        }

        [Input("srcintfs", required: true)]
        private InputList<string>? _srcintfs;

        /// <summary>
        /// Incoming interface.
        /// </summary>
        public InputList<string> Srcintfs
        {
            get => _srcintfs ?? (_srcintfs = new InputList<string>());
            set => _srcintfs = value;
        }

        [Input("trafficShaperReverses")]
        private InputList<string>? _trafficShaperReverses;

        /// <summary>
        /// Reverse traffic shaper.
        /// </summary>
        public InputList<string> TrafficShaperReverses
        {
            get => _trafficShaperReverses ?? (_trafficShaperReverses = new InputList<string>());
            set => _trafficShaperReverses = value;
        }

        [Input("trafficShapers")]
        private InputList<string>? _trafficShapers;

        /// <summary>
        /// Traffic shaper.
        /// </summary>
        public InputList<string> TrafficShapers
        {
            get => _trafficShapers ?? (_trafficShapers = new InputList<string>());
            set => _trafficShapers = value;
        }

        [Input("users")]
        private InputList<string>? _users;

        /// <summary>
        /// Names of individual users that can authenticate with this policy.
        /// </summary>
        public InputList<string> Users
        {
            get => _users ?? (_users = new InputList<string>());
            set => _users = value;
        }

        /// <summary>
        /// Enable/disable to add one or more security profiles (AV, IPS, etc.) to the firewall policy.
        /// </summary>
        [Input("utmStatus")]
        public Input<string>? UtmStatus { get; set; }

        [Input("vpnTunnels")]
        private InputList<string>? _vpnTunnels;
        public InputList<string> VpnTunnels
        {
            get => _vpnTunnels ?? (_vpnTunnels = new InputList<string>());
            set => _vpnTunnels = value;
        }

        [Input("wafProfiles")]
        private InputList<string>? _wafProfiles;

        /// <summary>
        /// Name of an existing Web application firewall profile.
        /// </summary>
        public InputList<string> WafProfiles
        {
            get => _wafProfiles ?? (_wafProfiles = new InputList<string>());
            set => _wafProfiles = value;
        }

        [Input("webfilterProfiles")]
        private InputList<string>? _webfilterProfiles;

        /// <summary>
        /// Name of an existing Web filter profile.
        /// </summary>
        public InputList<string> WebfilterProfiles
        {
            get => _webfilterProfiles ?? (_webfilterProfiles = new InputList<string>());
            set => _webfilterProfiles = value;
        }

        public FmgFirewallSecurityPolicyArgs()
        {
        }
        public static new FmgFirewallSecurityPolicyArgs Empty => new FmgFirewallSecurityPolicyArgs();
    }

    public sealed class FmgFirewallSecurityPolicyState : global::Pulumi.ResourceArgs
    {
        /// <summary>
        /// Policy action, default is deny. Enum: [allow, deny, ipsec].
        /// </summary>
        [Input("action")]
        public Input<string>? Action { get; set; }

        /// <summary>
        /// ADOM name. default is 'root'.
        /// </summary>
        [Input("adom")]
        public Input<string>? Adom { get; set; }

        [Input("applicationLists")]
        private InputList<string>? _applicationLists;

        /// <summary>
        /// Name of an existing Application list.
        /// </summary>
        public InputList<string> ApplicationLists
        {
            get => _applicationLists ?? (_applicationLists = new InputList<string>());
            set => _applicationLists = value;
        }

        [Input("avProfiles")]
        private InputList<string>? _avProfiles;

        /// <summary>
        /// Name of an existing Antivirus profile.
        /// </summary>
        public InputList<string> AvProfiles
        {
            get => _avProfiles ?? (_avProfiles = new InputList<string>());
            set => _avProfiles = value;
        }

        /// <summary>
        /// Enable/disable capture packets.
        /// </summary>
        [Input("capturePacket")]
        public Input<string>? CapturePacket { get; set; }

        /// <summary>
        /// Comments.
        /// </summary>
        [Input("comments")]
        public Input<string>? Comments { get; set; }

        [Input("dnsfilterProfiles")]
        private InputList<string>? _dnsfilterProfiles;

        /// <summary>
        /// Name of an existing DNS filter profile.
        /// </summary>
        public InputList<string> DnsfilterProfiles
        {
            get => _dnsfilterProfiles ?? (_dnsfilterProfiles = new InputList<string>());
            set => _dnsfilterProfiles = value;
        }

        [Input("dstaddrs")]
        private InputList<string>? _dstaddrs;

        /// <summary>
        /// Destination address and adress group names.
        /// </summary>
        public InputList<string> Dstaddrs
        {
            get => _dstaddrs ?? (_dstaddrs = new InputList<string>());
            set => _dstaddrs = value;
        }

        [Input("dstintfs")]
        private InputList<string>? _dstintfs;

        /// <summary>
        /// Outgoing interface.
        /// </summary>
        public InputList<string> Dstintfs
        {
            get => _dstintfs ?? (_dstintfs = new InputList<string>());
            set => _dstintfs = value;
        }

        /// <summary>
        /// Enable/disable to prevent source NAT from changing a session's source port.
        /// </summary>
        [Input("fixedport")]
        public Input<string>? Fixedport { get; set; }

        /// <summary>
        /// Enable/disable Fortinet Single Sign-On.
        /// </summary>
        [Input("fsso")]
        public Input<string>? Fsso { get; set; }

        [Input("groups")]
        private InputList<string>? _groups;

        /// <summary>
        /// Names of user groups that can authenticate with this policy.
        /// </summary>
        public InputList<string> Groups
        {
            get => _groups ?? (_groups = new InputList<string>());
            set => _groups = value;
        }

        /// <summary>
        /// Policy-based IPsec VPN: only traffic from the remote network can initiate a VPN. Enum: [disable, enable]
        /// </summary>
        [Input("inbound")]
        public Input<string>? Inbound { get; set; }

        /// <summary>
        /// Enable/disable use of Destination Internet Services for this policy.
        /// </summary>
        [Input("internetService")]
        public Input<string>? InternetService { get; set; }

        [Input("internetServiceIds")]
        private InputList<string>? _internetServiceIds;

        /// <summary>
        /// Destination Internet Service ID.
        /// </summary>
        public InputList<string> InternetServiceIds
        {
            get => _internetServiceIds ?? (_internetServiceIds = new InputList<string>());
            set => _internetServiceIds = value;
        }

        [Input("internetServiceNames")]
        private InputList<string>? _internetServiceNames;

        /// <summary>
        /// Destination Internet Service Name.
        /// </summary>
        public InputList<string> InternetServiceNames
        {
            get => _internetServiceNames ?? (_internetServiceNames = new InputList<string>());
            set => _internetServiceNames = value;
        }

        /// <summary>
        /// Enable/disable use of Source Internet Services for this policy.
        /// </summary>
        [Input("internetServiceSrc")]
        public Input<string>? InternetServiceSrc { get; set; }

        [Input("internetServiceSrcIds")]
        private InputList<string>? _internetServiceSrcIds;

        /// <summary>
        /// Source Internet Service ID.
        /// </summary>
        public InputList<string> InternetServiceSrcIds
        {
            get => _internetServiceSrcIds ?? (_internetServiceSrcIds = new InputList<string>());
            set => _internetServiceSrcIds = value;
        }

        [Input("internetServiceSrcNames")]
        private InputList<string>? _internetServiceSrcNames;

        /// <summary>
        /// Source Internet Service Name.
        /// </summary>
        public InputList<string> InternetServiceSrcNames
        {
            get => _internetServiceSrcNames ?? (_internetServiceSrcNames = new InputList<string>());
            set => _internetServiceSrcNames = value;
        }

        /// <summary>
        /// Enable/disable to use IP Pools for source NAT.
        /// </summary>
        [Input("ippool")]
        public Input<string>? Ippool { get; set; }

        [Input("ipsSensors")]
        private InputList<string>? _ipsSensors;

        /// <summary>
        /// Name of an existing IPS sensor.
        /// </summary>
        public InputList<string> IpsSensors
        {
            get => _ipsSensors ?? (_ipsSensors = new InputList<string>());
            set => _ipsSensors = value;
        }

        /// <summary>
        /// Enable or disable logging. Enum: [disable, all, utm]
        /// </summary>
        [Input("logtraffic")]
        public Input<string>? Logtraffic { get; set; }

        /// <summary>
        /// Record logs when a session starts and ends. Enum: [disable, enable]
        /// </summary>
        [Input("logtrafficStart")]
        public Input<string>? LogtrafficStart { get; set; }

        /// <summary>
        /// Policy name.
        /// </summary>
        [Input("name")]
        public Input<string>? Name { get; set; }

        /// <summary>
        /// Enable/disable source NAT.
        /// </summary>
        [Input("nat")]
        public Input<string>? Nat { get; set; }

        /// <summary>
        /// The package name which the policy will be added to.
        /// </summary>
        [Input("packageName")]
        public Input<string>? PackageName { get; set; }

        [Input("perIpShapers")]
        private InputList<string>? _perIpShapers;

        /// <summary>
        /// Per-IP traffic shaper.
        /// </summary>
        public InputList<string> PerIpShapers
        {
            get => _perIpShapers ?? (_perIpShapers = new InputList<string>());
            set => _perIpShapers = value;
        }

        [Input("poolnames")]
        private InputList<string>? _poolnames;

        /// <summary>
        /// IP Pool names.
        /// </summary>
        public InputList<string> Poolnames
        {
            get => _poolnames ?? (_poolnames = new InputList<string>());
            set => _poolnames = value;
        }

        [Input("profileGroups")]
        private InputList<string>? _profileGroups;

        /// <summary>
        /// Name of profile group.
        /// </summary>
        public InputList<string> ProfileGroups
        {
            get => _profileGroups ?? (_profileGroups = new InputList<string>());
            set => _profileGroups = value;
        }

        [Input("profileProtocolOptions")]
        private InputList<string>? _profileProtocolOptions;

        /// <summary>
        /// Name of an existing Protocol options profile.
        /// </summary>
        public InputList<string> ProfileProtocolOptions
        {
            get => _profileProtocolOptions ?? (_profileProtocolOptions = new InputList<string>());
            set => _profileProtocolOptions = value;
        }

        /// <summary>
        /// Determine whether the firewall policy allows security profile groups or single profiles only. Enum: [single, group]
        /// </summary>
        [Input("profileType")]
        public Input<string>? ProfileType { get; set; }

        /// <summary>
        /// Enable/disable RADIUS Single Sign-On.
        /// </summary>
        [Input("rsso")]
        public Input<string>? Rsso { get; set; }

        [Input("schedules")]
        private InputList<string>? _schedules;

        /// <summary>
        /// Schedule name.
        /// </summary>
        public InputList<string> Schedules
        {
            get => _schedules ?? (_schedules = new InputList<string>());
            set => _schedules = value;
        }

        [Input("services")]
        private InputList<string>? _services;

        /// <summary>
        /// Service and service group names.
        /// </summary>
        public InputList<string> Services
        {
            get => _services ?? (_services = new InputList<string>());
            set => _services = value;
        }

        [Input("srcaddrs")]
        private InputList<string>? _srcaddrs;

        /// <summary>
        /// Source address and adress group names.
        /// </summary>
        public InputList<string> Srcaddrs
        {
            get => _srcaddrs ?? (_srcaddrs = new InputList<string>());
            set => _srcaddrs = value;
        }

        [Input("srcintfs")]
        private InputList<string>? _srcintfs;

        /// <summary>
        /// Incoming interface.
        /// </summary>
        public InputList<string> Srcintfs
        {
            get => _srcintfs ?? (_srcintfs = new InputList<string>());
            set => _srcintfs = value;
        }

        [Input("trafficShaperReverses")]
        private InputList<string>? _trafficShaperReverses;

        /// <summary>
        /// Reverse traffic shaper.
        /// </summary>
        public InputList<string> TrafficShaperReverses
        {
            get => _trafficShaperReverses ?? (_trafficShaperReverses = new InputList<string>());
            set => _trafficShaperReverses = value;
        }

        [Input("trafficShapers")]
        private InputList<string>? _trafficShapers;

        /// <summary>
        /// Traffic shaper.
        /// </summary>
        public InputList<string> TrafficShapers
        {
            get => _trafficShapers ?? (_trafficShapers = new InputList<string>());
            set => _trafficShapers = value;
        }

        [Input("users")]
        private InputList<string>? _users;

        /// <summary>
        /// Names of individual users that can authenticate with this policy.
        /// </summary>
        public InputList<string> Users
        {
            get => _users ?? (_users = new InputList<string>());
            set => _users = value;
        }

        /// <summary>
        /// Enable/disable to add one or more security profiles (AV, IPS, etc.) to the firewall policy.
        /// </summary>
        [Input("utmStatus")]
        public Input<string>? UtmStatus { get; set; }

        [Input("vpnTunnels")]
        private InputList<string>? _vpnTunnels;
        public InputList<string> VpnTunnels
        {
            get => _vpnTunnels ?? (_vpnTunnels = new InputList<string>());
            set => _vpnTunnels = value;
        }

        [Input("wafProfiles")]
        private InputList<string>? _wafProfiles;

        /// <summary>
        /// Name of an existing Web application firewall profile.
        /// </summary>
        public InputList<string> WafProfiles
        {
            get => _wafProfiles ?? (_wafProfiles = new InputList<string>());
            set => _wafProfiles = value;
        }

        [Input("webfilterProfiles")]
        private InputList<string>? _webfilterProfiles;

        /// <summary>
        /// Name of an existing Web filter profile.
        /// </summary>
        public InputList<string> WebfilterProfiles
        {
            get => _webfilterProfiles ?? (_webfilterProfiles = new InputList<string>());
            set => _webfilterProfiles = value;
        }

        public FmgFirewallSecurityPolicyState()
        {
        }
        public static new FmgFirewallSecurityPolicyState Empty => new FmgFirewallSecurityPolicyState();
    }
}
