/*
 * ProxMox VE API
 *
 * ProxMox VE API
 *
 * The version of the OpenAPI document: 2.0
 * Contact: support@lumaserv.com
 * Generated by: https://github.com/openapitools/openapi-generator.git
 */


using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using System.ComponentModel.DataAnnotations;
using OpenAPIDateConverter = ProxmoxSharp.Client.OpenAPIDateConverter;

namespace ProxmoxSharp.Model
{
    /// <summary>
    /// CreateAccessDomainsRequest
    /// </summary>
    [DataContract(Name = "CreateAccessDomainsRequest")]
    public partial class CreateAccessDomainsRequest : IValidatableObject
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="CreateAccessDomainsRequest" /> class.
        /// </summary>
        [JsonConstructorAttribute]
        protected CreateAccessDomainsRequest() { }
        /// <summary>
        /// Initializes a new instance of the <see cref="CreateAccessDomainsRequest" /> class.
        /// </summary>
        /// <param name="acrValues">acrValues.</param>
        /// <param name="autocreate">autocreate.</param>
        /// <param name="baseDn">baseDn.</param>
        /// <param name="bindDn">bindDn.</param>
        /// <param name="capath">capath.</param>
        /// <param name="caseSensitive">caseSensitive.</param>
        /// <param name="cert">cert.</param>
        /// <param name="certkey">certkey.</param>
        /// <param name="checkConnection">checkConnection.</param>
        /// <param name="clientId">clientId.</param>
        /// <param name="clientKey">clientKey.</param>
        /// <param name="comment">comment.</param>
        /// <param name="varDefault">varDefault.</param>
        /// <param name="domain">domain.</param>
        /// <param name="filter">filter.</param>
        /// <param name="groupClasses">groupClasses.</param>
        /// <param name="groupDn">groupDn.</param>
        /// <param name="groupFilter">groupFilter.</param>
        /// <param name="groupNameAttr">groupNameAttr.</param>
        /// <param name="groupsAutocreate">groupsAutocreate.</param>
        /// <param name="groupsClaim">groupsClaim.</param>
        /// <param name="groupsOverwrite">groupsOverwrite.</param>
        /// <param name="issuerUrl">issuerUrl.</param>
        /// <param name="mode">mode.</param>
        /// <param name="password">password.</param>
        /// <param name="port">port.</param>
        /// <param name="prompt">prompt.</param>
        /// <param name="queryUserinfo">queryUserinfo.</param>
        /// <param name="realm">realm (required).</param>
        /// <param name="scopes">scopes.</param>
        /// <param name="secure">secure.</param>
        /// <param name="server1">server1.</param>
        /// <param name="server2">server2.</param>
        /// <param name="sslversion">sslversion.</param>
        /// <param name="syncDefaultsOptions">syncDefaultsOptions.</param>
        /// <param name="syncAttributes">syncAttributes.</param>
        /// <param name="tfa">tfa.</param>
        /// <param name="type">type (required).</param>
        /// <param name="userAttr">userAttr.</param>
        /// <param name="userClasses">userClasses.</param>
        /// <param name="usernameClaim">usernameClaim.</param>
        /// <param name="verify">verify.</param>
        public CreateAccessDomainsRequest(string acrValues = default(string), bool autocreate = default(bool), string baseDn = default(string), string bindDn = default(string), string capath = default(string), bool caseSensitive = default(bool), string cert = default(string), string certkey = default(string), bool checkConnection = default(bool), string clientId = default(string), string clientKey = default(string), string comment = default(string), bool varDefault = default(bool), string domain = default(string), string filter = default(string), string groupClasses = default(string), string groupDn = default(string), string groupFilter = default(string), string groupNameAttr = default(string), bool groupsAutocreate = default(bool), string groupsClaim = default(string), bool groupsOverwrite = default(bool), string issuerUrl = default(string), string mode = default(string), string password = default(string), int port = default(int), string prompt = default(string), bool queryUserinfo = default(bool), string realm = default(string), string scopes = default(string), bool secure = default(bool), string server1 = default(string), string server2 = default(string), string sslversion = default(string), string syncDefaultsOptions = default(string), string syncAttributes = default(string), string tfa = default(string), string type = default(string), string userAttr = default(string), string userClasses = default(string), string usernameClaim = default(string), bool verify = default(bool))
        {
            // to ensure "realm" is required (not null)
            if (realm == null)
            {
                throw new ArgumentNullException("realm is a required property for CreateAccessDomainsRequest and cannot be null");
            }
            this.Realm = realm;
            // to ensure "type" is required (not null)
            if (type == null)
            {
                throw new ArgumentNullException("type is a required property for CreateAccessDomainsRequest and cannot be null");
            }
            this.Type = type;
            this.AcrValues = acrValues;
            this.Autocreate = autocreate;
            this.BaseDn = baseDn;
            this.BindDn = bindDn;
            this.Capath = capath;
            this.CaseSensitive = caseSensitive;
            this.Cert = cert;
            this.Certkey = certkey;
            this.CheckConnection = checkConnection;
            this.ClientId = clientId;
            this.ClientKey = clientKey;
            this.Comment = comment;
            this.Default = varDefault;
            this.Domain = domain;
            this.Filter = filter;
            this.GroupClasses = groupClasses;
            this.GroupDn = groupDn;
            this.GroupFilter = groupFilter;
            this.GroupNameAttr = groupNameAttr;
            this.GroupsAutocreate = groupsAutocreate;
            this.GroupsClaim = groupsClaim;
            this.GroupsOverwrite = groupsOverwrite;
            this.IssuerUrl = issuerUrl;
            this.Mode = mode;
            this.Password = password;
            this.Port = port;
            this.Prompt = prompt;
            this.QueryUserinfo = queryUserinfo;
            this.Scopes = scopes;
            this.Secure = secure;
            this.Server1 = server1;
            this.Server2 = server2;
            this.Sslversion = sslversion;
            this.SyncDefaultsOptions = syncDefaultsOptions;
            this.SyncAttributes = syncAttributes;
            this.Tfa = tfa;
            this.UserAttr = userAttr;
            this.UserClasses = userClasses;
            this.UsernameClaim = usernameClaim;
            this.Verify = verify;
        }

