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

from unittest import TestCase
from unittest.mock import MagicMock

import fanstatic
from pyramid import testing

from wuttjamaican.conf import WuttaConfig
from wuttjamaican.testing import FileConfigTestCase
from wuttaweb import subscribers
from wuttaweb.menus import MenuHandler


class DataTestCase(FileConfigTestCase):
    """
    Base class for test suites requiring a full (typical) database.
    """

    def setUp(self):
        self.setup_db()

    def setup_db(self):
        self.setup_files()
        self.config = WuttaConfig(defaults={
            'wutta.db.default.url': 'sqlite://',
        })
        self.app = self.config.get_app()

        # init db
        model = self.app.model
        model.Base.metadata.create_all(bind=self.config.appdb_engine)
        self.session = self.app.make_session()

    def tearDown(self):
        self.teardown_db()

    def teardown_db(self):
        self.teardown_files()


class WebTestCase(DataTestCase):
    """
    Base class for test suites requiring a full (typical) web app.
    """

    def setUp(self):
        self.setup_web()

    def setup_web(self):
        self.setup_db()
        self.request = self.make_request()
        self.pyramid_config = testing.setUp(request=self.request, settings={
            'wutta_config': self.config,
            'mako.directories': ['wuttaweb:templates'],
            'pyramid_deform.template_search_path': 'wuttaweb:templates/deform',
        })

        # init web
        self.pyramid_config.include('pyramid_deform')
        self.pyramid_config.include('pyramid_mako')
        self.pyramid_config.add_directive('add_wutta_permission_group',
                                          'wuttaweb.auth.add_permission_group')
        self.pyramid_config.add_directive('add_wutta_permission',
                                          'wuttaweb.auth.add_permission')
        self.pyramid_config.add_subscriber('wuttaweb.subscribers.before_render',
                                           'pyramid.events.BeforeRender')
        self.pyramid_config.include('wuttaweb.static')

        # nb. mock out fanstatic env..good enough for now to avoid errors..
        needed = fanstatic.init_needed()
        self.request.environ[fanstatic.NEEDED] = needed

        # setup new request w/ anonymous user
        event = MagicMock(request=self.request)
        subscribers.new_request(event)
        def user_getter(request, **kwargs): pass
        subscribers.new_request_set_user(event, db_session=self.session,
                                         user_getter=user_getter)

    def tearDown(self):
        self.teardown_web()

    def teardown_web(self):
        testing.tearDown()
        self.teardown_db()

    def make_request(self):
        return testing.DummyRequest()


class NullMenuHandler(MenuHandler):
    """
    Dummy menu handler for testing.
    """
    def make_menus(self, request, **kwargs):
        return []
