/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

/*
* The PdxInstance QuickStart Example.
* This example takes the following steps:
*
* This example shows PdxInstanceFactory and PdxInstance usage.
*
* 1. Create a Geode Cache.
* 2. Creates the PdxInstanceFactory for Person class.
* 3. Then creates instance of PdxInstance
* 4. It does put.
* 5. Then it does get and access it fields.
* 6. Close the Cache.
*
*/

// Include the Geode library.
#include <gfcpp/GeodeCppCache.hpp>

// Use the "geode" namespace.
using namespace apache::geode::client;

class Person {
 private:
  char* m_name;
  int m_id;
  int m_age;

 public:
  Person() {}

  Person(char* name, int id, int age) {
    m_name = name;
    m_id = id;
    m_age = age;
  }

  char* getName() const { return m_name; }
  int getID() { return m_id; }
  int getAge() { return m_age; }
};

// The PdxInstance QuickStart example.
int main(int argc, char** argv) {
  try {
    // Create a Geode Cache.
    CacheFactoryPtr cacheFactory = CacheFactory::createCacheFactory();

    CachePtr cachePtr =
        cacheFactory->set("cache-xml-file", "XMLs/clientPdxInstance.xml")
            ->create();

    LOGINFO("Created the Geode Cache");

    // Get the example Region from the Cache which is declared in the Cache XML
    // file.
    RegionPtr regionPtr = cachePtr->getRegion("Person");

    LOGINFO("Obtained the Region from the Cache.");

    Person* p = new Person("Jack", 7, 21);

    // PdxInstanceFactory for Person class
    PdxInstanceFactoryPtr pif = cachePtr->createPdxInstanceFactory("Person");
    LOGINFO("Created PdxInstanceFactory for Person class");

    pif->writeString("m_name", p->getName());
    pif->writeInt("m_id", p->getID());
    pif->markIdentityField("m_id");
    pif->writeInt("m_age", p->getAge());

    PdxInstancePtr pdxInstance = pif->create();

    LOGINFO("Created PdxInstance for Person class");

    regionPtr->put("Key1", pdxInstance);

    LOGINFO("Populated PdxInstance Object");

    PdxInstancePtr retPdxInstance = regionPtr->get("Key1");

    LOGINFO("Got PdxInstance Object");

    int id = 0;
    retPdxInstance->getField("m_id", id);

    int age = 0;
    retPdxInstance->getField("m_age", age);

    char* name = NULL;
    retPdxInstance->getField("m_name", &name);

    if (id == p->getID() && age == p->getAge() &&
        strcmp(name, p->getName()) == 0 &&
        retPdxInstance->isIdentityField("m_id")) {
      LOGINFO("PdxInstance returns all fields value expected");
    } else {
      LOGINFO("PdxInstance doesn't returns all fields value expected");
    }

    delete p;

    // Close the Geode Cache.
    cachePtr->close();

    LOGINFO("Closed the Geode Cache");

    return 0;
  }
  // An exception should not occur
  catch (const Exception& geodeExcp) {
    LOGERROR("PdxInstance Geode Exception: %s", geodeExcp.getMessage());

    return 1;
  }
}