        /// <summary>
        /// Gets or Sets AcrValues
        /// </summary>
        [DataMember(Name = "acr-values", EmitDefaultValue = false)]
        public string AcrValues { get; set; }

        /// <summary>
        /// Gets or Sets Autocreate
        /// </summary>
        [DataMember(Name = "autocreate", EmitDefaultValue = true)]
        public bool Autocreate { get; set; }

        /// <summary>
        /// Gets or Sets BaseDn
        /// </summary>
        [DataMember(Name = "base_dn", EmitDefaultValue = false)]
        public string BaseDn { get; set; }

        /// <summary>
        /// Gets or Sets BindDn
        /// </summary>
        [DataMember(Name = "bind_dn", EmitDefaultValue = false)]
        public string BindDn { get; set; }

        /// <summary>
        /// Gets or Sets Capath
        /// </summary>
        [DataMember(Name = "capath", EmitDefaultValue = false)]
        public string Capath { get; set; }

        /// <summary>
        /// Gets or Sets CaseSensitive
        /// </summary>
        [DataMember(Name = "case-sensitive", EmitDefaultValue = true)]
        public bool CaseSensitive { get; set; }

        /// <summary>
        /// Gets or Sets Cert
        /// </summary>
        [DataMember(Name = "cert", EmitDefaultValue = false)]
        public string Cert { get; set; }

        /// <summary>
        /// Gets or Sets Certkey
        /// </summary>
        [DataMember(Name = "certkey", EmitDefaultValue = false)]
        public string Certkey { get; set; }

        /// <summary>
        /// Gets or Sets CheckConnection
        /// </summary>
        [DataMember(Name = "check-connection", EmitDefaultValue = true)]
        public bool CheckConnection { get; set; }

        /// <summary>
        /// Gets or Sets ClientId
        /// </summary>
        [DataMember(Name = "client-id", EmitDefaultValue = false)]
        public string ClientId { get; set; }

        /// <summary>
        /// Gets or Sets ClientKey
        /// </summary>
        [DataMember(Name = "client-key", EmitDefaultValue = false)]
        public string ClientKey { get; set; }

        /// <summary>
        /// Gets or Sets Comment
        /// </summary>
        [DataMember(Name = "comment", EmitDefaultValue = false)]
        public string Comment { get; set; }

        /// <summary>
        /// Gets or Sets Default
        /// </summary>
        [DataMember(Name = "default", EmitDefaultValue = true)]
        public bool Default { get; set; }

        /// <summary>
        /// Gets or Sets Domain
        /// </summary>
        [DataMember(Name = "domain", EmitDefaultValue = false)]
        public string Domain { get; set; }

        /// <summary>
        /// Gets or Sets Filter
        /// </summary>
        [DataMember(Name = "filter", EmitDefaultValue = false)]
        public string Filter { get; set; }

        /// <summary>
        /// Gets or Sets GroupClasses
        /// </summary>
        [DataMember(Name = "group_classes", EmitDefaultValue = false)]
        public string GroupClasses { get; set; }

