package io.wealthwizards.appsynctesting.utils;

import java.util.List;
import java.util.Map;

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

@DisplayName("$util.rds")
public class RdsTest {
    @Test
    @DisplayName(".toJsonString")
    void shouldBuildJsonOutput() {
        var rds = new Rds();

        var json = "{\n" +
                "    \"sqlStatementResults\": [\n" +
                "        {\n" +
                "            \"numberOfRecordsUpdated\": 0,\n" +
                "            \"records\": [\n" +
                "                [\n" +
                "                    {\n" +
                "                        \"stringValue\": \"Mark Twain\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"stringValue\": \"Adventures of Huckleberry Finn\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"stringValue\": \"978-1948132817\"\n" +
                "                    }\n" +
                "                ],\n" +
                "                [\n" +
                "                    {\n" +
                "                        \"stringValue\": \"Jack London\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"stringValue\": \"The Call of the Wild\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"stringValue\": \"978-1948132275\"\n" +
                "                    }\n" +
                "                  ]\n" +
                "            ],\n" +
                "            \"columnMetadata\": [\n" +
                "                {\n" +
                "                    \"isSigned\": false,\n" +
                "                    \"isCurrency\": false,\n" +
                "                    \"label\": \"author\",\n" +
                "                    \"precision\": 200,\n" +
                "                    \"typeName\": \"VARCHAR\",\n" +
                "                    \"scale\": 0,\n" +
                "                    \"isAutoIncrement\": false,\n" +
                "                    \"isCaseSensitive\": false,\n" +
                "                    \"schemaName\": \"\",\n" +
                "                    \"tableName\": \"Books\",\n" +
                "                    \"type\": 12,\n" +
                "                    \"nullable\": 0,\n" +
                "                    \"arrayBaseColumnType\": 0,\n" +
                "                    \"name\": \"author\"\n" +
                "                },\n" +
                "                {\n" +
                "                    \"isSigned\": false,\n" +
                "                    \"isCurrency\": false,\n" +
                "                    \"label\": \"title\",\n" +
                "                    \"precision\": 200,\n" +
                "                    \"typeName\": \"VARCHAR\",\n" +
                "                    \"scale\": 0,\n" +
                "                    \"isAutoIncrement\": false,\n" +
                "                    \"isCaseSensitive\": false,\n" +
                "                    \"schemaName\": \"\",\n" +
                "                    \"tableName\": \"Books\",\n" +
                "                    \"type\": 12,\n" +
                "                    \"nullable\": 0,\n" +
                "                    \"arrayBaseColumnType\": 0,\n" +
                "                    \"name\": \"title\"\n" +
                "                },\n" +
                "                {\n" +
                "                    \"isSigned\": false,\n" +
                "                    \"isCurrency\": false,\n" +
                "                    \"label\": \"ISBN-13\",\n" +
                "                    \"precision\": 15,\n" +
                "                    \"typeName\": \"VARCHAR\",\n" +
                "                    \"scale\": 0,\n" +
                "                    \"isAutoIncrement\": false,\n" +
                "                    \"isCaseSensitive\": false,\n" +
                "                    \"schemaName\": \"\",\n" +
                "                    \"tableName\": \"Books\",\n" +
                "                    \"type\": 12,\n" +
                "                    \"nullable\": 0,\n" +
                "                    \"arrayBaseColumnType\": 0,\n" +
                "                    \"name\": \"ISBN-13\"\n" +
                "                }\n" +
                "            ]\n" +
                "        }\n" +
                "    ]\n" +
                "}";

        var actual = rds.toJsonString(json);
        var expected = "[[{\"title\":\"Adventures of Huckleberry Finn\",\"author\":\"Mark Twain\",\"ISBN-13\":\"978-1948132817\"},{\"title\":\"The Call of the Wild\",\"author\":\"Jack London\",\"ISBN-13\":\"978-1948132275\"}]]";

        assertEquals(expected, actual);
    }

