/*
 *
 *    Copyright (c) 2014-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.
 */

/**
 *    @file
 *      This file defines a simple profile and Weave Data Management
 *      (WDM) profile database to go with it for testing purposes.
 *
 */

#ifndef _TEST_PROFILE_H
#define _TEST_PROFILE_H

// This code tests the legacy version of Weave Data Management
#define WEAVE_CONFIG_DATA_MANAGEMENT_NAMESPACE kWeaveManagedNamespace_Legacy

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

enum
{
    /*
     * this is the "valid" test profile ID and it applies to the
     * simple profile defined below.
     */

    kWeaveProfile_Test               = 0x235A1234,

    kTag_IntegerItem                 = 1,
    kTestTopic                       = 0x235A000000004321ULL,

    /*
     * there is also a "bogus" profile ID that is used to cue specific
     * failure tests. the various tests are tied to profile instances.
     */

    kWeaveProfile_Fail               = 0x235A1235,

    kFailureInstance_CloseConnection = 0x235A123500000001ULL,
    kFailureInstance_NoResponse      = 0x235A123500000002ULL,

    kFailureMode_Invalid             = 0,
    kFailureMode_CloseConnection     = 1,
    kFailureMode_NoResponse          = 2,


    // miscellaneous items related to testing

    kTestBufferSize                  = 100,
    kUpdatePeriod                    = 10,

    /*
     * we define a response timeout of 2 seconds here. this is fine
     * for these tests but should be carefully considered in any
     * application where "real" communication is taking place. in
     * particular, if there's any chance that a response could get
     * dropped then either a timeout must be specified or some other
     * mechanism needs to be put in place to clear out the transaction
     * tables.
     */

    kDefaultDMResponseTimeout        = 2000 // 2 seconds
};

/*
 * this is a special method that looks up the requested failure mode
 * based on the scheme outlined above where failures are called
 * for by invoking instances of a "bogus" profile on view requests.
 */

uint8_t LookupFailureMode(nl::Weave::Profiles::ReferencedTLVData &aPathList);

class TestProfileDB :
public nl::Weave::Profiles::DataManagement::ProfileDatabase
{
public:
    class TestData :
    public nl::Weave::Profiles::DataManagement::ProfileDatabase::ProfileData
    {
    public:
        TestData(void);

        ~TestData(void);

        WEAVE_ERROR StoreItem(const uint64_t &aTag, nl::Weave::TLV::TLVReader &aDataRdr);

        WEAVE_ERROR Retrieve(nl::Weave::TLV::TLVReader &aPathRdr, nl::Weave::TLV::TLVWriter &aDataWrtr);

        /*
         * this is a convenience method that allows the retrieval of the
         * whole thing without having to format a dummy path. and it can
         * be re-used to implement the above.
         */

        WEAVE_ERROR Retrieve(nl::Weave::TLV::TLVWriter &aDataWrtr);

        // data members

        uint32_t mIntegerItem;

        /*
         * we keep this around so we can revert a change
         */

        uint32_t mPreviousIntegerItem;

        /*
         * for testing purposes, it seems fine to have each test data
         * instance carry its own integer instance ID.
         */

        uint64_t mInstanceId;
    };

    WEAVE_ERROR LookupProfileData(nl::Weave::TLV::TLVReader &aPathReader, ProfileData **aResult);

    WEAVE_ERROR LookupProfileData(uint32_t aProfileId, nl::Weave::TLV::TLVReader *aPathReader, ProfileData **aResult);

    void ChangeProfileData(void);

    void RevertProfileData(void);

    TestData mTestData;
};

#endif // __TEST_PROFILE_H
