using System;

namespace Toolbox.Docking.Api.Units
{

    /// <summary>
    /// Base class representing a Toolbox scale.
    /// </summary>
    [Serializable]
    public abstract class TbScale
    {
        /// <summary>   
        /// Base constructor for a Toolbox scale.
        /// </summary>
        /// <param name="name">Name for the scale.</param>
        /// <param name="familyGroup">Family group for the scale.</param>
        /// <param name="identity">The unique persistent identifier for the scale.</param>
        protected TbScale(string name, string familyGroup, Guid identity)
        {
            Name = name;
            FamilyGroup = familyGroup;
            Identity = identity;
        }

        /// <summary>
        /// The unique persistent identifier for the scale.
        /// </summary>
        public Guid Identity { get; }

        /// <summary>
        /// Name for the scale.
        /// </summary>
        public string Name { get; }

        /// <summary>
        /// Family group for the scale.
        /// </summary>
        public string FamilyGroup { get; }

        /// <summary>
        /// Predefined scale for an empty ratio unit. Like ratio. It has the GUID of NoFamily.ContinuousDataType
        /// </summary>
        public static readonly TbRatioScale EmptyRatioScale = new TbRatioScale("", "", Guid.Parse("6449140B-D57D-41D0-8E92-2122579E68A5"), "");

        /// <summary>
        /// Predefined scale for Area. Base unit <b>m²</b>.
        /// </summary>
        public static readonly TbRatioScale Area =
            new TbRatioScale("Area", "Area", Guid.Parse("4facd168-fd63-4660-90ec-ce215b95a89b"), "m²");

        /// <summary>
        /// Predefined scale for Distance. Base unit <b>m</b>.
        /// </summary>
        public static readonly TbRatioScale Distance = new TbRatioScale("Distance", "Distance",
            Guid.Parse("83e5a7ee-866e-4b59-96ff-693f2841a5e5"), "m");

        /// <summary>
        /// Predefined scale for Mass. Base unit <b>g</b>.
        /// </summary>
        public static readonly TbRatioScale Mass =
            new TbRatioScale("Mass", "Mass", Guid.Parse("54f8eb81-bc2e-46c9-ba61-c14766d111c4"), "g");

        /// <summary>
        /// Predefined scale for Amount of substance. Base unit <b>mol</b>.
        /// </summary>
        public static readonly TbRatioScale AmountOfSubstance = new TbRatioScale("Amount of substance",
            "Amount of substance", Guid.Parse("01e43261-cb28-4b4c-b0b5-90a9c7305ce2"), "mol");

        /// <summary>
        /// Predefined scale for Speed. Base unit <b>m/s</b>.
        /// </summary>
        public static readonly TbRatioScale Speed =
            new TbRatioScale("Speed", "Speed", Guid.Parse("433e6a99-8df0-442c-b4e3-37afadbc3243"), "m/s");

        /// <summary>
        /// Predefined scale for Temperature. Base unit <b>°C</b>.
        /// </summary>
        public static readonly TbRatioScale Temperature = new TbRatioScale("Temperature", "Temperature",
            Guid.Parse("08372387-092d-464b-8703-3e1154989b66"), "°C");

        /// <summary>
        /// Predefined scale for Pressure. Base unit <b>Pa</b>.
        /// </summary>
        public static readonly TbRatioScale Pressure = new TbRatioScale("Pressure", "Pressure",
            Guid.Parse("71b04cfc-a2fe-4ec1-9295-e1c1c0be9f56"), "Pa");

        /// <summary>
        /// Predefined scale for Pressure per mole. Base unit <b>Pa-m3/mole</b>.
        /// </summary>
        public static readonly TbRatioScale PressurePerMole = new TbRatioScale("Pressure per mole", "Pressure per mole",
            Guid.Parse("223b3461-a3ab-4b85-b3f3-e6172e7d8631"), "Pa-m3/mole");

        /// <summary>
        /// Predefined scale for Time. Base unit <b>s</b>.
        /// </summary>
        public static readonly TbRatioScale Time =
            new TbRatioScale("Time", "Time", Guid.Parse("11d1a93f-8996-43f4-a60c-b36c8d428cff"), "s");

        /// <summary>
        /// Predefined scale for Volume. Base unit <b>m³</b>.
        /// </summary>
        public static readonly TbRatioScale Volume = new TbRatioScale("Volume", "Volume",
            Guid.Parse("d5d25d2c-2aab-4e7c-b0c2-46deed2ef6e1"), "m³");

        /// <summary>
        /// Predefined scale for Volume concentration. Base unit <b>m³/m³</b>.
        /// </summary>
        public static readonly TbRatioScale VolumeConcentration = new TbRatioScale("Volume concentration",
            "Volume concentration", Guid.Parse("afc01d4a-7fb9-4ae0-9f82-981da1af0cd0"), "m³/m³");

