/**
 * Copyright (C) 2013 Regents of the University of California.
 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
 * See COPYING for copyright and distribution information.
 */

#include "util/ndn_memory.h"
#include "interest.h"

int ndn_Exclude_compareComponents(struct ndn_NameComponent *component1, struct ndn_NameComponent *component2)
{
  if (component1->value.length < component2->value.length)
    return -1;
  if (component1->value.length > component2->value.length)
    return 1;

  // The components are equal length.  Just do a byte compare.  
  return ndn_memcmp(component1->value.value, component2->value.value, component1->value.length);
}

int ndn_Exclude_matches(struct ndn_Exclude *self, struct ndn_NameComponent *component)
{
  size_t i;
  for (i = 0; i < self->nEntries; ++i) {
    if (self->entries[i].type == ndn_Exclude_ANY) {
      struct ndn_ExcludeEntry *lowerBound = 0;
      if (i > 0)
        lowerBound = self->entries + (i - 1);
      
      // Find the upper bound, possibly skipping over multiple ANY in a row.
      size_t iUpperBound;
      struct ndn_ExcludeEntry *upperBound = 0;
      for (iUpperBound = i + 1; iUpperBound < self->nEntries; ++iUpperBound) {
        if (self->entries[iUpperBound].type == ndn_Exclude_COMPONENT) {
          upperBound = self->entries + iUpperBound;
          break;
        }
      }
      
      // If lowerBound != 0, we already checked component equals lowerBound on the last pass.
      // If upperBound != 0, we will check component equals upperBound on the next pass.
      if (upperBound != 0) {
        if (lowerBound != 0) {
          if (ndn_Exclude_compareComponents(component, &lowerBound->component) > 0 &&
              ndn_Exclude_compareComponents(component, &upperBound->component) < 0)
            return 1;
        }
        else {
          if (ndn_Exclude_compareComponents(component, &upperBound->component) < 0)
            return 1;
        }
        
        // Make i equal iUpperBound on the next pass.
        i = iUpperBound - 1;
      }
      else {
        if (lowerBound != 0) {
          if (ndn_Exclude_compareComponents(component, &lowerBound->component) > 0)
            return 1;
        }
        else
          // this.values has only ANY.
          return 1;
      }
    }
    else {
      if (ndn_Exclude_compareComponents(component, &self->entries[i].component) == 0)
        return 1;
    }
  }
  
  return 0;  
}

int ndn_Interest_matchesName(struct ndn_Interest *self, struct ndn_Name *name)
{
  if (!ndn_Name_match(&self->name, name))
    return 0;
  
  if (self->minSuffixComponents >= 0 &&
    // Add 1 for the implicit digest.
    !(name->nComponents + 1 - self->name.nComponents >= self->minSuffixComponents))
    return 0;
  if (self->maxSuffixComponents >= 0 &&
    // Add 1 for the implicit digest.
    !(name->nComponents + 1 - self->name.nComponents <= self->maxSuffixComponents))
    return 0;
  if (self->exclude.nEntries > 0 && name->nComponents > self->name.nComponents &&
      ndn_Exclude_matches(&self->exclude, name->components + self->name.nComponents))
    return 0;
  
  return 1; 
}
