from __future__ import unicode_literals

from misago.conf import db_settings
from misago.conf.models import Setting

from . import fetch_assoc


def copy_value(setting):
    def closure(old_value):
        setting_obj = Setting.objects.get(setting=setting)
        setting_obj.value = old_value
        setting_obj.save()
        return setting_obj

    return closure


def map_value(setting, translation):
    def closure(old_value):
        setting_obj = Setting.objects.get(setting=setting)
        setting_obj.value = translation[old_value]
        setting_obj.save()
        return setting_obj

    return closure


def convert_allow_custom_avatars(old_value):
    setting_obj = Setting.objects.get(setting='allow_custom_avatars')
    setting_obj.value = 'upload' in old_value.split(',')
    setting_obj.save()
    return setting_obj


SETTING_CONVERTER = {
    'board_name':
        copy_value('forum_name'),
    'board_index_title':
        copy_value('forum_index_title'),
    'board_index_meta':
        copy_value('forum_index_meta_description'),
    'board_header':
        copy_value('forum_branding_text'),
    'email_footnote_plain':
        copy_value('email_footer'),
    'tos_title':
        copy_value('terms_of_service_title'),
    'tos_url':
        copy_value('terms_of_service_link'),
    'tos_content':
        copy_value('terms_of_service'),
    'board_credits':
        copy_value('forum_footnote'),
    'thread_name_min':
        copy_value('thread_title_length_min'),
    'thread_name_max':
        copy_value('thread_title_length_max'),
    'post_length_min':
        copy_value('post_length_min'),
    'account_activation':
        map_value(
            'account_activation', {
                'none': 'none',
                'user': 'user',
                'admin': 'admin',
                'block': 'closed',
            }
        ),
    'username_length_min':
        copy_value('username_length_min'),
    'username_length_max':
        copy_value('username_length_max'),
    'password_length':
        copy_value('password_length_min'),
    'avatars_types':
        convert_allow_custom_avatars,
    'default_avatar':
        copy_value('default_avatar'),
    'upload_limit':
        copy_value('avatar_upload_limit'),
    'subscribe_start':
        map_value('subscribe_start', {
            '0': 'no',
            '1': 'watch',
            '2': 'watch_email',
        }),
    'subscribe_reply':
        map_value('subscribe_reply', {
            '0': 'no',
            '1': 'watch',
            '2': 'watch_email',
        }),
    'bots_registration':
        map_value('captcha_type', {
            'no': 'no',
            'recaptcha': 're',
            'qa': 'qa',
        }),
    'recaptcha_public':
        copy_value('recaptcha_site_key'),
    'recaptcha_private':
        copy_value('recaptcha_secret_key'),
    'qa_test':
        copy_value('qa_question'),
    'qa_test_help':
        copy_value('qa_help_text'),
    'qa_test_answers':
        copy_value('qa_answers'),
}


def move_settings(stdout=None):
    for row in fetch_assoc('SELECT * FROM misago_setting'):
        setting_key = row['setting']
        if setting_key in SETTING_CONVERTER:
            convert_setting = SETTING_CONVERTER[setting_key]
            setting_obj = convert_setting(row['value'])
            stdout.write(setting_obj.name)
    db_settings.flush_cache()
