/*
 * 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.geode.management.internal.json;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.InstanceOfAssertFactories.map;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

import org.apache.geode.cache.query.data.CollectionHolder;
import org.apache.geode.management.model.Employee;
import org.apache.geode.management.model.Item;
import org.apache.geode.management.model.Order;
import org.apache.geode.management.model.SubOrder;

public class QueryResultFormatterTest {
  private static final String RESULT = "result";

  private void checkResult(final QueryResultFormatter queryResultFormatter,
      String expectedJsonString) throws Exception {
    String jsonString = queryResultFormatter.toString();
    assertThat(jsonString).isEqualTo(expectedJsonString);

    JsonNode jsonObject = new ObjectMapper().readTree(jsonString);
    assertThat(jsonObject.get(RESULT)).isNotNull();
  }

  @Test
  public void canBeMocked() {
    QueryResultFormatter mockQueryResultFormatter = mock(QueryResultFormatter.class);
    Object value = new Object();

    mockQueryResultFormatter.add("key", value);
    verify(mockQueryResultFormatter, times(1)).add("key", value);
  }

  @Test
  public void testPrimitives() throws Exception {
    String expectedByteString = "{\"result\":[[\"java.lang.Byte\",1]]}";
    QueryResultFormatter byteResult = new QueryResultFormatter(100).add(RESULT, (byte) 1);
    QueryResultFormatter boxedByteResult = new QueryResultFormatter(100).add(RESULT, new Byte("1"));
    checkResult(byteResult, expectedByteString);
    checkResult(boxedByteResult, expectedByteString);

    String expectedShortString = "{\"result\":[[\"java.lang.Short\",1]]}";
    QueryResultFormatter shortResult = new QueryResultFormatter(100).add(RESULT, (short) 1);
    QueryResultFormatter boxedShortResult =
        new QueryResultFormatter(100).add(RESULT, new Short("1"));
    checkResult(shortResult, expectedShortString);
    checkResult(boxedShortResult, expectedShortString);

    String expectedIntegerString = "{\"result\":[[\"java.lang.Integer\",1]]}";
    QueryResultFormatter integerResult = new QueryResultFormatter(100).add(RESULT, 1);
    QueryResultFormatter boxedIntegerResult =
        new QueryResultFormatter(100).add(RESULT, new Integer("1"));
    checkResult(integerResult, expectedIntegerString);
    checkResult(boxedIntegerResult, expectedIntegerString);

    String expectedLongString = "{\"result\":[[\"java.lang.Long\",25]]}";
    QueryResultFormatter longResult = new QueryResultFormatter(100).add(RESULT, 25L);
    QueryResultFormatter boxedLongResult =
        new QueryResultFormatter(100).add(RESULT, new Long("25"));
    checkResult(longResult, expectedLongString);
    checkResult(boxedLongResult, expectedLongString);

    String expectedFloatString = "{\"result\":[[\"java.lang.Float\",26.0]]}";
    QueryResultFormatter floatResult = new QueryResultFormatter(100).add(RESULT, 26f);
    QueryResultFormatter boxedFloatResult =
        new QueryResultFormatter(100).add(RESULT, new Float("26.0"));
    checkResult(floatResult, expectedFloatString);
    checkResult(boxedFloatResult, expectedFloatString);

    String expectedDoubleString = "{\"result\":[[\"java.lang.Double\",30.0]]}";
    QueryResultFormatter doubleResult = new QueryResultFormatter(100).add(RESULT, 30d);
    QueryResultFormatter boxedDoubleResult =
        new QueryResultFormatter(100).add(RESULT, new Double("30.0"));
    checkResult(doubleResult, expectedDoubleString);
    checkResult(boxedDoubleResult, expectedDoubleString);

    String expectedBooleanString = "{\"result\":[[\"java.lang.Boolean\",true]]}";
    QueryResultFormatter booleanResult = new QueryResultFormatter(100).add(RESULT, true);
    QueryResultFormatter boxedBooleanResult =
        new QueryResultFormatter(100).add(RESULT, Boolean.TRUE);
    checkResult(booleanResult, expectedBooleanString);
    checkResult(boxedBooleanResult, expectedBooleanString);

    String expectedCharString = "{\"result\":[[\"java.lang.Character\",\"a\"]]}";
    QueryResultFormatter charResult = new QueryResultFormatter(100).add(RESULT, 'a');
    QueryResultFormatter boxedCharResult =
        new QueryResultFormatter(100).add(RESULT, new Character('a'));
    checkResult(charResult, expectedCharString);
    checkResult(boxedCharResult, expectedCharString);

    QueryResultFormatter stringResult = new QueryResultFormatter(100).add(RESULT, "String");
    checkResult(stringResult, "{\"result\":[[\"java.lang.String\",\"String\"]]}");

    Date date = new Date(0);
    String expectedString =
        new SimpleDateFormat(QueryResultFormatter.DATE_FORMAT_PATTERN).format(date);
    QueryResultFormatter javaDateResult =
        new QueryResultFormatter(100).add(RESULT, date);
    checkResult(javaDateResult,
        "{\"result\":[[\"java.util.Date\",\"" + expectedString + "\"]]}");

    java.sql.Date sqlDate = new java.sql.Date(0);
    QueryResultFormatter sqlDateResult =
        new QueryResultFormatter(100).add(RESULT, sqlDate);
    checkResult(sqlDateResult,
        "{\"result\":[[\"java.sql.Date\",\"" + expectedString + "\"]]}");
  }

  @Test
  public void testCustomBeans() throws Exception {
    Object object = new Object();
    QueryResultFormatter queryResultFormatter = new QueryResultFormatter(100).add(RESULT, object);
    checkResult(queryResultFormatter, "{\"result\":[[\"java.lang.Object\",{}]]}");

    Order order = new Order();
    order.setId("order1");
    Collection<Item> items = new ArrayList<>();
    items.add(new Item(order, "item1", "itemDescription1"));
    order.setItems(items);
    QueryResultFormatter orderResult = new QueryResultFormatter(100).add(RESULT, order);
    checkResult(orderResult,
        "{\"result\":[[\"org.apache.geode.management.model.Order\",{\"id\":[\"java.lang.String\",\"order1\"],\"items\":[\"java.util.ArrayList\",{\"0\":[\"org.apache.geode.management.model.Item\",{\"itemDescription\":[\"java.lang.String\",\"itemDescription1\"],\"itemId\":[\"java.lang.String\",\"item1\"],\"order\":\"duplicate org.apache.geode.management.model.Order\"}]}]}]]}");
  }

  @Test
  public void testBigDecimal() throws Exception {
    BigDecimal dc = new BigDecimal(20);

    QueryResultFormatter queryResultFormatter = new QueryResultFormatter(100).add(RESULT, dc);
    checkResult(queryResultFormatter, "{\"result\":[[\"java.math.BigDecimal\",20]]}");
  }

  @Test
  public void testArrayWithPrimitives() throws Exception {
    Byte[] byteArray = new Byte[] {0, 1, 2};
    QueryResultFormatter byteArrayResult = new QueryResultFormatter(100).add(RESULT, byteArray);
    checkResult(byteArrayResult, "{\"result\":[[\"java.lang.Byte[]\",[0,1,2]]]}");

    Short[] shortArray = new Short[] {0, 1, 2};
    QueryResultFormatter shortArrayResult = new QueryResultFormatter(100).add(RESULT, shortArray);
    checkResult(shortArrayResult, "{\"result\":[[\"java.lang.Short[]\",[0,1,2]]]}");

    Integer[] integerArray = new Integer[] {0, 1, 2};
    QueryResultFormatter integerArrayResult =
        new QueryResultFormatter(100).add(RESULT, integerArray);
    checkResult(integerArrayResult, "{\"result\":[[\"java.lang.Integer[]\",[0,1,2]]]}");

    Long[] longArray = new Long[] {0L, 1L, 2L};
    QueryResultFormatter longArrayResult = new QueryResultFormatter(100).add(RESULT, longArray);
    checkResult(longArrayResult, "{\"result\":[[\"java.lang.Long[]\",[0,1,2]]]}");

    Float[] floatArray = new Float[] {0f, 1f, 2f};
    QueryResultFormatter floatArrayResult = new QueryResultFormatter(100).add(RESULT, floatArray);
    checkResult(floatArrayResult, "{\"result\":[[\"java.lang.Float[]\",[0.0,1.0,2.0]]]}");

    Double[] doubleArray = new Double[] {0d, 1d, 2d};
    QueryResultFormatter doubleArrayResult = new QueryResultFormatter(100).add(RESULT, doubleArray);
    checkResult(doubleArrayResult, "{\"result\":[[\"java.lang.Double[]\",[0.0,1.0,2.0]]]}");

    Boolean[] booleanArray = new Boolean[] {true, false};
    QueryResultFormatter booleanArrayResult =
        new QueryResultFormatter(100).add(RESULT, booleanArray);
    checkResult(booleanArrayResult, "{\"result\":[[\"java.lang.Boolean[]\",[true,false]]]}");

    Character[] charArray = new Character[] {'a', 'b'};
    QueryResultFormatter charArrayResult = new QueryResultFormatter(100).add(RESULT, charArray);
    checkResult(charArrayResult, "{\"result\":[[\"java.lang.Character[]\",[\"a\",\"b\"]]]}");

    String[] stringArray = new String[] {"string_1", "string_2"};
    QueryResultFormatter stringArrayResult = new QueryResultFormatter(100).add(RESULT, stringArray);
    checkResult(stringArrayResult,
        "{\"result\":[[\"java.lang.String[]\",[\"string_1\",\"string_2\"]]]}");
  }

  @Test
  public void testArrayWithCustomBeans() throws Exception {
    SubOrder[] subOrderArray = new SubOrder[2];
    subOrderArray[0] = new SubOrder();
    QueryResultFormatter subOrderArrayResult =
        new QueryResultFormatter(100).add(RESULT, subOrderArray);
    checkResult(subOrderArrayResult,
        "{\"result\":[[\"org.apache.geode.management.model.SubOrder[]\",[{\"id\":[\"java.lang.String\",\"null1\"],\"items\":[\"java.util.ArrayList\",{}]},null]]]}");

    CollectionHolder arrayHolder = new CollectionHolder();
    QueryResultFormatter arrayHolderResult = new QueryResultFormatter(100).add(RESULT, arrayHolder);
    checkResult(arrayHolderResult,
        "{\"result\":[[\"org.apache.geode.cache.query.data.CollectionHolder\",{\"arr\":[\"java.lang.String[]\",[\"0\",\"1\",\"2\",\"3\",\"4\",\"SUN\",\"IBM\",\"YHOO\",\"GOOG\",\"MSFT\"]]}]]}");
  }

  @Test
  public void testArrayList() throws Exception {
    List<String> list = new ArrayList<>();
    list.add("ONE");
    list.add("TWO");
    list.add("THREE");

    QueryResultFormatter queryResultFormatter = new QueryResultFormatter(100).add(RESULT, list);
    checkResult(queryResultFormatter,
        "{\"result\":[[\"java.util.ArrayList\",{\"0\":[\"java.lang.String\",\"ONE\"],\"1\":[\"java.lang.String\",\"TWO\"],\"2\":[\"java.lang.String\",\"THREE\"]}]]}");
  }

  @Test
  public void testMap() throws Exception {
    Map<String, String> map = new HashMap<>();
    map.put("1", "ONE");
    map.put("2", "TWO");
    map.put("3", "THREE");
    map.put("4", "FOUR");

    QueryResultFormatter queryResultFormatter = new QueryResultFormatter(100).add(RESULT, map);
    checkResult(queryResultFormatter,
        "{\"result\":[[\"java.util.HashMap\",{\"1\":[\"java.lang.String\",\"ONE\"],\"2\":[\"java.lang.String\",\"TWO\"],\"3\":[\"java.lang.String\",\"THREE\"],\"4\":[\"java.lang.String\",\"FOUR\"]}]]}");
  }

  @Test
  public void testBigList() throws Exception {
    List<String> list = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {
      list.add("BIG_COLL_" + i);
    }

    QueryResultFormatter queryResultFormatter = new QueryResultFormatter(100).add(RESULT, list);
    checkResult(queryResultFormatter,
        "{\"result\":[[\"java.util.ArrayList\",{\"0\":[\"java.lang.String\",\"BIG_COLL_0\"],\"1\":[\"java.lang.String\",\"BIG_COLL_1\"],\"2\":[\"java.lang.String\",\"BIG_COLL_2\"],\"3\":[\"java.lang.String\",\"BIG_COLL_3\"],\"4\":[\"java.lang.String\",\"BIG_COLL_4\"],\"5\":[\"java.lang.String\",\"BIG_COLL_5\"],\"6\":[\"java.lang.String\",\"BIG_COLL_6\"],\"7\":[\"java.lang.String\",\"BIG_COLL_7\"],\"8\":[\"java.lang.String\",\"BIG_COLL_8\"],\"9\":[\"java.lang.String\",\"BIG_COLL_9\"],\"10\":[\"java.lang.String\",\"BIG_COLL_10\"],\"11\":[\"java.lang.String\",\"BIG_COLL_11\"],\"12\":[\"java.lang.String\",\"BIG_COLL_12\"],\"13\":[\"java.lang.String\",\"BIG_COLL_13\"],\"14\":[\"java.lang.String\",\"BIG_COLL_14\"],\"15\":[\"java.lang.String\",\"BIG_COLL_15\"],\"16\":[\"java.lang.String\",\"BIG_COLL_16\"],\"17\":[\"java.lang.String\",\"BIG_COLL_17\"],\"18\":[\"java.lang.String\",\"BIG_COLL_18\"],\"19\":[\"java.lang.String\",\"BIG_COLL_19\"],\"20\":[\"java.lang.String\",\"BIG_COLL_20\"],\"21\":[\"java.lang.String\",\"BIG_COLL_21\"],\"22\":[\"java.lang.String\",\"BIG_COLL_22\"],\"23\":[\"java.lang.String\",\"BIG_COLL_23\"],\"24\":[\"java.lang.String\",\"BIG_COLL_24\"],\"25\":[\"java.lang.String\",\"BIG_COLL_25\"],\"26\":[\"java.lang.String\",\"BIG_COLL_26\"],\"27\":[\"java.lang.String\",\"BIG_COLL_27\"],\"28\":[\"java.lang.String\",\"BIG_COLL_28\"],\"29\":[\"java.lang.String\",\"BIG_COLL_29\"],\"30\":[\"java.lang.String\",\"BIG_COLL_30\"],\"31\":[\"java.lang.String\",\"BIG_COLL_31\"],\"32\":[\"java.lang.String\",\"BIG_COLL_32\"],\"33\":[\"java.lang.String\",\"BIG_COLL_33\"],\"34\":[\"java.lang.String\",\"BIG_COLL_34\"],\"35\":[\"java.lang.String\",\"BIG_COLL_35\"],\"36\":[\"java.lang.String\",\"BIG_COLL_36\"],\"37\":[\"java.lang.String\",\"BIG_COLL_37\"],\"38\":[\"java.lang.String\",\"BIG_COLL_38\"],\"39\":[\"java.lang.String\",\"BIG_COLL_39\"],\"40\":[\"java.lang.String\",\"BIG_COLL_40\"],\"41\":[\"java.lang.String\",\"BIG_COLL_41\"],\"42\":[\"java.lang.String\",\"BIG_COLL_42\"],\"43\":[\"java.lang.String\",\"BIG_COLL_43\"],\"44\":[\"java.lang.String\",\"BIG_COLL_44\"],\"45\":[\"java.lang.String\",\"BIG_COLL_45\"],\"46\":[\"java.lang.String\",\"BIG_COLL_46\"],\"47\":[\"java.lang.String\",\"BIG_COLL_47\"],\"48\":[\"java.lang.String\",\"BIG_COLL_48\"],\"49\":[\"java.lang.String\",\"BIG_COLL_49\"],\"50\":[\"java.lang.String\",\"BIG_COLL_50\"],\"51\":[\"java.lang.String\",\"BIG_COLL_51\"],\"52\":[\"java.lang.String\",\"BIG_COLL_52\"],\"53\":[\"java.lang.String\",\"BIG_COLL_53\"],\"54\":[\"java.lang.String\",\"BIG_COLL_54\"],\"55\":[\"java.lang.String\",\"BIG_COLL_55\"],\"56\":[\"java.lang.String\",\"BIG_COLL_56\"],\"57\":[\"java.lang.String\",\"BIG_COLL_57\"],\"58\":[\"java.lang.String\",\"BIG_COLL_58\"],\"59\":[\"java.lang.String\",\"BIG_COLL_59\"],\"60\":[\"java.lang.String\",\"BIG_COLL_60\"],\"61\":[\"java.lang.String\",\"BIG_COLL_61\"],\"62\":[\"java.lang.String\",\"BIG_COLL_62\"],\"63\":[\"java.lang.String\",\"BIG_COLL_63\"],\"64\":[\"java.lang.String\",\"BIG_COLL_64\"],\"65\":[\"java.lang.String\",\"BIG_COLL_65\"],\"66\":[\"java.lang.String\",\"BIG_COLL_66\"],\"67\":[\"java.lang.String\",\"BIG_COLL_67\"],\"68\":[\"java.lang.String\",\"BIG_COLL_68\"],\"69\":[\"java.lang.String\",\"BIG_COLL_69\"],\"70\":[\"java.lang.String\",\"BIG_COLL_70\"],\"71\":[\"java.lang.String\",\"BIG_COLL_71\"],\"72\":[\"java.lang.String\",\"BIG_COLL_72\"],\"73\":[\"java.lang.String\",\"BIG_COLL_73\"],\"74\":[\"java.lang.String\",\"BIG_COLL_74\"],\"75\":[\"java.lang.String\",\"BIG_COLL_75\"],\"76\":[\"java.lang.String\",\"BIG_COLL_76\"],\"77\":[\"java.lang.String\",\"BIG_COLL_77\"],\"78\":[\"java.lang.String\",\"BIG_COLL_78\"],\"79\":[\"java.lang.String\",\"BIG_COLL_79\"],\"80\":[\"java.lang.String\",\"BIG_COLL_80\"],\"81\":[\"java.lang.String\",\"BIG_COLL_81\"],\"82\":[\"java.lang.String\",\"BIG_COLL_82\"],\"83\":[\"java.lang.String\",\"BIG_COLL_83\"],\"84\":[\"java.lang.String\",\"BIG_COLL_84\"],\"85\":[\"java.lang.String\",\"BIG_COLL_85\"],\"86\":[\"java.lang.String\",\"BIG_COLL_86\"],\"87\":[\"java.lang.String\",\"BIG_COLL_87\"],\"88\":[\"java.lang.String\",\"BIG_COLL_88\"],\"89\":[\"java.lang.String\",\"BIG_COLL_89\"],\"90\":[\"java.lang.String\",\"BIG_COLL_90\"],\"91\":[\"java.lang.String\",\"BIG_COLL_91\"],\"92\":[\"java.lang.String\",\"BIG_COLL_92\"],\"93\":[\"java.lang.String\",\"BIG_COLL_93\"],\"94\":[\"java.lang.String\",\"BIG_COLL_94\"],\"95\":[\"java.lang.String\",\"BIG_COLL_95\"],\"96\":[\"java.lang.String\",\"BIG_COLL_96\"],\"97\":[\"java.lang.String\",\"BIG_COLL_97\"],\"98\":[\"java.lang.String\",\"BIG_COLL_98\"],\"99\":[\"java.lang.String\",\"BIG_COLL_99\"]}]]}");
  }

  @Test
  public void testEnum() throws Exception {
    QueryResultFormatter queryResultFormatter =
        new QueryResultFormatter(100).add(RESULT, Currency.DIME);
    checkResult(queryResultFormatter,
        "{\"result\":[[\"org.apache.geode.management.internal.json.QueryResultFormatterTest.Currency\",\"DIME\"]]}");
  }

  @Test
  public void testEnumList() throws Exception {
    List<Currency> list = new ArrayList<>();
    list.add(Currency.DIME);
    list.add(Currency.NICKLE);
    list.add(Currency.QUARTER);
    list.add(Currency.NICKLE);

    QueryResultFormatter queryResultFormatter = new QueryResultFormatter(100).add(RESULT, list);
    checkResult(queryResultFormatter,
        "{\"result\":[[\"java.util.ArrayList\",{\"0\":[\"org.apache.geode.management.internal.json.QueryResultFormatterTest.Currency\",\"DIME\"],\"1\":[\"org.apache.geode.management.internal.json.QueryResultFormatterTest.Currency\",\"NICKLE\"],\"2\":[\"org.apache.geode.management.internal.json.QueryResultFormatterTest.Currency\",\"QUARTER\"],\"3\":[\"org.apache.geode.management.internal.json.QueryResultFormatterTest.Currency\",\"NICKLE\"]}]]}");
  }

  @Test
  public void testEnumContainer() throws Exception {
    EnumContainer enumContainer = new EnumContainer(Currency.DIME);
    QueryResultFormatter queryResultFormatter =
        new QueryResultFormatter(100).add(RESULT, enumContainer);
    checkResult(queryResultFormatter,
        "{\"result\":[[\"org.apache.geode.management.internal.json.QueryResultFormatterTest.EnumContainer\",{}]]}");
  }

  @Test
  public void testObjectWithJsonAnnotation() throws Exception {
    Employee employee = new Employee();
    employee.setId(10);
    employee.setName("John");
    employee.setTitle("Manager");
    QueryResultFormatter queryResultFormatter = new QueryResultFormatter(100);
    queryResultFormatter.add("result", employee);
    // these to make sure we are keeping the pre 1.8 behavior
    assertThat(queryResultFormatter.toString())
        // make sure null values are serialized as well
        .contains("\"address\":null")
        // make sure we don't honor @JsonIgnore annotation
        .contains("id")
        // make sure we don't honor @JsonProperty annotation
        .doesNotContain("Job Title");
  }

  private enum Currency {
    PENNY, NICKLE, DIME, QUARTER
  }

  private static class EnumContainer {
    private final Currency currency;

    EnumContainer(final Currency currency) {
      this.currency = currency;
    }
  }
}