        /// <summary>
        /// Predefined scale for Mass fraction. Base unit <b>g/g</b>.
        /// </summary>
        public static readonly TbRatioScale MassFraction = new TbRatioScale("Mass fraction", "Mass fraction",
            Guid.Parse("11d0992e-5a81-4c1c-96d2-3af73816e3b9"), "g/g");

        /// <summary>
        /// Predefined scale for Concentration in body mass. Base unit <b>g/g</b>.
        /// </summary>
        public static readonly TbRatioScale ConcentrationInBody_mass = new TbRatioScale("Concentration in body (mass)",
            "Concentration in body (mass)", Guid.Parse("c7051176-e616-46fe-8e7b-97d4d5b44786"), "g/g");

        /// <summary>
        /// Predefined scale for Administered dose mass. Base unit <b>g/g/s</b>.
        /// </summary>
        public static readonly TbRatioScale AdministeredDose_mass = new TbRatioScale("Administered dose(mass)",
            "Administered dose(mass)", Guid.Parse("c03e7564-3525-4bda-9613-7b382dc434a3"), "g/g/s");

        /// <summary>
        /// Predefined scale for Mass concentration. Base unit <b>g/m³</b>.
        /// </summary>
        public static readonly TbRatioScale MassConcentration = new TbRatioScale("Mass concentration",
            "Mass concentration", Guid.Parse("7bd4b765-a255-4b25-95af-539665883563"), "g/m³");

        /// <summary>
        /// Predefined scale for Molality. Base unit <b>mol/g</b>.
        /// </summary>
        public static readonly TbRatioScale Molality = new TbRatioScale("Molality", "Molality",
            Guid.Parse("5e3436bf-cb91-452d-b9e9-5ef5660cabf1"), "mol/g");

        /// <summary>
        /// Predefined scale for Molar concentration. Base unit <b>mol/m³</b>.
        /// </summary>
        public static readonly TbRatioScale MolarConcentration = new TbRatioScale("Molar concentration",
            "Molar concentration", Guid.Parse("3eb96ffe-8343-4002-842a-cac08239409d"), "mol/m³");

        /// <summary>
        /// Predefined scale for Concentration in body mole. Base unit <b>mol/g</b>.
        /// </summary>
        public static readonly TbRatioScale ConcentrationInBody_mole = new TbRatioScale("Concentration in body (mole)",
            "Concentration in body (mole)", Guid.Parse("91efad4f-0e51-4460-984d-22e24020e5ca"), "mol/g");

        /// <summary>
        /// Predefined scale for Bioaccumulation. Base unit <b>m³/g</b>.
        /// </summary>
        public static readonly TbRatioScale Bioaccumulation = new TbRatioScale("Bioaccumulation", "Bioaccumulation",
            Guid.Parse("c30955d9-5315-4d4a-9437-82a0fd9cf97e"), "m³/g");

        /// <summary>
        /// Predefined scale for Dose rate mass. Base unit <b>g/s</b>.
        /// </summary>
        public static readonly TbRatioScale DoseRate_mass = new TbRatioScale("Dose rate (mass)", "Dose rate (mass)",
            Guid.Parse("1eaca088-eefc-4f71-9523-a48c0873b412"), "g/s");

        /// <summary>
        /// Predefined scale for Dose rate amount of substance. Base unit <b>mol/s</b>.
        /// </summary>
        public static readonly TbRatioScale DoseRate_amountOfSubstance =
            new TbRatioScale("Dose rate (amount of substance)", "Dose rate (amount of substance)",
                Guid.Parse("18718a12-0044-4aec-9d56-f53202c3c26d"), "mol/s");

        /// <summary>
        /// Predefined scale for Administered dose amount of substance. Base unit <b>mol/g/s</b>.
        /// </summary>
        public static readonly TbRatioScale AdministeredDose_AmountOfSubstance =
            new TbRatioScale("Administered dose(amount of substance)", "Administered dose(amount of substance)",
                Guid.Parse("4a159605-0a75-42e2-85d7-c0caa9771df5"), "mol/g/s");

        /// <summary>
        /// Predefined scale for Mole fraction. Base unit <b>mol/mol</b>.
        /// </summary>
        public static readonly TbRatioScale MoleFraction = new TbRatioScale("Mole fraction", "Mole fraction",
            Guid.Parse("0b117cba-ae1f-4d46-9730-cd9a59f95deb"), "mol/mol");

        /// <summary>
        /// Predefined ordinal scale for Severe skin irritation (Danish EPA). Family: Skin Irritation/Corroson. Categories: Positive, Equivocal, Negative
        /// </summary>
        public static readonly TbOrdinalScale SevereSkinIrritation_DanishEpa = new TbOrdinalScale
            ("Severe skin irritation (Danish EPA)", "Skin Irritation/Corroson", Guid.Parse("890A8C087CBC4959A3061247EBB06DD0"), new [] { "Positive", "Equivocal", "Negative" });

