package io.prediction;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ExecutionException;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.collection.IsArray.array;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import com.github.tomakehurst.wiremock.junit.WireMockRule;

/**
 * Tests for {@link Client}.
 *
 * @author support@prediction.io (The PredictionIO Team)
 */
@RunWith(JUnit4.class)
public class ClientTest {

    String appkey = "validkey";
    int apiPort = 5784;
    String apiURL = "http://localhost:" + apiPort;
    Client client = new Client(appkey, apiURL);

    @Rule
    public WireMockRule wireMockRule = new WireMockRule(apiPort);

    @Test
    public void getStatus() {
        stubFor(get(urlEqualTo("/"))
            .willReturn(aResponse()
                .withStatus(200)
                .withHeader("Content-Type", "text/plain")
                .withBody("online")));

        try {
            assertThat(client.getStatus(), is("online"));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void createUser() {
        String url = "/users.json";
        stubFor(post(urlEqualTo(url))
              .willReturn(aResponse().withStatus(201)));

        try {
            client.createUser("foo");
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        verify(postRequestedFor(urlMatching(url))
               .withRequestBody(containing("\"pio_appkey\":\"validkey\""))
               .withRequestBody(containing("\"pio_uid\":\"foo\"")));

        try {
            client.createUser(client.getCreateUserRequestBuilder("bar"));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        verify(postRequestedFor(urlMatching(url))
               .withRequestBody(containing("\"pio_appkey\":\"validkey\""))
               .withRequestBody(containing("\"pio_uid\":\"bar\"")));
    }

    @Test
    public void getUser() {
        try {
            User fooUser = client.getUser("baz");
            assertThat(fooUser.getUid(), is("baz"));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }
    }

    /**
    @Test
    public void deleteUser() {
        stubFor(delete(urlEqualTo("/users/beef.json"))
                .willReturn(aResponse().withStatus(200)));

        try {
            client.deleteUser("beef");
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            System.err.println("yo");
            System.err.println(e);
            fail(e.getMessage());
        }
    }
    */

    @Test
    public void createItem() {
        String url = "/items.json";
        stubFor(post(urlEqualTo(url))
                .willReturn(aResponse().withStatus(201)));

        try {
            client.createItem("foo", new String[]{"bar", "baz"});
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        verify(postRequestedFor(urlMatching(url))
               .withRequestBody(containing("\"pio_appkey\":\"validkey\""))
               .withRequestBody(containing("\"pio_iid\":\"foo\""))
               .withRequestBody(containing("\"pio_itypes\":\"bar,baz\"")));

        try {
            client.createItem(client.getCreateItemRequestBuilder("bar", new String[]{"dead", "beef"}));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        verify(postRequestedFor(urlMatching(url))
               .withRequestBody(containing("\"pio_appkey\":\"validkey\""))
               .withRequestBody(containing("\"pio_iid\":\"bar\""))
               .withRequestBody(containing("\"pio_itypes\":\"dead,beef\"")));
    }

    @Test
    public void getItem() {
        try {
            Item item = client.getItem("beef");
            assertThat(item.getIid(), is("beef"));
            assertThat(item.getItypes(), is(array(equalTo("foo"), equalTo("bar"))));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void getItemRecTopN() {
        try {
            client.identify("foo");
            String[] items = client.getItemRecTopN("greatengine", 5);
            assertThat(items.length, is(5));
            assertThat(items, is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
        } catch (UnidentifiedUserException e) {
            fail(e.getMessage());
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        try {
            String[] items = client.getItemRecTopN("greatengine", "foo", 5);
            assertThat(items.length, is(5));
            assertThat(items, is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        try {
            client.identify("foo");
            String[] items = client.getItemRecTopN(client.getItemRecGetTopNRequestBuilder("greatengine", 5));
            assertThat(items.length, is(5));
            assertThat(items, is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
        } catch (UnidentifiedUserException e) {
            fail(e.getMessage());
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        try {
            String[] items = client.getItemRecTopN(client.getItemRecGetTopNRequestBuilder("greatengine", "foo", 5));
            assertThat(items.length, is(5));
            assertThat(items, is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void getItemRecTopNWithAttributes() {
        try {
            client.identify("foo");
            Map<String, String[]> items = client.getItemRecTopNWithAttributes("greatengineattr", 5, new String[]{"cost", "price"});
            assertThat(items.size(), is(3));
            assertThat(items.get("pio_iids").length, is(5));
            assertThat(items.get("cost").length, is(5));
            assertThat(items.get("price").length, is(5));
            assertThat(items.get("pio_iids"), is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
            assertThat(items.get("cost"), is(array(equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"), equalTo("1"))));
            assertThat(items.get("price"), is(array(equalTo("6"), equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"))));
        } catch (UnidentifiedUserException e) {
            fail(e.getMessage());
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        try {
            Map<String, String[]> items = client.getItemRecTopNWithAttributes("greatengineattr", "foo", 5, new String[]{"cost", "price"});
            assertThat(items.size(), is(3));
            assertThat(items.get("pio_iids").length, is(5));
            assertThat(items.get("cost").length, is(5));
            assertThat(items.get("price").length, is(5));
            assertThat(items.get("pio_iids"), is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
            assertThat(items.get("cost"), is(array(equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"), equalTo("1"))));
            assertThat(items.get("price"), is(array(equalTo("6"), equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"))));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        try {
            Map<String, String[]> items = client.getItemRecTopNWithAttributes(client.getItemRecGetTopNRequestBuilder("greatengineattr", "foo", 5, new String[]{"cost", "price"}));
            assertThat(items.size(), is(3));
            assertThat(items.get("pio_iids").length, is(5));
            assertThat(items.get("cost").length, is(5));
            assertThat(items.get("price").length, is(5));
            assertThat(items.get("pio_iids"), is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
            assertThat(items.get("cost"), is(array(equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"), equalTo("1"))));
            assertThat(items.get("price"), is(array(equalTo("6"), equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"))));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void getItemSimTopN() {
        try {
            String[] items = client.getItemSimTopN("anothergreatengine", "foo", 5);
            assertThat(items.length, is(5));
            assertThat(items, is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        try {
            String[] items = client.getItemSimTopN(client.getItemSimGetTopNRequestBuilder("anothergreatengine", "foo", 5));
            assertThat(items.length, is(5));
            assertThat(items, is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void getItemSimTopNWithAttributes() {
        try {
            Map<String, String[]> items = client.getItemSimTopNWithAttributes("anothergreatengineattr", "foo", 5, new String[]{"cost", "price"});
            assertThat(items.size(), is(3));
            assertThat(items.get("pio_iids").length, is(5));
            assertThat(items.get("cost").length, is(5));
            assertThat(items.get("price").length, is(5));
            assertThat(items.get("pio_iids"), is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
            assertThat(items.get("cost"), is(array(equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"), equalTo("1"))));
            assertThat(items.get("price"), is(array(equalTo("6"), equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"))));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        try {
            Map<String, String[]> items = client.getItemSimTopNWithAttributes(client.getItemSimGetTopNRequestBuilder("anothergreatengineattr", "foo", 5, new String[]{"cost", "price"}));
            assertThat(items.size(), is(3));
            assertThat(items.get("pio_iids").length, is(5));
            assertThat(items.get("cost").length, is(5));
            assertThat(items.get("price").length, is(5));
            assertThat(items.get("pio_iids"), is(array(equalTo("baz"), equalTo("bar"), equalTo("foo"), equalTo("beef"), equalTo("dead"))));
            assertThat(items.get("cost"), is(array(equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"), equalTo("1"))));
            assertThat(items.get("price"), is(array(equalTo("6"), equalTo("5"), equalTo("4"), equalTo("3"), equalTo("2"))));
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void userActionItem() {
        String url = "/actions/u2i.json";
        stubFor(post(urlEqualTo(url))
                .willReturn(aResponse().withStatus(201)));

        try {
            client.identify("foo");
            client.userActionItem("view", "bar");
        } catch (UnidentifiedUserException e) {
            fail(e.getMessage());
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        verify(postRequestedFor(urlMatching(url))
               .withRequestBody(containing("\"pio_appkey\":\"validkey\""))
               .withRequestBody(containing("\"pio_uid\":\"foo\""))
               .withRequestBody(containing("\"pio_iid\":\"bar\""))
               .withRequestBody(containing("\"pio_action\":\"view\"")));

        try {
            client.userActionItem("foo", "view", "bar");
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        verify(postRequestedFor(urlMatching(url))
               .withRequestBody(containing("\"pio_appkey\":\"validkey\""))
               .withRequestBody(containing("\"pio_uid\":\"foo\""))
               .withRequestBody(containing("\"pio_iid\":\"bar\""))
               .withRequestBody(containing("\"pio_action\":\"view\"")));

        try {
            client.identify("foo");
            FutureAPIResponse r = client.userActionItemAsFuture("like", "bar");
            client.userActionItem(r);
        } catch (UnidentifiedUserException e) {
            fail(e.getMessage());
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        verify(postRequestedFor(urlMatching(url))
               .withRequestBody(containing("\"pio_appkey\":\"validkey\""))
               .withRequestBody(containing("\"pio_uid\":\"foo\""))
               .withRequestBody(containing("\"pio_iid\":\"bar\""))
               .withRequestBody(containing("\"pio_action\":\"like\"")));

        try {
            FutureAPIResponse r = client.userActionItemAsFuture("foo", "like", "bar");
            client.userActionItem(r);
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        verify(postRequestedFor(urlMatching(url))
               .withRequestBody(containing("\"pio_appkey\":\"validkey\""))
               .withRequestBody(containing("\"pio_uid\":\"foo\""))
               .withRequestBody(containing("\"pio_iid\":\"bar\""))
               .withRequestBody(containing("\"pio_action\":\"like\"")));

        try {
            UserActionItemRequestBuilder builder = client.getUserActionItemRequestBuilder("foo", "rate", "bar");
            builder.rate(4);
            client.userActionItem(builder);
        } catch (ExecutionException e) {
            fail(e.getMessage());
        } catch (InterruptedException e) {
            fail(e.getMessage());
        } catch (IOException e) {
            fail(e.getMessage());
        }

        verify(postRequestedFor(urlMatching(url))
               .withRequestBody(containing("\"pio_appkey\":\"validkey\""))
               .withRequestBody(containing("\"pio_uid\":\"foo\""))
               .withRequestBody(containing("\"pio_iid\":\"bar\""))
               .withRequestBody(containing("\"pio_action\":\"rate\""))
               .withRequestBody(containing("\"pio_rate\":\"4\"")));
    }

}
