from boards.abstracts.settingsmanager import get_settings_manager, \
    SETTING_USERNAME, SETTING_LAST_NOTIFICATION_ID, SETTING_IMAGE_VIEWER
from boards.models.user import Notification

__author__ = 'neko259'

from boards import settings, utils
from boards.models import Post, Tag

CONTEXT_SITE_NAME = 'site_name'
CONTEXT_VERSION = 'version'
CONTEXT_MODERATOR = 'moderator'
CONTEXT_THEME_CSS = 'theme_css'
CONTEXT_THEME = 'theme'
CONTEXT_PPD = 'posts_per_day'
CONTEXT_TAGS = 'tags'
CONTEXT_USER = 'user'
CONTEXT_NEW_NOTIFICATIONS_COUNT = 'new_notifications_count'
CONTEXT_USERNAME = 'username'
CONTEXT_TAGS_STR = 'tags_str'
CONTEXT_IMAGE_VIEWER = 'image_viewer'
CONTEXT_FAV_THREADS = 'fav_threads'


def get_notifications(context, request):
    settings_manager = get_settings_manager(request)
    username = settings_manager.get_setting(SETTING_USERNAME)
    new_notifications_count = 0
    if username is not None and len(username) > 0:
        last_notification_id = settings_manager.get_setting(
            SETTING_LAST_NOTIFICATION_ID)

        new_notifications_count = Notification.objects.get_notification_posts(
                username=username, last=last_notification_id).count()
    context[CONTEXT_NEW_NOTIFICATIONS_COUNT] = new_notifications_count
    context[CONTEXT_USERNAME] = username


def user_and_ui_processor(request):
    context = dict()

    context[CONTEXT_PPD] = float(Post.objects.get_posts_per_day())

    settings_manager = get_settings_manager(request)
    fav_tags = settings_manager.get_fav_tags()
    context[CONTEXT_TAGS] = fav_tags

    _get_fav_threads(context, settings_manager)

    context[CONTEXT_TAGS_STR] = Tag.objects.get_tag_url_list(fav_tags)
    theme = settings_manager.get_theme()
    context[CONTEXT_THEME] = theme
    context[CONTEXT_THEME_CSS] = 'css/' + theme + '/base_page.css'

    # This shows the moderator panel
    context[CONTEXT_MODERATOR] = utils.is_moderator(request)

    context[CONTEXT_VERSION] = settings.get('Version', 'Version')
    context[CONTEXT_SITE_NAME] = settings.get('Version', 'SiteName')

    context[CONTEXT_IMAGE_VIEWER] = settings_manager.get_setting(
        SETTING_IMAGE_VIEWER,
        default=settings.get('View', 'DefaultImageViewer'))

    get_notifications(context, request)

    return context


def _get_fav_threads(context, settings_manager):
    fav_threads_setting = settings_manager.get_fav_threads()
    if fav_threads_setting:
        fav_threads = Post.objects.filter(
            id__in=fav_threads_setting.keys()).only('url', 'id', 'thread')\
            .select_related('thread')

        context_thread_list = []
        for post in fav_threads:
            new_replies = post.get_thread().get_replies_newer(fav_threads_setting[str(post.id)])

            element = dict()
            element['post'] = post
            element['count'] = new_replies.count()
            if element['count'] > 0:
                element['new_post'] = new_replies.first().get_absolute_url()
            context_thread_list.append(element)
        context[CONTEXT_FAV_THREADS] = context_thread_list