/*
 * 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.
 */
package org.apache.oodt.cas.filemgr.catalog;

//JDK imports
import java.util.List;
import java.util.Map;

//OODT imports
import org.apache.oodt.cas.filemgr.structs.Product;
import org.apache.oodt.cas.filemgr.structs.ProductPage;
import org.apache.oodt.cas.filemgr.structs.ProductType;
import org.apache.oodt.cas.filemgr.structs.Query;
import org.apache.oodt.cas.filemgr.structs.Reference;
import org.apache.oodt.cas.filemgr.structs.exceptions.CatalogException;
import org.apache.oodt.cas.filemgr.validation.ValidationLayer;
import org.apache.oodt.cas.metadata.Metadata;

//Google imports
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

/**
 * A Mock {@link Catalog}.
 *
 * @author bfoster (Brian Foster)
 */
public class MockCatalog implements Catalog {

   Map<String, Product> products;

   public MockCatalog() {
      products = Maps.newHashMap();
   }

   @Override
   public ProductPage getFirstPage(ProductType type) {
      return null;
   }

   @Override
   public ProductPage getLastProductPage(ProductType type) {
      return null;
   }

   @Override
   public ProductPage getNextPage(ProductType type, ProductPage currentPage) {
      return null;
   }

   @Override
   public ProductPage getPrevPage(ProductType type, ProductPage currentPage) {
      return null;
   }

   @Override
   public void addMetadata(Metadata m, Product product) throws CatalogException {      
   }

   @Override
   public void removeMetadata(Metadata m, Product product)
         throws CatalogException {      
   }

   @Override
   public void addProduct(Product product) throws CatalogException {   
      products.put(product.getProductId(), product);
   }

   @Override
   public void modifyProduct(Product product) throws CatalogException {
      products.put(product.getProductId(), product);
   }

   @Override
   public void removeProduct(Product product) throws CatalogException {
      products.remove(product.getProductId());
   }

   @Override
   public void setProductTransferStatus(Product product)
         throws CatalogException {
      Product ingestedProduct = products.get(product.getProductId());
      ingestedProduct.setTransferStatus(product.getTransferStatus());
   }

   @Override
   public void addProductReferences(Product product) throws CatalogException {
      Product ingestedProduct = products.get(product.getProductId());
      List<Reference> references = ingestedProduct.getProductReferences();
      if (references == null) {
         references = Lists.newArrayList();
      }
      references.addAll(product.getProductReferences());
      ingestedProduct.setProductReferences(references);
   }

   @Override
   public Product getProductById(String productId) throws CatalogException {
      return products.get(productId);
   }

   @Override
   public Product getProductByName(String productName) throws CatalogException {
      for (Product product : products.values()) {
         if (product.getProductName().equals(productName)) {
            return product;
         }
      }
      return null;
   }

   @Override
   public List<Reference> getProductReferences(Product product)
         throws CatalogException {
      return null;
   }

   @Override
   public List<Product> getProducts() throws CatalogException {
      return Lists.newArrayList(products.values());
   }

   @Override
   public List<Product> getProductsByProductType(ProductType type)
         throws CatalogException {
      return null;
   }

   @Override
   public Metadata getMetadata(Product product) throws CatalogException {
      return null;
   }

   @Override
   public Metadata getReducedMetadata(Product product, List<String> elements)
         throws CatalogException {
      return null;
   }

   @Override
   public List<String> query(Query query, ProductType type)
         throws CatalogException {
      return null;
   }

   @Override
   public ProductPage pagedQuery(Query query, ProductType type, int pageNum)
         throws CatalogException {
      return null;
   }

   @Override
   public List<Product> getTopNProducts(int n) throws CatalogException {
      return null;
   }

   @Override
   public List<Product> getTopNProducts(int n, ProductType type)
         throws CatalogException {
      return null;
   }

   @Override
   public ValidationLayer getValidationLayer() throws CatalogException {
      return null;
   }

   @Override
   public int getNumProducts(ProductType type) throws CatalogException {
      return 0;
   }
}
