# -*- coding: utf-8; -*-

from __future__ import unicode_literals, absolute_import

from unittest import TestCase

import sqlalchemy as sa

from rattail.autocomplete import products as mod
from rattail.config import make_config
from rattail.db import Session


class AutocompleterTestCase(TestCase):

    def setUp(self):
        self.config = self.make_config()
        self.autocompleter = self.make_autocompleter()

        self.engine = sa.create_engine('sqlite://')
        self.model = self.config.get_model()
        self.model.Base.metadata.create_all(bind=self.engine)
        self.session = Session(bind=self.engine)

    def tearDown(self):
        self.session.rollback()
        self.session.close()

    def make_config(self):
        return make_config([], extend=False)


class TestProductAutocompleter(AutocompleterTestCase):

    def make_autocompleter(self):
        return mod.ProductAutocompleter(self.config)

    def test_autocomplete(self):
        session = self.session
        model = self.model

        # first create a few products
        vinegar = model.Product(description='Apple Cider Vinegar')
        session.add(vinegar)
        dressing = model.Product(description='Apple Cider Dressing')
        session.add(dressing)
        oats = model.Product(description='Bulk Oats')
        session.add(oats)
        deleted = model.Product(description='More Oats', deleted=True)
        session.add(deleted)

        # searching for nothing yields no results
        result = self.autocompleter.autocomplete(session, '')
        self.assertEqual(len(result), 0)

        # search for 'apple' yields Vinegar, Dressing
        result = self.autocompleter.autocomplete(session, 'apple')
        self.assertEqual(len(result), 2)
        uuids = [info['value'] for info in result]
        self.assertIn(vinegar.uuid, uuids)
        self.assertIn(dressing.uuid, uuids)

        # search for 'oats' yields just the undeleted product
        result = self.autocompleter.autocomplete(session, 'oats')
        self.assertEqual(len(result), 1)
        self.assertEqual(result[0]['value'], oats.uuid)


class TestProductAllAutocompleter(AutocompleterTestCase):

    def make_autocompleter(self):
        return mod.ProductAllAutocompleter(self.config)

    def test_autocomplete(self):
        session = self.session
        model = self.model

        # first create a few products
        vinegar = model.Product(description='Apple Cider Vinegar')
        session.add(vinegar)
        dressing = model.Product(description='Apple Cider Dressing')
        session.add(dressing)
        oats = model.Product(description='Bulk Oats')
        session.add(oats)
        deleted = model.Product(description='More Oats', deleted=True)
        session.add(deleted)

        # searching for nothing yields no results
        result = self.autocompleter.autocomplete(session, '')
        self.assertEqual(len(result), 0)

        # search for 'apple' yields Vinegar, Dressing
        result = self.autocompleter.autocomplete(session, 'apple')
        self.assertEqual(len(result), 2)
        uuids = [info['value'] for info in result]
        self.assertIn(vinegar.uuid, uuids)
        self.assertIn(dressing.uuid, uuids)

        # search for 'oats' yields Bulk, More
        result = self.autocompleter.autocomplete(session, 'oats')
        self.assertEqual(len(result), 2)
        uuids = [info['value'] for info in result]
        self.assertIn(oats.uuid, uuids)
        self.assertIn(deleted.uuid, uuids)


class TestProductNewOrderAutocompleter(AutocompleterTestCase):

    def make_autocompleter(self):
        return mod.ProductNewOrderAutocompleter(self.config)

    def test_autocomplete(self):
        session = self.session
        model = self.model

        # first create a few products
        vinegar = model.Product(description='Apple Cider Vinegar',
                                upc='074305001321')
        session.add(vinegar)
        dressing = model.Product(description='Apple Cider Dressing')
        session.add(dressing)
        oats = model.Product(description='Bulk Oats')
        session.add(oats)
        deleted = model.Product(description='More Oats', deleted=True)
        session.add(deleted)

        # searching for nothing yields no results
        result = self.autocompleter.autocomplete(session, '')
        self.assertEqual(len(result), 0)

        # search for 'apple' yields Vinegar, Dressing
        result = self.autocompleter.autocomplete(session, 'apple')
        self.assertEqual(len(result), 2)
        uuids = [info['value'] for info in result]
        self.assertIn(vinegar.uuid, uuids)
        self.assertIn(dressing.uuid, uuids)

        # search for unknown upc yields no results
        result = self.autocompleter.autocomplete(session, '7430500116')
        self.assertEqual(len(result), 0)

        # search for known upc yields just that product
        result = self.autocompleter.autocomplete(session, '7430500132')
        self.assertEqual(len(result), 1)
        self.assertEqual(result[0]['value'], vinegar.uuid)