        /// <summary>
        /// Predefined ordinal scale for Skin sensitisation II (ECETOC). Family: Skin. Categories: Positive, Negative
        /// </summary>
        public static readonly TbOrdinalScale SkinSensitisationIII_LJMU = new TbOrdinalScale
            ("Skin sensitisation III (LJMU)", "Skin", Guid.Parse("20DBAE4674384D4EA8903A2B00CCCFAC"), new[] { "Strongly sensitising", "Moderately sensitising", "Ambiguous", "Not sensitising" });

        /// <summary>
        /// Predefined ordinal scale for Skin sensitisation II (ECETOC). Family: Skin. Categories: Positive, Negative
        /// </summary>
        public static readonly TbOrdinalScale SkinSensitisationII_Ecetoc = new TbOrdinalScale
            ("Skin sensitisation II (ECETOC)", "Skin", Guid.Parse("f4296409-2e47-4074-8d95-0f1deedbcd1d"), new[] { "Positive", "Negative" });

        /// <summary>
        /// Predefined ordinal scale for Respiratory sensitization I (ECETOC). Family: Respiratory. Categories: Positive, Negative
        /// </summary>
        public static readonly TbOrdinalScale RespiratorySensitizationI_Ecetoc = new TbOrdinalScale
            ("Respiratory sensitization I (ECETOC)", "Respiratory", Guid.Parse("A48FC27FBEF449148A5138CDAA2247C0"), new[] { "Positive", "Negative" });

        /// <summary>
        /// Predefined ordinal scale for Estrogen Receptor Binding (Danish EPA). Family: Estrogen. Categories: Positive, Equivocal, Negative
        /// </summary>
        public static readonly TbOrdinalScale EstrogenReceptorBinding_DanishEpa = new TbOrdinalScale
            ("Estrogen Receptor Binding (Danish EPA)", "Estrogen", Guid.Parse("5739971ECE484A128672B686FE689046"), new[] { "Positive", "Equivocal", "Negative" });

        /// <summary>
        /// Predefined ordinal scale for DART toxicity (ordinal). Family: Developmental. Categories: Positive, Undefined, Negative
        /// </summary>
        public static readonly TbOrdinalScale DartToxicityOrdinal = new TbOrdinalScale
            ("DART toxicity (ordinal)", "Developmental", Guid.Parse("43E6C42670914316955CB344EE5DCF90"), new[] { "Positive", "Undefined", "Negative" });

        /// <summary>
        /// Predefined ordinal scale for Gene mutation I. Family: Mutagenicity. Categories: Positive, Equivocal, Negative
        /// </summary>
        public static readonly TbOrdinalScale GeneMutationI = new TbOrdinalScale
            ("Gene mutation I", "Mutagenicity", Guid.Parse("C77E243D788A443A8AE1D2C0499A2CAB"), new[] { "Positive", "Equivocal", "Negative" });

        /// <summary>
        /// Predefined ordinal scale for Chromosome aberration I. Family: Mutagenicity. Categories: Positive, Negative
        /// </summary>
        public static readonly TbOrdinalScale ChromosomeAberrationI = new TbOrdinalScale
            ("Chromosome aberration I (Oasis)", "Mutagenicity", Guid.Parse("5508921EB29D44888B750B1ABB5D8D73"), new[] { "Positive", "Negative" });

        /// <summary>
        /// Predefined ordinal scale for Carcinogenicity I (ISSCAN). Family: Carcinogenicity. Categories: Positive, Equivocal, Negative
        /// </summary>
        public static readonly TbOrdinalScale CarcinogenicityI_ISSCAN = new TbOrdinalScale
            ("Carcinogenicity I (ISSCAN)", "Carcinogenicity", Guid.Parse("88BDB5A760D74C04BB32ECBCE11D3B8D"), new[] { "Positive", "Equivocal", "Negative" });

        /// <summary>
        /// Predefined ordinal scale for Biodegradability (categories). Family: Biodegradation. Categories: Ready, Not ready
        /// </summary>
        public static readonly TbOrdinalScale BiodegradabilityCategories = new TbOrdinalScale
            ("Biodegradability (categories)", "Biodegradation", Guid.Parse("FE8A6D0D70E84EF184D5E76DAF00515E"), new[] { "Ready", "Not ready" });

        /// <summary>
        /// Predefined ratio scale for Biodegradability in %. Family: Biodegradation
        /// </summary>
        public static readonly TbRatioScale BiodegradabilityPercent = new TbRatioScale
            ("Biodegradability (%)", "Biodegradation", Guid.Parse("6bad4afe-fe4c-47cf-8ba9-893e6e376469"), "%");

        /// <summary>
        /// Predefined scale for Specific volume. Base unit <b>m³/g</b>.
        /// </summary>
        public static readonly TbRatioScale SpecificVolume = new TbRatioScale("Specific volume", "Specific volume",
            Guid.Parse("52ecbc85-4fe0-462c-8a98-d2554559af7e"), "m³/g");
    }
}
