/*
 * 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.olingo.server.tecsvc.provider;

import org.apache.olingo.commons.api.ODataException;
import org.apache.olingo.server.api.edmx.EdmxReference;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.server.api.edm.provider.Action;
import org.apache.olingo.server.api.edm.provider.ActionImport;
import org.apache.olingo.server.api.edm.provider.AliasInfo;
import org.apache.olingo.server.api.edm.provider.ComplexType;
import org.apache.olingo.server.api.edm.provider.EdmProvider;
import org.apache.olingo.server.api.edm.provider.EntityContainer;
import org.apache.olingo.server.api.edm.provider.EntityContainerInfo;
import org.apache.olingo.server.api.edm.provider.EntitySet;
import org.apache.olingo.server.api.edm.provider.EntityType;
import org.apache.olingo.server.api.edm.provider.EnumType;
import org.apache.olingo.server.api.edm.provider.Function;
import org.apache.olingo.server.api.edm.provider.FunctionImport;
import org.apache.olingo.server.api.edm.provider.Schema;
import org.apache.olingo.server.api.edm.provider.Singleton;
import org.apache.olingo.server.api.edm.provider.Term;
import org.apache.olingo.server.api.edm.provider.TypeDefinition;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class EdmTechProvider extends EdmProvider {

  public static final String nameSpace = "olingo.odata.test1";

  private final SchemaProvider schemaProvider;
  private final EntityTypeProvider entityTypeProvider;
  private final ContainerProvider containerProvider;
  private final ComplexTypeProvider complexTypeProvider;
  private final EnumTypeProvider enumTypeProvider;
  private final ActionProvider actionProvider;
  private final FunctionProvider functionProvider;
  private final TypeDefinitionProvider typeDefinitionProvider;
  private final List<EdmxReference> references;

  public EdmTechProvider() {
    this(Collections.<EdmxReference>emptyList());
  }

  public EdmTechProvider(List<EdmxReference> references) {
    containerProvider = new ContainerProvider(this);
    entityTypeProvider = new EntityTypeProvider();
    complexTypeProvider = new ComplexTypeProvider();
    enumTypeProvider = new EnumTypeProvider();
    actionProvider = new ActionProvider();
    functionProvider = new FunctionProvider();
    typeDefinitionProvider = new TypeDefinitionProvider();
    schemaProvider = new SchemaProvider(this);
    this.references = references;
  }

  @Override
  public List<AliasInfo> getAliasInfos() throws ODataException {
    return Arrays.asList(
        new AliasInfo().setAlias("Namespace1_Alias").setNamespace(nameSpace)
        );
  }

  @Override
  public EnumType getEnumType(final FullQualifiedName enumTypeName) throws ODataException {
    return enumTypeProvider.getEnumType(enumTypeName);
  }

  @Override
  public TypeDefinition getTypeDefinition(final FullQualifiedName typeDefinitionName) throws ODataException {
    return typeDefinitionProvider.getTypeDefinition(typeDefinitionName);
  }

  @Override
  public EntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
    return entityTypeProvider.getEntityType(entityTypeName);
  }

  @Override
  public ComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException {
    return complexTypeProvider.getComplexType(complexTypeName);
  }

  @Override
  public List<Action> getActions(final FullQualifiedName actionName) throws ODataException {
    return actionProvider.getActions(actionName);
  }

  @Override
  public List<Function> getFunctions(final FullQualifiedName functionName) throws ODataException {
    return functionProvider.getFunctions(functionName);
  }

  @Override
  public Term getTerm(final FullQualifiedName termName) throws ODataException {
    return null;
  }

  @Override
  public EntitySet getEntitySet(final FullQualifiedName entityContainer, final String entitySetName)
      throws ODataException {
    return containerProvider.getEntitySet(entityContainer, entitySetName);
  }

  @Override
  public Singleton getSingleton(final FullQualifiedName entityContainer, final String singletonName)
      throws ODataException {
    return containerProvider.getSingleton(entityContainer, singletonName);
  }

  @Override
  public ActionImport getActionImport(final FullQualifiedName entityContainer, final String actionImportName)
      throws ODataException {
    return containerProvider.getActionImport(entityContainer, actionImportName);
  }

  @Override
  public FunctionImport getFunctionImport(final FullQualifiedName entityContainer, final String functionImportName)
      throws ODataException {
    return containerProvider.getFunctionImport(entityContainer, functionImportName);
  }

  @Override
  public List<Schema> getSchemas() throws ODataException {
    return schemaProvider.getSchemas();
  }

  @Override
  public EntityContainer getEntityContainer() throws ODataException {
    return containerProvider.getEntityContainer();
  }

  @Override
  public EntityContainerInfo getEntityContainerInfo(final FullQualifiedName entityContainerName) throws ODataException {
    return containerProvider.getEntityContainerInfo(entityContainerName);
  }
}
