/*
 * Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
 *
 * This file is part of Loop Habit Tracker.
 *
 * Loop Habit Tracker is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or (at your
 * option) any later version.
 *
 * Loop Habit Tracker is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package org.isoron.uhabits.activities.habits.list;

import android.view.*;

import org.isoron.androidbase.activities.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.habits.list.model.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.preferences.*;
import org.junit.*;
import org.mockito.*;

import static junit.framework.Assert.*;
import static org.mockito.Mockito.*;

public class ListHabitsMenuTest extends BaseUnitTest
{
    private BaseActivity activity;

    private ListHabitsScreen screen;

    private HabitCardListAdapter adapter;

    private Preferences preferences;

    private ThemeSwitcher themeSwitcher;

    private ListHabitsMenu menu;

    private ArgumentCaptor<HabitMatcher> matcherCaptor;

    @Override
    public void setUp()
    {
        super.setUp();

        activity = mock(BaseActivity.class);
        screen = mock(ListHabitsScreen.class);
        adapter = mock(HabitCardListAdapter.class);
        preferences = mock(Preferences.class);
        themeSwitcher = mock(ThemeSwitcher.class);

        when(preferences.getShowArchived()).thenReturn(false);
        when(preferences.getShowCompleted()).thenReturn(false);
        when(themeSwitcher.isNightMode()).thenReturn(false);

        menu = new ListHabitsMenu(activity, screen, adapter, preferences,
            themeSwitcher);

        matcherCaptor = ArgumentCaptor.forClass(HabitMatcher.class);

        reset(adapter);
    }

    @Test
    public void testOnCreate()
    {
        MenuItem nightModeItem = mock(MenuItem.class);
        MenuItem hideArchivedItem = mock(MenuItem.class);
        MenuItem hideCompletedItem = mock(MenuItem.class);
        Menu androidMenu = mock(Menu.class);
        when(androidMenu.findItem(R.id.actionToggleNightMode)).thenReturn(
            nightModeItem);
        when(androidMenu.findItem(R.id.actionHideArchived)).thenReturn(
            hideArchivedItem);
        when(androidMenu.findItem(R.id.actionHideCompleted)).thenReturn(
            hideCompletedItem);

        menu.onCreate(androidMenu);
        verify(nightModeItem).setChecked(false);
        verify(hideArchivedItem).setChecked(true);
        verify(hideCompletedItem).setChecked(true);
        reset(nightModeItem, hideArchivedItem, hideCompletedItem);

        when(themeSwitcher.isNightMode()).thenReturn(true);
        menu.onCreate(androidMenu);
        verify(nightModeItem).setChecked(true);
    }

    @Test
    public void testOnSelected_about()
    {
        onItemSelected(R.id.actionAbout);
        verify(screen).showAboutScreen();
    }

    @Test
    public void testOnSelected_add()
    {
        onItemSelected(R.id.actionAdd);
        verify(screen).showCreateHabitScreen();
    }

    @Test
    public void testOnSelected_faq()
    {
        onItemSelected(R.id.actionFAQ);
        verify(screen).showFAQScreen();
    }

    @Test
    public void testOnSelected_nightMode()
    {
        onItemSelected(R.id.actionToggleNightMode);
        verify(screen).toggleNightMode();
    }

    @Test
    public void testOnSelected_settings()
    {
        onItemSelected(R.id.actionSettings);
        verify(screen).showSettingsScreen();
    }

    @Test
    public void testOnSelected_showArchived()
    {
        onItemSelected(R.id.actionHideArchived);
        verify(preferences).setShowArchived(true);
        verify(adapter).setFilter(matcherCaptor.capture());
        verify(adapter).refresh();
        assertTrue(matcherCaptor.getValue().isArchivedAllowed());
        reset(adapter);

        onItemSelected(R.id.actionHideArchived);
        verify(preferences).setShowArchived(false);
        verify(adapter).setFilter(matcherCaptor.capture());
        verify(adapter).refresh();
        assertFalse(matcherCaptor.getValue().isArchivedAllowed());
    }

    @Test
    public void testOnSelected_showCompleted()
    {
        onItemSelected(R.id.actionHideCompleted);
        verify(preferences).setShowCompleted(true);
        verify(adapter).setFilter(matcherCaptor.capture());
        verify(adapter).refresh();
        assertTrue(matcherCaptor.getValue().isCompletedAllowed());
        reset(adapter);

        onItemSelected(R.id.actionHideCompleted);
        verify(preferences).setShowCompleted(false);
        verify(adapter).setFilter(matcherCaptor.capture());
        verify(adapter).refresh();
        assertFalse(matcherCaptor.getValue().isCompletedAllowed());
    }

    protected void onItemSelected(int actionId)
    {
        MenuItem item = mock(MenuItem.class);
        when(item.getItemId()).thenReturn(actionId);
        menu.onItemSelected(item);
    }
}