/*
 * 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.data;

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

import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntitySet;
import org.apache.olingo.commons.api.data.LinkedComplexValue;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.edm.EdmEntityContainer;
import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.server.api.OData;
import org.apache.olingo.server.api.edmx.EdmxReference;
import org.apache.olingo.server.api.uri.UriParameter;
import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

public class DataProviderTest {

  private final Edm edm = OData.newInstance().createServiceMetadata(new EdmTechProvider(
      Collections.<EdmxReference> emptyList()), Collections.<EdmxReference> emptyList())
      .getEdm();
  private final EdmEntityContainer entityContainer = edm.getEntityContainer(
      new FullQualifiedName("olingo.odata.test1", "Container"));

  private final EdmEntitySet esAllPrim = entityContainer.getEntitySet("ESAllPrim");
  private final EdmEntitySet esAllKey = entityContainer.getEntitySet("ESAllKey");
  private final EdmEntitySet esCompAllPrim = entityContainer.getEntitySet("ESCompAllPrim");
  private final EdmEntitySet esCollAllPrim = entityContainer.getEntitySet("ESCollAllPrim");
  private final EdmEntitySet esMixPrimCollComp = entityContainer.getEntitySet("ESMixPrimCollComp");
  private final EdmEntitySet esMedia = entityContainer.getEntitySet("ESMedia");

  @Test
  public void esAllPrimEntity() throws Exception {
    final DataProvider dataProvider = new DataProvider();
    final Entity entity = dataProvider.readAll(esAllPrim).getEntities().get(2);
    Assert.assertEquals(16, entity.getProperties().size());

    Assert.assertEquals(entity,
        dataProvider.read(esAllPrim, Arrays.asList(mockParameter("PropertyInt16", "-0"))));
  }

  @Test
  public void esAllKeyEntity() throws Exception {
    final DataProvider dataProvider = new DataProvider();
    final Entity entity = dataProvider.readAll(esAllKey).getEntities().get(0);
    Assert.assertEquals(13, entity.getProperties().size());

    Assert.assertEquals(entity, dataProvider.read(esAllKey, Arrays.asList(
        mockParameter("PropertyBoolean", "true"),
        mockParameter("PropertyByte", "255"),
        mockParameter("PropertyDate", "2012-12-03"),
        mockParameter("PropertyDateTimeOffset", "2012-12-03T07:16:23Z"),
        mockParameter("PropertyDecimal", "34"),
        mockParameter("PropertyDuration", "duration'PT6S'"),
        mockParameter("PropertyGuid", "01234567-89AB-CDEF-0123-456789ABCDEF"),
        mockParameter("PropertyInt16", "32767"),
        mockParameter("PropertyInt32", "2147483647"),
        mockParameter("PropertyInt64", "9223372036854775807"),
        mockParameter("PropertySByte", "127"),
        mockParameter("PropertyString", "'First'"),
        mockParameter("PropertyTimeOfDay", "02:48:21"))));
  }

  @Test
  public void esAllPrim() throws Exception {
    final DataProvider data = new DataProvider();
    EntitySet outSet = data.readAll(esAllPrim);

    Assert.assertEquals(3, outSet.getEntities().size());

    Entity first = outSet.getEntities().get(0);
    Assert.assertEquals(16, first.getProperties().size());
    Assert.assertEquals(2, first.getNavigationLinks().size());
    final EntitySet target = first.getNavigationLink("NavPropertyETTwoPrimMany").getInlineEntitySet();
    Assert.assertNotNull(target);
    Assert.assertEquals(1, target.getEntities().size());
    Assert.assertEquals(data.readAll(entityContainer.getEntitySet("ESTwoPrim")).getEntities().get(1),
        target.getEntities().get(0));

    Assert.assertEquals(16, outSet.getEntities().get(1).getProperties().size());
    Assert.assertEquals(16, outSet.getEntities().get(2).getProperties().size());
  }

  @Test
  public void esCollAllPrim() throws Exception {
    EntitySet outSet = new DataProvider().readAll(esCollAllPrim);

    Assert.assertEquals(3, outSet.getEntities().size());
    Assert.assertEquals(17, outSet.getEntities().get(0).getProperties().size());
    Property list = outSet.getEntities().get(0).getProperties().get(1);
    Assert.assertTrue(list.isCollection());
    Assert.assertEquals(3, list.asCollection().size());
    Assert.assertEquals(17, outSet.getEntities().get(1).getProperties().size());
    Assert.assertEquals(17, outSet.getEntities().get(2).getProperties().size());
  }

  @Test
  public void esCompAllPrim() throws Exception {
    EntitySet outSet = new DataProvider().readAll(esCompAllPrim);

    Assert.assertEquals(3, outSet.getEntities().size());
    Assert.assertEquals(2, outSet.getEntities().get(0).getProperties().size());
    Property complex = outSet.getEntities().get(0).getProperties().get(1);
    Assert.assertTrue(complex.isLinkedComplex());
    Assert.assertEquals(16, complex.asLinkedComplex().getValue().size());
    Assert.assertEquals(2, outSet.getEntities().get(1).getProperties().size());
    Assert.assertEquals(2, outSet.getEntities().get(2).getProperties().size());
  }

  @Test
  public void esMixPrimCollComp() throws Exception {
    EntitySet outSet = new DataProvider().readAll(esMixPrimCollComp);

    Assert.assertEquals(3, outSet.getEntities().size());
    Assert.assertEquals(4, outSet.getEntities().get(0).getProperties().size());
    Property complex = outSet.getEntities().get(0).getProperties().get(2);
    Assert.assertTrue(complex.isLinkedComplex());
    Assert.assertEquals(2, complex.asLinkedComplex().getValue().size());
    Property complexCollection = outSet.getEntities().get(0).getProperties().get(3);
    Assert.assertTrue(complexCollection.isCollection());
    List<?> linkedComplexValues = complexCollection.asCollection();
    Assert.assertEquals(3, linkedComplexValues.size());
    LinkedComplexValue linkedComplexValue = (LinkedComplexValue) linkedComplexValues.get(0);
    Assert.assertEquals(2, linkedComplexValue.getValue().size());
    Property lcProp = linkedComplexValue.getValue().get(0);
    Assert.assertFalse(lcProp.isCollection());
    Assert.assertEquals(123, lcProp.getValue());
    //
    Assert.assertEquals(4, outSet.getEntities().get(1).getProperties().size());
    Assert.assertEquals(4, outSet.getEntities().get(2).getProperties().size());
  }

  @Test
  public void esMedia() throws Exception {
    DataProvider dataProvider = new DataProvider();
    Entity entity = dataProvider.read(esMedia, Arrays.asList(mockParameter("PropertyInt16", "3")));
    Assert.assertNotNull(dataProvider.readMedia(entity));
    dataProvider.delete(esMedia, entity);
    Assert.assertEquals(3, dataProvider.readAll(esMedia).getEntities().size());
    entity = dataProvider.create(esMedia);
    Assert.assertEquals(5, entity.getProperty("PropertyInt16").getValue());
    dataProvider.setMedia(entity, new byte[] { 1, 2, 3, 4 }, "x/y");
    Assert.assertArrayEquals(new byte[] { 1, 2, 3, 4 }, dataProvider.readMedia(entity));
    Assert.assertEquals("x/y", entity.getMediaContentType());
  }

  private static UriParameter mockParameter(final String name, final String text) {
    UriParameter parameter = Mockito.mock(UriParameter.class);
    Mockito.when(parameter.getName()).thenReturn(name);
    Mockito.when(parameter.getText()).thenReturn(text);
    return parameter;
  }
}