        /// <summary>
        /// Gets or Sets GroupDn
        /// </summary>
        [DataMember(Name = "group_dn", EmitDefaultValue = false)]
        public string GroupDn { get; set; }

        /// <summary>
        /// Gets or Sets GroupFilter
        /// </summary>
        [DataMember(Name = "group_filter", EmitDefaultValue = false)]
        public string GroupFilter { get; set; }

        /// <summary>
        /// Gets or Sets GroupNameAttr
        /// </summary>
        [DataMember(Name = "group_name_attr", EmitDefaultValue = false)]
        public string GroupNameAttr { get; set; }

        /// <summary>
        /// Gets or Sets GroupsAutocreate
        /// </summary>
        [DataMember(Name = "groups-autocreate", EmitDefaultValue = true)]
        public bool GroupsAutocreate { get; set; }

        /// <summary>
        /// Gets or Sets GroupsClaim
        /// </summary>
        [DataMember(Name = "groups-claim", EmitDefaultValue = false)]
        public string GroupsClaim { get; set; }

        /// <summary>
        /// Gets or Sets GroupsOverwrite
        /// </summary>
        [DataMember(Name = "groups-overwrite", EmitDefaultValue = true)]
        public bool GroupsOverwrite { get; set; }

        /// <summary>
        /// Gets or Sets IssuerUrl
        /// </summary>
        [DataMember(Name = "issuer-url", EmitDefaultValue = false)]
        public string IssuerUrl { get; set; }

        /// <summary>
        /// Gets or Sets Mode
        /// </summary>
        [DataMember(Name = "mode", EmitDefaultValue = false)]
        public string Mode { get; set; }

        /// <summary>
        /// Gets or Sets Password
        /// </summary>
        [DataMember(Name = "password", EmitDefaultValue = false)]
        public string Password { get; set; }

        /// <summary>
        /// Gets or Sets Port
        /// </summary>
        [DataMember(Name = "port", EmitDefaultValue = false)]
        public int Port { get; set; }

        /// <summary>
        /// Gets or Sets Prompt
        /// </summary>
        [DataMember(Name = "prompt", EmitDefaultValue = false)]
        public string Prompt { get; set; }

        /// <summary>
        /// Gets or Sets QueryUserinfo
        /// </summary>
        [DataMember(Name = "query-userinfo", EmitDefaultValue = true)]
        public bool QueryUserinfo { get; set; }

        /// <summary>
        /// Gets or Sets Realm
        /// </summary>
        [DataMember(Name = "realm", IsRequired = true, EmitDefaultValue = true)]
        public string Realm { get; set; }

        /// <summary>
        /// Gets or Sets Scopes
        /// </summary>
        [DataMember(Name = "scopes", EmitDefaultValue = false)]
        public string Scopes { get; set; }

        /// <summary>
        /// Gets or Sets Secure
        /// </summary>
        [DataMember(Name = "secure", EmitDefaultValue = true)]
        public bool Secure { get; set; }

        /// <summary>
        /// Gets or Sets Server1
        /// </summary>
        [DataMember(Name = "server1", EmitDefaultValue = false)]
        public string Server1 { get; set; }

        /// <summary>
        /// Gets or Sets Server2
        /// </summary>
        [DataMember(Name = "server2", EmitDefaultValue = false)]
        public string Server2 { get; set; }

        /// <summary>
        /// Gets or Sets Sslversion
        /// </summary>
        [DataMember(Name = "sslversion", EmitDefaultValue = false)]
        public string Sslversion { get; set; }

        /// <summary>
        /// Gets or Sets SyncDefaultsOptions
        /// </summary>
        [DataMember(Name = "sync-defaults-options", EmitDefaultValue = false)]
        public string SyncDefaultsOptions { get; set; }

        /// <summary>
        /// Gets or Sets SyncAttributes
        /// </summary>
        [DataMember(Name = "sync_attributes", EmitDefaultValue = false)]
        public string SyncAttributes { get; set; }

        /// <summary>
        /// Gets or Sets Tfa
        /// </summary>
        [DataMember(Name = "tfa", EmitDefaultValue = false)]
        public string Tfa { get; set; }

        /// <summary>
        /// Gets or Sets Type
        /// </summary>
        [DataMember(Name = "type", IsRequired = true, EmitDefaultValue = true)]
        public string Type { get; set; }

        /// <summary>
        /// Gets or Sets UserAttr
        /// </summary>
        [DataMember(Name = "user_attr", EmitDefaultValue = false)]
        public string UserAttr { get; set; }

