#pragma once

#ifndef GEODE_REGIONXMLCREATION_H_
#define GEODE_REGIONXMLCREATION_H_

/*
 * 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.
 */

#include <string>
#include <vector>

#include <geode/ExceptionTypes.hpp>
#include <geode/Region.hpp>
#include <geode/RegionAttributes.hpp>
#include <geode/internal/geode_globals.hpp>

#include "RegionXmlCreation.hpp"

namespace apache {
namespace geode {
namespace client {
class Cache;

/**
 * Represents a {@link Region} that is created declaratively.
 *
 * @since 1.0
 */
class APACHE_GEODE_EXPORT RegionXmlCreation {
 private:
  /** An <code>RegionAttributesFactory</code> for creating default
   * <code>RegionAttribute</code>s */
  RegionAttributesFactory regionAttributeFactory;

  /** The name of this region */
  std::string regionName;

  /** attributeId mentioned in XML file" */
  std::string attrId;

  /** True if region is a root */
  bool isRoot;

  /** The attributes of this region */
  RegionAttributes regionAttributes;

  /** This region's subregions */
  std::vector<std::shared_ptr<RegionXmlCreation>> subRegions;

 public:
  /**
   * Fills in the state (that is, creates subregions)
   * of a given <code>Region</code> based on the description provided
   * by this <code>RegionXmlCreation</code>.
   *
   */
  void fillIn(std::shared_ptr<Region> region);

 public:
  ~RegionXmlCreation() = default;
  /**
   * Creates a new <code>RegionCreation</code> with the given name.
   */
  explicit RegionXmlCreation(std::string name, bool isRoot = false);

  /**
   * Adds a subregion with the given name to this region
   */
  void addSubregion(std::shared_ptr<RegionXmlCreation> regionPtr);

  /**
   * Sets the attributes of this region
   */
  void setAttributes(const RegionAttributes attributes);

  /**
   * Gets the attributes of this region
   */
  RegionAttributes getAttributes();

  /**
   * Creates a root {@link Region} in a given <code>Cache</code>
   * based on the description provided by this
   * <code>RegionCreation</code>
   *
   * @throws OutOfMemoryException if the memory allocation failed
   * @throws NotConnectedException if the cache is not connected
   * @throws InvalidArgumentException if the attributePtr is nullptr.
   * or if RegionAttributes is null or if regionName is null,
   * the empty   string, or contains a '/'
   * @throws RegionExistsException
   * @throws CacheClosedException if the cache is closed
   *         at the time of region creation
   * @throws UnknownException otherwise
   */
  void createRoot(Cache* cache);

  /**
   * Creates a {@link Region} with the given parent using the
   * description provided by this <code>RegionCreation</code>.
   *
   * @throws OutOfMemoryException if the memory allocation failed
   * @throws NotConnectedException if the cache is not connected
   * @throws InvalidArgumentException if the attributePtr is nullptr.
   * or if RegionAttributes is null or if regionName is null,
   * the empty string,or contains a '/'
   * @throws RegionExistsException
   * @throws CacheClosedException if the cache is closed
   *         at the time of region creation
   * @throws UnknownException otherwise
   *
   */
  void create(std::shared_ptr<Region> parent);

  std::string getAttrId() const;
  void setAttrId(const std::string& attrId);
};
}  // namespace client
}  // namespace geode
}  // namespace apache

#endif  // GEODE_REGIONXMLCREATION_H_
