from __future__ import unicode_literals, absolute_import
import pytest

from django.core.urlresolvers import reverse
from django.test import RequestFactory
from taxonomies.tests.factories import TermFactory, TaxonomyFactory

import transport
from .views_tests import fix_messages
from hid.tabs.view_and_edit_table import _add_items_categories


ReqFactory = RequestFactory()


@pytest.fixture
def term():
    # TODO rewrite using transport.terms, etc.
    taxonomy = TaxonomyFactory(name="Test Ebola Questions")
    return TermFactory(taxonomy=taxonomy, name="Vaccine")


@pytest.fixture
def terms():
    # TODO rewrite using transport.terms, etc.
    taxonomy = TaxonomyFactory(name="Test Ebola Questions")
    return [
        TermFactory(taxonomy=taxonomy, name="Vacciene"),
        TermFactory(taxonomy=taxonomy, name="Origin")
    ]


@pytest.fixture
def items():
    return [
        transport.items.create({'body': 'test message one'}),
        transport.items.create({'body': 'test message two'})
    ]


@pytest.fixture
def item():
    return transport.items.create({'body': 'test message one'})


@pytest.mark.django_db
def test_add_categories_adds_term_to_item(term, item):
    category_list = [(item['id'], term.taxonomy.slug, term.name), ]

    url = reverse('data-view-process')
    request = ReqFactory.post(url, {'a': 'b'})
    request = fix_messages(request)
    _add_items_categories(request, category_list)

    [item_data] = transport.items.list()
    [term_data] = item_data['terms']
    assert term_data['name'] == term.name
    assert term_data['taxonomy'] == term.taxonomy.slug


@pytest.mark.django_db
def test_add_items_categories_adds_term_to_items(terms, items):
    url = reverse('data-view-process')
    request = ReqFactory.post(url, {'a': 'b'})
    request = fix_messages(request)

    expected = {
        items[0]['id']: terms[0],
        items[1]['id']: terms[1]
    }

    category_map = [
        (item_id, term.taxonomy.slug, term.name)
        for item_id, term in expected.items()
    ]
    _add_items_categories(request, category_map)

    fetched_items = transport.items.list()
    found = 0
    for item in fetched_items:
        if item['id'] in expected:
            found += 1
            assert len(item['terms']) == 1
            [term_data] = item['terms']
            assert term_data['name'] == expected[item['id']].name
            assert term_data['taxonomy'] == expected[item['id']].taxonomy.slug

    assert found == 2


@pytest.mark.django_db
def test_add_items_categories_removes_term_from_item(term, item):
    transport.items.add_terms(item['id'], term.taxonomy.slug, term.name)

    category_list = [(item['id'], term.taxonomy.slug, ''), ]

    url = reverse('data-view-process')
    request = ReqFactory.post(url, {'a': 'b'})
    request = fix_messages(request)
    _add_items_categories(request, category_list)

    [item_data] = transport.items.list()
    assert len(item_data['terms']) == 0