/*
 * Warframe.market API
 *
 * ## Documentation is under very slow and heavy development  This document will gradually be supplemented and updated over some extended period of time.  ## Unstable endpoints Endpoint that is not stable and probably will be changed in the future will be marked with exclamation sign -> âš  
 *
 * The version of the OpenAPI document: 1.14.0
 * 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 = WarframeMarket.Client.OpenAPIDateConverter;

namespace WarframeMarket.Model
{
    /// <summary>
    /// ItemFullAllOf
    /// </summary>
    [DataContract(Name = "ItemFull_allOf")]
    public partial class ItemFullAllOf : IEquatable<ItemFullAllOf>, IValidatableObject
    {
        /// <summary>
        /// Item rarity
        /// </summary>
        /// <value>Item rarity</value>
        [JsonConverter(typeof(StringEnumConverter))]
        public enum RarityEnum
        {
            /// <summary>
            /// Enum Common for value: common
            /// </summary>
            [EnumMember(Value = "common")]
            Common = 1,

            /// <summary>
            /// Enum Uncommon for value: uncommon
            /// </summary>
            [EnumMember(Value = "uncommon")]
            Uncommon = 2,

            /// <summary>
            /// Enum Rare for value: rare
            /// </summary>
            [EnumMember(Value = "rare")]
            Rare = 3,

            /// <summary>
            /// Enum Legendary for value: legendary
            /// </summary>
            [EnumMember(Value = "legendary")]
            Legendary = 4,

            /// <summary>
            /// Enum Peculiar for value: peculiar
            /// </summary>
            [EnumMember(Value = "peculiar")]
            Peculiar = 5

        }


        /// <summary>
        /// Item rarity
        /// </summary>
        /// <value>Item rarity</value>
        /// <example>&quot;rare&quot;</example>
        [DataMember(Name = "rarity", EmitDefaultValue = false)]
        public RarityEnum? Rarity { get; set; }
        /// <summary>
        /// Initializes a new instance of the <see cref="ItemFullAllOf" /> class.
        /// </summary>
        /// <param name="setRoot">This item represents set itself.</param>
        /// <param name="masteryLevel">Mastery requirenment fro this item.</param>
        /// <param name="rarity">Item rarity.</param>
        /// <param name="tradingTax">tradingTax.</param>
        /// <param name="en">en.</param>
        /// <param name="ru">ru.</param>
        /// <param name="ko">ko.</param>
        /// <param name="fr">fr.</param>
        /// <param name="de">de.</param>
        /// <param name="sv">sv.</param>
        /// <param name="zhHant">zhHant.</param>
        /// <param name="zhHans">zhHans.</param>
        /// <param name="pt">pt.</param>
        /// <param name="es">es.</param>
        /// <param name="pl">pl.</param>
        public ItemFullAllOf(bool setRoot = default(bool), int masteryLevel = default(int), RarityEnum? rarity = default(RarityEnum?), int tradingTax = default(int), LangInItem en = default(LangInItem), LangInItem ru = default(LangInItem), LangInItem ko = default(LangInItem), LangInItem fr = default(LangInItem), LangInItem de = default(LangInItem), LangInItem sv = default(LangInItem), LangInItem zhHant = default(LangInItem), LangInItem zhHans = default(LangInItem), LangInItem pt = default(LangInItem), LangInItem es = default(LangInItem), LangInItem pl = default(LangInItem))
        {
            this.SetRoot = setRoot;
            this.MasteryLevel = masteryLevel;
            this.Rarity = rarity;
            this.TradingTax = tradingTax;
            this.En = en;
            this.Ru = ru;
            this.Ko = ko;
            this.Fr = fr;
            this.De = de;
            this.Sv = sv;
            this.ZhHant = zhHant;
            this.ZhHans = zhHans;
            this.Pt = pt;
            this.Es = es;
            this.Pl = pl;
        }

        /// <summary>
        /// This item represents set itself
        /// </summary>
        /// <value>This item represents set itself</value>
        /// <example>false</example>
        [DataMember(Name = "set_root", EmitDefaultValue = true)]
        public bool SetRoot { get; set; }

        /// <summary>
        /// Mastery requirenment fro this item
        /// </summary>
        /// <value>Mastery requirenment fro this item</value>
        /// <example>12</example>
        [DataMember(Name = "mastery_level", EmitDefaultValue = false)]
        public int MasteryLevel { get; set; }

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

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

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

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

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

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

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

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

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

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

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

        /// <summary>
        /// Gets or Sets Pl
        /// </summary>
        [DataMember(Name = "pl", EmitDefaultValue = false)]
        public LangInItem Pl { 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 ItemFullAllOf {\n");
            sb.Append("  SetRoot: ").Append(SetRoot).Append("\n");
            sb.Append("  MasteryLevel: ").Append(MasteryLevel).Append("\n");
            sb.Append("  Rarity: ").Append(Rarity).Append("\n");
            sb.Append("  TradingTax: ").Append(TradingTax).Append("\n");
            sb.Append("  En: ").Append(En).Append("\n");
            sb.Append("  Ru: ").Append(Ru).Append("\n");
            sb.Append("  Ko: ").Append(Ko).Append("\n");
            sb.Append("  Fr: ").Append(Fr).Append("\n");
            sb.Append("  De: ").Append(De).Append("\n");
            sb.Append("  Sv: ").Append(Sv).Append("\n");
            sb.Append("  ZhHant: ").Append(ZhHant).Append("\n");
            sb.Append("  ZhHans: ").Append(ZhHans).Append("\n");
            sb.Append("  Pt: ").Append(Pt).Append("\n");
            sb.Append("  Es: ").Append(Es).Append("\n");
            sb.Append("  Pl: ").Append(Pl).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>
        /// Returns true if objects are equal
        /// </summary>
        /// <param name="input">Object to be compared</param>
        /// <returns>Boolean</returns>
        public override bool Equals(object input)
        {
            return this.Equals(input as ItemFullAllOf);
        }

        /// <summary>
        /// Returns true if ItemFullAllOf instances are equal
        /// </summary>
        /// <param name="input">Instance of ItemFullAllOf to be compared</param>
        /// <returns>Boolean</returns>
        public bool Equals(ItemFullAllOf input)
        {
            if (input == null)
            {
                return false;
            }
            return 
                (
                    this.SetRoot == input.SetRoot ||
                    this.SetRoot.Equals(input.SetRoot)
                ) && 
                (
                    this.MasteryLevel == input.MasteryLevel ||
                    this.MasteryLevel.Equals(input.MasteryLevel)
                ) && 
                (
                    this.Rarity == input.Rarity ||
                    this.Rarity.Equals(input.Rarity)
                ) && 
                (
                    this.TradingTax == input.TradingTax ||
                    this.TradingTax.Equals(input.TradingTax)
                ) && 
                (
                    this.En == input.En ||
                    (this.En != null &&
                    this.En.Equals(input.En))
                ) && 
                (
                    this.Ru == input.Ru ||
                    (this.Ru != null &&
                    this.Ru.Equals(input.Ru))
                ) && 
                (
                    this.Ko == input.Ko ||
                    (this.Ko != null &&
                    this.Ko.Equals(input.Ko))
                ) && 
                (
                    this.Fr == input.Fr ||
                    (this.Fr != null &&
                    this.Fr.Equals(input.Fr))
                ) && 
                (
                    this.De == input.De ||
                    (this.De != null &&
                    this.De.Equals(input.De))
                ) && 
                (
                    this.Sv == input.Sv ||
                    (this.Sv != null &&
                    this.Sv.Equals(input.Sv))
                ) && 
                (
                    this.ZhHant == input.ZhHant ||
                    (this.ZhHant != null &&
                    this.ZhHant.Equals(input.ZhHant))
                ) && 
                (
                    this.ZhHans == input.ZhHans ||
                    (this.ZhHans != null &&
                    this.ZhHans.Equals(input.ZhHans))
                ) && 
                (
                    this.Pt == input.Pt ||
                    (this.Pt != null &&
                    this.Pt.Equals(input.Pt))
                ) && 
                (
                    this.Es == input.Es ||
                    (this.Es != null &&
                    this.Es.Equals(input.Es))
                ) && 
                (
                    this.Pl == input.Pl ||
                    (this.Pl != null &&
                    this.Pl.Equals(input.Pl))
                );
        }

        /// <summary>
        /// Gets the hash code
        /// </summary>
        /// <returns>Hash code</returns>
        public override int GetHashCode()
        {
            unchecked // Overflow is fine, just wrap
            {
                int hashCode = 41;
                hashCode = (hashCode * 59) + this.SetRoot.GetHashCode();
                hashCode = (hashCode * 59) + this.MasteryLevel.GetHashCode();
                hashCode = (hashCode * 59) + this.Rarity.GetHashCode();
                hashCode = (hashCode * 59) + this.TradingTax.GetHashCode();
                if (this.En != null)
                {
                    hashCode = (hashCode * 59) + this.En.GetHashCode();
                }
                if (this.Ru != null)
                {
                    hashCode = (hashCode * 59) + this.Ru.GetHashCode();
                }
                if (this.Ko != null)
                {
                    hashCode = (hashCode * 59) + this.Ko.GetHashCode();
                }
                if (this.Fr != null)
                {
                    hashCode = (hashCode * 59) + this.Fr.GetHashCode();
                }
                if (this.De != null)
                {
                    hashCode = (hashCode * 59) + this.De.GetHashCode();
                }
                if (this.Sv != null)
                {
                    hashCode = (hashCode * 59) + this.Sv.GetHashCode();
                }
                if (this.ZhHant != null)
                {
                    hashCode = (hashCode * 59) + this.ZhHant.GetHashCode();
                }
                if (this.ZhHans != null)
                {
                    hashCode = (hashCode * 59) + this.ZhHans.GetHashCode();
                }
                if (this.Pt != null)
                {
                    hashCode = (hashCode * 59) + this.Pt.GetHashCode();
                }
                if (this.Es != null)
                {
                    hashCode = (hashCode * 59) + this.Es.GetHashCode();
                }
                if (this.Pl != null)
                {
                    hashCode = (hashCode * 59) + this.Pl.GetHashCode();
                }
                return hashCode;
            }
        }

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

}