        /// <summary>
        /// Gets or Sets UserClasses
        /// </summary>
        [DataMember(Name = "user_classes", EmitDefaultValue = false)]
        public string UserClasses { get; set; }

        /// <summary>
        /// Gets or Sets UsernameClaim
        /// </summary>
        [DataMember(Name = "username-claim", EmitDefaultValue = false)]
        public string UsernameClaim { get; set; }

        /// <summary>
        /// Gets or Sets Verify
        /// </summary>
        [DataMember(Name = "verify", EmitDefaultValue = true)]
        public bool Verify { get; set; }

        /// <summary>
        /// Returns the string presentation of the object
        /// </summary>
        /// <returns>String presentation of the object</returns>
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("class CreateAccessDomainsRequest {\n");
            sb.Append("  AcrValues: ").Append(AcrValues).Append("\n");
            sb.Append("  Autocreate: ").Append(Autocreate).Append("\n");
            sb.Append("  BaseDn: ").Append(BaseDn).Append("\n");
            sb.Append("  BindDn: ").Append(BindDn).Append("\n");
            sb.Append("  Capath: ").Append(Capath).Append("\n");
            sb.Append("  CaseSensitive: ").Append(CaseSensitive).Append("\n");
            sb.Append("  Cert: ").Append(Cert).Append("\n");
            sb.Append("  Certkey: ").Append(Certkey).Append("\n");
            sb.Append("  CheckConnection: ").Append(CheckConnection).Append("\n");
            sb.Append("  ClientId: ").Append(ClientId).Append("\n");
            sb.Append("  ClientKey: ").Append(ClientKey).Append("\n");
            sb.Append("  Comment: ").Append(Comment).Append("\n");
            sb.Append("  Default: ").Append(Default).Append("\n");
            sb.Append("  Domain: ").Append(Domain).Append("\n");
            sb.Append("  Filter: ").Append(Filter).Append("\n");
            sb.Append("  GroupClasses: ").Append(GroupClasses).Append("\n");
            sb.Append("  GroupDn: ").Append(GroupDn).Append("\n");
            sb.Append("  GroupFilter: ").Append(GroupFilter).Append("\n");
            sb.Append("  GroupNameAttr: ").Append(GroupNameAttr).Append("\n");
            sb.Append("  GroupsAutocreate: ").Append(GroupsAutocreate).Append("\n");
            sb.Append("  GroupsClaim: ").Append(GroupsClaim).Append("\n");
            sb.Append("  GroupsOverwrite: ").Append(GroupsOverwrite).Append("\n");
            sb.Append("  IssuerUrl: ").Append(IssuerUrl).Append("\n");
            sb.Append("  Mode: ").Append(Mode).Append("\n");
            sb.Append("  Password: ").Append(Password).Append("\n");
            sb.Append("  Port: ").Append(Port).Append("\n");
            sb.Append("  Prompt: ").Append(Prompt).Append("\n");
            sb.Append("  QueryUserinfo: ").Append(QueryUserinfo).Append("\n");
            sb.Append("  Realm: ").Append(Realm).Append("\n");
            sb.Append("  Scopes: ").Append(Scopes).Append("\n");
            sb.Append("  Secure: ").Append(Secure).Append("\n");
            sb.Append("  Server1: ").Append(Server1).Append("\n");
            sb.Append("  Server2: ").Append(Server2).Append("\n");
            sb.Append("  Sslversion: ").Append(Sslversion).Append("\n");
            sb.Append("  SyncDefaultsOptions: ").Append(SyncDefaultsOptions).Append("\n");
            sb.Append("  SyncAttributes: ").Append(SyncAttributes).Append("\n");
            sb.Append("  Tfa: ").Append(Tfa).Append("\n");
            sb.Append("  Type: ").Append(Type).Append("\n");
            sb.Append("  UserAttr: ").Append(UserAttr).Append("\n");
            sb.Append("  UserClasses: ").Append(UserClasses).Append("\n");
            sb.Append("  UsernameClaim: ").Append(UsernameClaim).Append("\n");
            sb.Append("  Verify: ").Append(Verify).Append("\n");
            sb.Append("}\n");
            return sb.ToString();
        }

        /// <summary>
        /// Returns the JSON string presentation of the object
        /// </summary>
        /// <returns>JSON string presentation of the object</returns>
        public virtual string ToJson()
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
        }

        /// <summary>
        /// To validate all properties of the instance
        /// </summary>
        /// <param name="validationContext">Validation context</param>
        /// <returns>Validation Result</returns>
        IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
        {
            yield break;
        }
    }

}