    @Test
    @DisplayName(".toJsonObject")
    void shouldBuildObject() {
        var rds = new Rds();

        var json = "{\n" +
                "    \"sqlStatementResults\": [\n" +
                "        {\n" +
                "            \"numberOfRecordsUpdated\": 0,\n" +
                "            \"records\": [\n" +
                "                [\n" +
                "                    {\n" +
                "                        \"stringValue\": \"Mark Twain\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"stringValue\": \"Adventures of Huckleberry Finn\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"stringValue\": \"978-1948132817\"\n" +
                "                    }\n" +
                "                ],\n" +
                "                [\n" +
                "                    {\n" +
                "                        \"stringValue\": \"Jack London\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"stringValue\": \"The Call of the Wild\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"stringValue\": \"978-1948132275\"\n" +
                "                    }\n" +
                "                  ]\n" +
                "            ],\n" +
                "            \"columnMetadata\": [\n" +
                "                {\n" +
                "                    \"isSigned\": false,\n" +
                "                    \"isCurrency\": false,\n" +
                "                    \"label\": \"author\",\n" +
                "                    \"precision\": 200,\n" +
                "                    \"typeName\": \"VARCHAR\",\n" +
                "                    \"scale\": 0,\n" +
                "                    \"isAutoIncrement\": false,\n" +
                "                    \"isCaseSensitive\": false,\n" +
                "                    \"schemaName\": \"\",\n" +
                "                    \"tableName\": \"Books\",\n" +
                "                    \"type\": 12,\n" +
                "                    \"nullable\": 0,\n" +
                "                    \"arrayBaseColumnType\": 0,\n" +
                "                    \"name\": \"author\"\n" +
                "                },\n" +
                "                {\n" +
                "                    \"isSigned\": false,\n" +
                "                    \"isCurrency\": false,\n" +
                "                    \"label\": \"title\",\n" +
                "                    \"precision\": 200,\n" +
                "                    \"typeName\": \"VARCHAR\",\n" +
                "                    \"scale\": 0,\n" +
                "                    \"isAutoIncrement\": false,\n" +
                "                    \"isCaseSensitive\": false,\n" +
                "                    \"schemaName\": \"\",\n" +
                "                    \"tableName\": \"Books\",\n" +
                "                    \"type\": 12,\n" +
                "                    \"nullable\": 0,\n" +
                "                    \"arrayBaseColumnType\": 0,\n" +
                "                    \"name\": \"title\"\n" +
                "                },\n" +
                "                {\n" +
                "                    \"isSigned\": false,\n" +
                "                    \"isCurrency\": false,\n" +
                "                    \"label\": \"ISBN-13\",\n" +
                "                    \"precision\": 15,\n" +
                "                    \"typeName\": \"VARCHAR\",\n" +
                "                    \"scale\": 0,\n" +
                "                    \"isAutoIncrement\": false,\n" +
                "                    \"isCaseSensitive\": false,\n" +
                "                    \"schemaName\": \"\",\n" +
                "                    \"tableName\": \"Books\",\n" +
                "                    \"type\": 12,\n" +
                "                    \"nullable\": 0,\n" +
                "                    \"arrayBaseColumnType\": 0,\n" +
                "                    \"name\": \"ISBN-13\"\n" +
                "                }\n" +
                "            ]\n" +
                "        }\n" +
                "    ]\n" +
                "}";

        var actual = rds.toJsonObject(json);
        var expected = List.of(
                List.of(
                        Map.of(
                                "author", "Mark Twain",
                                "ISBN-13", "978-1948132817",
                                "title", "Adventures of Huckleberry Finn"
                        ),
                        Map.of(
                                "author", "Jack London",
                                "ISBN-13", "978-1948132275",
                                "title", "The Call of the Wild"
                        )
                )
        );

        assertEquals(expected, actual);
    }
}
