package com.github.mustachejava.reflect.guards;

import com.github.mustachejava.ObjectHandler;
import com.github.mustachejava.reflect.Guard;
import com.github.mustachejava.util.Wrapper;

import java.util.List;

import static com.github.mustachejava.reflect.ReflectionObjectHandler.unwrap;

/**
 * Dig into the dot notation to guard it from changing.
 * <p/>
 * User: sam
 * Date: 6/26/12
 * Time: 9:09 PM
 */
public class WrappedGuard implements Guard {
  protected final ObjectHandler oh;
  protected final int index;
  protected final Wrapper[] wrappers;
  private final List<Guard> wrapperGuard;

  public WrappedGuard(ObjectHandler oh, int index, List<Wrapper> wrappers, List<Guard> wrapperGuard) {
    this.oh = oh;
    this.index = index;
    this.wrappers = wrappers.toArray(new Wrapper[wrappers.size()]);
    this.wrapperGuard = wrapperGuard;
  }

  @Override
  public boolean apply(Object[] objects) {
    Object scope = unwrap(oh, index, wrappers, objects);
    for (Guard predicate : wrapperGuard) {
      if (!predicate.apply(new Object[]{scope})) {
        return false;
      }
    }
    return true;
  }

  public String toString() {
    return "[WrappedGuard: " + index + " " + wrapperGuard + "]";
  }

}
