/*
 *
 *    Copyright (c) 2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
#ifndef _NEST_TEST_TRAIT__TEST_E_TRAIT_H_
#define _NEST_TEST_TRAIT__TEST_E_TRAIT_H_

#include <Weave/Profiles/data-management/DataManagement.h>
#include <Weave/Support/SerializationUtils.h>

#include <weave/common/DayOfWeekEnum.h>

#include <nest/test/trait/StructEStructSchema.h>
#include <nest/test/trait/CommonStructEStructSchema.h>
#include <nest/test/trait/NullableEStructSchema.h>

namespace Schema {
namespace Nest {
namespace Test {
namespace Trait {
namespace TestETrait {

    extern const nl::Weave::Profiles::DataManagement::TraitSchemaEngine TraitSchema;

    enum {
        kWeaveProfileId = (0x235aU << 16) | 0xfe06U
    };

    //
    // Events
    //

    struct teH_array {
        uint32_t num;
        uint32_t *buf;
    };

    struct teI_array {
        uint32_t num;
        Schema::Nest::Test::Trait::TestCommonTrait::CommonStructE *buf;
    };

    struct TestEEvent
    {
        uint32_t teA;
        int32_t teB;
        bool teC;
        int32_t teD;
        Schema::Nest::Test::Trait::TestETrait::StructE teE;
        int32_t teF;
        Schema::Nest::Test::Trait::TestCommonTrait::CommonStructE teG;
        teH_array teH;
        teI_array teI;
        int16_t teJ;
        void SetTeJNull(void);
        void SetTeJPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsTeJPresent(void);
#endif
        nl::SerializedByteString teK;
        uint32_t teL;
        uint64_t teM;
        void SetTeMNull(void);
        void SetTeMPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsTeMPresent(void);
#endif
        nl::SerializedByteString teN;
        void SetTeNNull(void);
        void SetTeNPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsTeNPresent(void);
#endif
        uint32_t teO;
        int64_t teP;
        void SetTePNull(void);
        void SetTePPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsTePPresent(void);
#endif
        int64_t teQ;
        uint32_t teR;
        uint32_t teS;
        void SetTeSNull(void);
        void SetTeSPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsTeSPresent(void);
#endif

        uint8_t __nullified_fields__[5/8 + 1];

        // Statically-known Event Struct Attributes:
        enum {
            kWeaveProfileId = (0x235aU << 16) | 0xfe06U,
            kEventTypeId = 0x1U
        };

        static const nl::SchemaFieldDescriptor FieldSchema;

        static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
    };

    inline void TestEEvent::SetTeJNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 0);
    }

    inline void TestEEvent::SetTeJPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 0);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestEEvent::IsTeJPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 0));
    }
#endif

    inline void TestEEvent::SetTeMNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 1);
    }

    inline void TestEEvent::SetTeMPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 1);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestEEvent::IsTeMPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 1));
    }
#endif

    inline void TestEEvent::SetTeNNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 2);
    }

    inline void TestEEvent::SetTeNPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 2);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestEEvent::IsTeNPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 2));
    }
#endif

    inline void TestEEvent::SetTePNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 3);
    }

    inline void TestEEvent::SetTePPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 3);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestEEvent::IsTePPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 3));
    }
#endif

    inline void TestEEvent::SetTeSNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 4);
    }

    inline void TestEEvent::SetTeSPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 4);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestEEvent::IsTeSPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 4));
    }
#endif

    struct TestENullableEvent
    {
        uint32_t neA;
        void SetNeANull(void);
        void SetNeAPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeAPresent(void);
#endif
        int32_t neB;
        void SetNeBNull(void);
        void SetNeBPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeBPresent(void);
#endif
        bool neC;
        void SetNeCNull(void);
        void SetNeCPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeCPresent(void);
#endif
        const char * neD;
        void SetNeDNull(void);
        void SetNeDPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeDPresent(void);
#endif
        int16_t neE;
        void SetNeENull(void);
        void SetNeEPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeEPresent(void);
#endif
        uint32_t neF;
        void SetNeFNull(void);
        void SetNeFPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeFPresent(void);
#endif
        int32_t neG;
        void SetNeGNull(void);
        void SetNeGPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeGPresent(void);
#endif
        bool neH;
        void SetNeHNull(void);
        void SetNeHPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeHPresent(void);
#endif
        const char * neI;
        void SetNeINull(void);
        void SetNeIPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeIPresent(void);
#endif
        Schema::Nest::Test::Trait::TestETrait::NullableE neJ;
        void SetNeJNull(void);
        void SetNeJPresent(void);
#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
        bool IsNeJPresent(void);
#endif

        uint8_t __nullified_fields__[10/8 + 1];

        // Statically-known Event Struct Attributes:
        enum {
            kWeaveProfileId = (0x235aU << 16) | 0xfe06U,
            kEventTypeId = 0x2U
        };

        static const nl::SchemaFieldDescriptor FieldSchema;

        static const nl::Weave::Profiles::DataManagement::EventSchema Schema;
    };

    inline void TestENullableEvent::SetNeANull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 0);
    }

    inline void TestENullableEvent::SetNeAPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 0);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeAPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 0));
    }
#endif

    inline void TestENullableEvent::SetNeBNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 1);
    }

    inline void TestENullableEvent::SetNeBPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 1);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeBPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 1));
    }
#endif

    inline void TestENullableEvent::SetNeCNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 2);
    }

    inline void TestENullableEvent::SetNeCPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 2);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeCPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 2));
    }
#endif

    inline void TestENullableEvent::SetNeDNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 3);
    }

    inline void TestENullableEvent::SetNeDPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 3);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeDPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 3));
    }
#endif

    inline void TestENullableEvent::SetNeENull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 4);
    }

    inline void TestENullableEvent::SetNeEPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 4);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeEPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 4));
    }
#endif

    inline void TestENullableEvent::SetNeFNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 5);
    }

    inline void TestENullableEvent::SetNeFPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 5);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeFPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 5));
    }
#endif

    inline void TestENullableEvent::SetNeGNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 6);
    }

    inline void TestENullableEvent::SetNeGPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 6);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeGPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 6));
    }
#endif

    inline void TestENullableEvent::SetNeHNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 7);
    }

    inline void TestENullableEvent::SetNeHPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 7);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeHPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 7));
    }
#endif

    inline void TestENullableEvent::SetNeINull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 8);
    }

    inline void TestENullableEvent::SetNeIPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 8);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeIPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 8));
    }
#endif

    inline void TestENullableEvent::SetNeJNull(void)
    {
        SET_FIELD_NULLIFIED_BIT(__nullified_fields__, 9);
    }

    inline void TestENullableEvent::SetNeJPresent(void)
    {
        CLEAR_FIELD_NULLIFIED_BIT(__nullified_fields__, 9);
    }

#if WEAVE_CONFIG_SERIALIZATION_ENABLE_DESERIALIZATION
    inline bool TestENullableEvent::IsNeJPresent(void)
    {
        return (!GET_FIELD_NULLIFIED_BIT(__nullified_fields__, 9));
    }
#endif

    //
    // Enums
    //

    enum EnumE {
        ENUM_E_VALUE_1 = 1,
        ENUM_E_VALUE_2 = 2,
        ENUM_E_VALUE_3 = 3,
    };

} // namespace TestETrait
}
}
}

}
#endif // _NEST_TEST_TRAIT__TEST_E_TRAIT_H_
