/**
 * 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.metamodel.membrane.controllers;

import static org.junit.Assert.assertEquals;

import java.util.Map;

import org.apache.metamodel.membrane.app.InMemoryTenantRegistry;
import org.apache.metamodel.membrane.app.TenantRegistry;
import org.apache.metamodel.membrane.app.config.JacksonConfig;
import org.junit.Before;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.fasterxml.jackson.databind.ObjectMapper;

public class TenantInteractionScenarioTest {

    private MockMvc mockMvc;

    @Before
    public void init() {
        final MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        messageConverter.setObjectMapper(new JacksonConfig().objectMapper());

        final TenantRegistry tenantRegistry = new InMemoryTenantRegistry();
        final TenantController tenantController = new TenantController(tenantRegistry);
        final DataSourceController dataContextController = new DataSourceController(tenantRegistry);
        final SchemaController schemaController = new SchemaController(tenantRegistry);
        final TableController tableController = new TableController(tenantRegistry);
        final ColumnController columnController = new ColumnController(tenantRegistry);
        final QueryController queryController = new QueryController(tenantRegistry);
        final TableDataController tableDataController = new TableDataController(tenantRegistry);

        mockMvc = MockMvcBuilders.standaloneSetup(tenantController, dataContextController, schemaController,
                tableController, columnController, queryController, tableDataController).setMessageConverters(
                        messageConverter).build();
    }

    @Test
    public void testScenario() throws Exception {
        // create tenant
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.put("/tenant1").contentType(
                    MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("tenant", map.get("type"));
            assertEquals("tenant1", map.get("name"));
            assertEquals("[]", map.get("datasources").toString());
        }

        // create datasource
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.put("/tenant1/mydata").content(
                    "{'type':'pojo','table-defs':'hello_world (greeting VARCHAR, who VARCHAR); foo (bar INTEGER, baz DATE);'}"
                            .replace('\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect(
                                    MockMvcResultMatchers.status().isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("datasource", map.get("type"));
            assertEquals("mydata", map.get("name"));
            assertEquals(
                    "[{name=information_schema, uri=/tenant1/mydata/s/information_schema}, {name=mydata, uri=/tenant1/mydata/s/mydata}]",
                    map.get("schemas").toString());
        }

        // explore tenant - now with a datasource
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1")).andExpect(
                    MockMvcResultMatchers.status().isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("tenant", map.get("type"));
            assertEquals("tenant1", map.get("name"));
            assertEquals("[{name=mydata, uri=/tenant1/mydata}]", map.get("datasources").toString());
        }

        // explore schema
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/s/mydata")).andExpect(
                    MockMvcResultMatchers.status().isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("schema", map.get("type"));
            assertEquals("mydata", map.get("name"));

            assertEquals(
                    "[{name=foo, uri=/tenant1/mydata/s/mydata/t/foo}, {name=hello_world, uri=/tenant1/mydata/s/mydata/t/hello_world}]",
                    map.get("tables").toString());
        }

        // explore table
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/s/mydata/t/foo"))
                    .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("table", map.get("type"));
            assertEquals("foo", map.get("name"));

            assertEquals("[{name=bar, uri=/tenant1/mydata/s/mydata/t/foo/c/bar}, "
                    + "{name=baz, uri=/tenant1/mydata/s/mydata/t/foo/c/baz}]", map.get("columns").toString());
        }

        // explore column
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/s/mydata/t/foo/c/bar"))
                    .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("column", map.get("type"));
            assertEquals("bar", map.get("name"));

            assertEquals("{number=0, nullable=true, primary-key=false, indexed=false, column-type=INTEGER}", map.get(
                    "metadata").toString());
        }

        // query metadata from information_schema
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/q?sql={sql}",
                    "SELECT name, table FROM information_schema.columns")).andExpect(MockMvcResultMatchers.status()
                            .isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("dataset", map.get("type"));
            assertEquals("[columns.name, columns.table]", map.get("headers").toString());
            assertEquals("[[bar, foo], [baz, foo], [greeting, hello_world], [who, hello_world]]", map.get("data")
                    .toString());
        }

        // insert into table (x2)
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post(
                    "/tenant1/mydata/s/mydata/t/hello_world/d").content("[{'greeting':'Howdy','who':'MetaModel'}]"
                            .replace('\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect(
                                    MockMvcResultMatchers.status().isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("{status=ok}", map.toString());
        }
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post(
                    "/tenant1/mydata/s/mydata/t/hello_world/d").content("[{'greeting':'Hi','who':'Apache'}]".replace(
                            '\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers
                                    .status().isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("{status=ok}", map.toString());
        }

        // query the actual data
        // query metadata from information_schema
        {
            final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/q?sql={sql}",
                    "SELECT greeting, who AS who_is_it FROM hello_world")).andExpect(MockMvcResultMatchers.status()
                            .isOk()).andReturn();

            final String content = result.getResponse().getContentAsString();
            final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
            assertEquals("dataset", map.get("type"));
            assertEquals("[hello_world.greeting, hello_world.who AS who_is_it]", map.get("headers").toString());
            assertEquals("[[Howdy, MetaModel], [Hi, Apache]]", map.get("data").toString());
        }
    }
}
