/**
 * Copyright (c) 2015-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */

package com.facebook.react.bridge;

import javax.annotation.Nullable;

import android.support.v4.util.Pools;

/**
 * Implementation of Dynamic wrapping a ReadableMap.
 */
public class DynamicFromMap implements Dynamic {
  private static final Pools.SimplePool<DynamicFromMap> sPool = new Pools.SimplePool<>(10);

  private @Nullable ReadableMap mMap;
  private @Nullable String mName;

  // This is a pools object. Hide the constructor.
  private DynamicFromMap() {}

  public static DynamicFromMap create(ReadableMap map, String name) {
    DynamicFromMap dynamic = sPool.acquire();
    if (dynamic == null) {
      dynamic = new DynamicFromMap();
    }
    dynamic.mMap = map;
    dynamic.mName = name;
    return dynamic;
  }

  @Override
  public void recycle() {
    mMap = null;
    mName = null;
    sPool.release(this);
  }

  @Override
  public boolean isNull() {
    if (mMap == null || mName == null) {
      throw new IllegalStateException("This dynamic value has been recycled");
    }
    return mMap.isNull(mName);
  }

  @Override
  public boolean asBoolean() {
    if (mMap == null || mName == null) {
      throw new IllegalStateException("This dynamic value has been recycled");
    }
    return mMap.getBoolean(mName);
  }

  @Override
  public double asDouble() {
    if (mMap == null || mName == null) {
      throw new IllegalStateException("This dynamic value has been recycled");
    }
    return mMap.getDouble(mName);
  }

  @Override
  public int asInt() {
    if (mMap == null || mName == null) {
      throw new IllegalStateException("This dynamic value has been recycled");
    }
    return mMap.getInt(mName);
  }

  @Override
  public String asString() {
    if (mMap == null || mName == null) {
      throw new IllegalStateException("This dynamic value has been recycled");
    }
    return mMap.getString(mName);
  }

  @Override
  public ReadableArray asArray() {
    if (mMap == null || mName == null) {
      throw new IllegalStateException("This dynamic value has been recycled");
    }
    return mMap.getArray(mName);
  }

  @Override
  public ReadableMap asMap() {
    if (mMap == null || mName == null) {
      throw new IllegalStateException("This dynamic value has been recycled");
    }
    return mMap.getMap(mName);
  }

  @Override
  public ReadableType getType() {
    if (mMap == null || mName == null) {
      throw new IllegalStateException("This dynamic value has been recycled");
    }
    return mMap.getType(mName);
  }
}
