package com.mobify.astro.plugins;

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.design.widget.TabLayout;

import com.mobify.astro.ActivityTestBase;
import com.mobify.astro.PluginResolver;
import com.mobify.astro.messaging.EventManager;
import com.mobify.astro.messaging.MessageSender;
import com.mobify.astro.messaging.RpcResponse;

import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;

public class SegmentedPluginTest extends ActivityTestBase {

    private SegmentedPlugin segmentedPlugin;
    private MessageSender spyMessageSender;

    @Before
    public void setup() {
        PluginResolver mockPluginResolver = mock(PluginResolver.class);
        EventManager eventManager = mock(EventManager.class);
        spyMessageSender = spy(new MessageSender(eventManager));
        segmentedPlugin = new SegmentedPlugin(getActivity(), mockPluginResolver, eventManager, spyMessageSender);
    }

    private TabLayout getLayoutView() {
        return (TabLayout) segmentedPlugin.getView();
    }

    private JSONArray createTestItems() throws Exception {
        JSONArray items = new JSONArray();
        JSONObject item = new JSONObject("{ key: 'one', text: 'Tab 1' }");
        items.put(item);
        item = new JSONObject("{ key: 'two', text: 'Tab 2' }");
        items.put(item);
        item = new JSONObject("{ key: 'three', text: 'Tab 3' }");
        items.put(item);

        return items;
    }

    @Test
    public void testGetView() {
        assertNotNull(getLayoutView());
    }

    @Test
    public void testSetItems() throws Exception {
        JSONArray items = createTestItems();
        segmentedPlugin.setItems(items);
        assertEquals(getLayoutView().getTabCount(), items.length());

        TabLayout.Tab tab = getLayoutView().getTabAt(0);
        String text = ((JSONObject) items.get(0)).getString("text");
        String key = ((JSONObject) items.get(0)).getString("key");
        assertEquals(tab.getText(), text);
        assertEquals(tab.getTag(), key);
    }

    @Test
    public void testSetItemsAgain() throws Exception {
        JSONArray items = createTestItems();
        segmentedPlugin.setItems(items);
        // Add one more item
        JSONObject item = new JSONObject("{ key: 'four', text: 'Tab 4' }");
        items.put(item);
        // Setting items again should replace previous items
        segmentedPlugin.setItems(items);
        assertEquals(getLayoutView().getTabCount(), items.length());
    }

    @Test
    public void testSetColor() {
        String blue = "#0000FF";
        segmentedPlugin.setColor(blue);
        int[] stateList = {android.R.attr.state_selected};
        int selected = getLayoutView().getTabTextColors().getColorForState(stateList, 0xFF666666);
        assertEquals(selected, Color.parseColor(blue));
    }

    @Test
    public void testSetInactiveColor() {
        String blue = "#0000FF";
        segmentedPlugin.setInactiveColor(blue);
        int[] stateList = {android.R.attr.state_empty};
        int normal = getLayoutView().getTabTextColors().getColorForState(stateList, 0xFF666666);
        assertEquals(normal, Color.parseColor(blue));
    }

    @Test
    public void testSetBackgroundColor() {
        String blue = "#0000FF";
        segmentedPlugin.setBackgroundColor(blue);
        assertEquals(((ColorDrawable) getLayoutView().getBackground()).getColor(), Color.parseColor(blue));
    }

    @Test
    public void testSelectItem() throws Exception {
        JSONArray items = createTestItems();
        segmentedPlugin.setItems(items);
        String key = ((JSONObject) items.get(2)).getString("key");
        segmentedPlugin.selectItem(key);
        assertEquals(getLayoutView().getSelectedTabPosition(), 2);
    }

    @Test
    public void testGetSelectedItem() throws Exception {
        JSONArray items = createTestItems();
        segmentedPlugin.setItems(items);
        String key = ((JSONObject) items.get(2)).getString("key");
        segmentedPlugin.selectItem(key);

        RpcResponse response = mock(RpcResponse.class);
        segmentedPlugin.getSelectedItem(response);
        verify(spyMessageSender, timeout(1000)).sendRpcResponseWithResult(response, key);
    }

    @Test
    public void testSubscribedToLocaleUpdates() {
        verify(segmentedPlugin.localizationUtilities).addLocaleChangedListener(segmentedPlugin);
    }
}