package com.mobify.astro.plugins;

import android.support.v4.widget.DrawerLayout;
import android.view.Gravity;

import com.mobify.astro.ActivityTestBase;
import com.mobify.astro.AstroPlugin;
import com.mobify.astro.PluginResolver;
import com.mobify.astro.TestPlugin;
import com.mobify.astro.messaging.EventManager;
import com.mobify.astro.messaging.MessageSender;

import org.junit.Before;
import org.junit.Test;

import java.util.Locale;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class DrawerPluginTest extends ActivityTestBase {

    PluginResolver mockPluginResolver;
    private DrawerPlugin drawerPlugin;
    private AstroPlugin plugin;

    @Before
    public void setUp() throws Throwable {
        getActivity().getLocalizationUtilities().setLocale(Locale.US);

        mockPluginResolver = mock(PluginResolver.class);
        EventManager mockEventManager = mock(EventManager.class);
        MessageSender mockMessageSender = mock(MessageSender.class);

        plugin = new TestPlugin(getActivity(), mockPluginResolver, mockEventManager, mockMessageSender);
        when(mockPluginResolver.instanceForAddress(plugin.getInstanceAddress())).thenReturn(plugin);

        drawerPlugin = new DrawerPlugin(getActivity(), mockPluginResolver, mockEventManager, mockMessageSender);
    }

    @Test
    public void testSetLeftMenu() throws Exception {
        drawerPlugin.setLeftMenu(plugin.getInstanceAddress());
        assertSame(drawerPlugin.getLeftView(), plugin.getView());
    }

    @Test
    public void testShowLeftDrawer() {
        drawerPlugin.setLeftMenu(plugin.getInstanceAddress());
        drawerPlugin.showLeftMenu();

        boolean menuShowing = drawerPlugin.drawerLayout.isDrawerOpen(Gravity.LEFT);
        assertTrue(menuShowing);
    }

    @Test
    public void testHideLeftDrawer() {
        drawerPlugin.setLeftMenu(plugin.getInstanceAddress());
        drawerPlugin.hideLeftMenu();

        boolean menuShowing = drawerPlugin.drawerLayout.isDrawerOpen(Gravity.LEFT);
        assertFalse(menuShowing);
    }

    @Test
    public void testIsLeftMenuShowing() {
        drawerPlugin.setLeftMenu(plugin.getInstanceAddress());
        drawerPlugin.hideLeftMenu();

        assertFalse(drawerPlugin.isLeftMenuShowing());
    }

    @Test
    public void testSetRightMenu() throws Exception {
        drawerPlugin.setRightMenu(plugin.getInstanceAddress());
        assertSame(drawerPlugin.getRightView(), plugin.getView());
    }

    @Test
    public void testShowRightDrawer() throws Exception {
        drawerPlugin.setRightMenu(plugin.getInstanceAddress());
        drawerPlugin.showRightMenu();

        boolean menuShowing = drawerPlugin.drawerLayout.isDrawerOpen(Gravity.RIGHT);
        assertTrue(menuShowing);
    }

    @Test
    public void testHideRightDrawer() {
        drawerPlugin.setRightMenu(plugin.getInstanceAddress());
        drawerPlugin.hideRightMenu();

        boolean menuShowing = drawerPlugin.drawerLayout.isDrawerOpen(Gravity.RIGHT);
        assertFalse(menuShowing);
    }

    @Test
    public void testLockUnlockRightDrawer() {
        drawerPlugin.setRightMenu(plugin.getInstanceAddress());

        // lock right drawer closed
        drawerPlugin.lockRightMenuClosed();

        assertFalse(drawerPlugin.isRightMenuShowing());
        assertEquals(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
                drawerPlugin.drawerLayout.getDrawerLockMode(Gravity.RIGHT));

        // unlock the right drawer

        drawerPlugin.unlockRightMenu();

        // unlock the drawer and it still shouldn't be showing
        assertFalse(drawerPlugin.isRightMenuShowing());
        assertEquals(DrawerLayout.LOCK_MODE_UNLOCKED,
                drawerPlugin.drawerLayout.getDrawerLockMode(Gravity.RIGHT));
    }

    @Test
    public void testLockUnlockLeftDrawer() {
        drawerPlugin.setLeftMenu(plugin.getInstanceAddress());

        // lock left drawer closed
        drawerPlugin.lockLeftMenuClosed();

        assertFalse(drawerPlugin.isLeftMenuShowing());
        assertEquals(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
                drawerPlugin.drawerLayout.getDrawerLockMode(Gravity.LEFT));

        // unlock the left drawer

        drawerPlugin.unlockLeftMenu();

        // unlock the drawer and it still shouldn't be showing
        assertFalse(drawerPlugin.isLeftMenuShowing());
        assertEquals(DrawerLayout.LOCK_MODE_UNLOCKED,
                drawerPlugin.drawerLayout.getDrawerLockMode(Gravity.LEFT));
    }

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