from gm_rpcd.all import bind
from talos.rpc import bind_context
from django.conf import settings
from gm_types.gaia import USER_RIGHTS_LEVEL
from gm_types.user_hierarchy import EventType, FEEDBACK
from gm_types.gaia import INDEX_CARD_TYPE

from .models import UserGrowthValue, GrowthTask, UserFeedback
from .manager.event_dispatcher import EventDispatcher
from .tool.user_task_center import TaskCenter
from utils.rpc import gen
from gm_types.error import ERROR as CODES
from talos.services import get_user_from_context


dispatcher = EventDispatcher()


@bind('mimas/user/push_event')
def push_event(event_type, trigger_time, user_id, item_id, pre_payment=None):
    """push event to calc user growth value.

    .. http:POST:: mimas/user/push_event

    :param EventType event_type:
    :param int trigger_time:
    :param user_id:
    :param item_id: diary_id or order id etc
    :param pre_payment: if event type is EventType.BUYSERVICE, this is order's payment value.

    :return: growth value added
    """
    event_handler = dispatcher.dispatch(event_type, trigger_time, user_id, item_id, pre_payment)
    value = event_handler.process()
    return value


@bind('mimas/user/get_growth')
def get_user_growth(user_id):
    """通过user_id获取用户成长值.

    .. http:POST:: /mimas/user/get_growth

    :param user_id:

    **Example response**:

    .. sourcecode:: response

        {
            'value': int,
            'next_level_level': int,
            'level': USER_RIGHTS_LEVEL,
            'tasks': {
                'title':,
                'content':,
                'result':,
                'status':,
            },
        }

    """
    tasks = GrowthTask.get_user_today_status(user_id)
    try:
        growth = UserGrowthValue.objects.get(user_id=user_id)
        value = growth.value
        next_level_value = growth.next_level_value

        return {
            'value': value,
            'next_level_value': next_level_value,
            'level': growth.level,
            'tasks': tasks,
        }
    except UserGrowthValue.DoesNotExist:
        return {
            'value': 0,
            'next_level_value': settings.LEVEL_START_VALUE[USER_RIGHTS_LEVEL.V2],
            'level': USER_RIGHTS_LEVEL.V1,
            'tasks': tasks,
        }


@bind('mimas/user/get_daily_task')
def get_user_task_status(user_id):
    '''获取用户每日任务 7.6.20'''
    task_manager = TaskCenter(user_id)
    daily_data = task_manager.get_daily_task()
    try:
        growth = UserGrowthValue.objects.get(user_id=user_id)
        value = growth.value
        next_level_value = growth.next_level_value

        return {
            'level': growth.level,
            'level_score': value,  # 当前等级分值
            'level_total': settings.LEVEL_START_VALUE[growth.next_level],  # 该等级的总分
            'need_score': next_level_value,  # 到下一级的差值
            'next_level': growth.next_level,  # 到下一级的差值
            'upper_level_point': settings.LEVEL_UPPER_GAIN_POINTS,  # 升下一级所加的美分
            'uni_task': daily_data['uni_task'],  # 每日任务
            'multi_task': daily_data['multi_task'],  # 成长任务
        }

    except UserGrowthValue.DoesNotExist:
        return {
            'level': USER_RIGHTS_LEVEL.V1,
            'level_score': 0,  # 当前等级分值
            'level_total': settings.LEVEL_START_VALUE[USER_RIGHTS_LEVEL.V1],  # 该等级的总分
            'need_score': settings.LEVEL_START_VALUE[USER_RIGHTS_LEVEL.V2] - settings.LEVEL_START_VALUE[USER_RIGHTS_LEVEL.V1],  # 到下一级的差值
            'next_level': USER_RIGHTS_LEVEL.V2,
            'upper_level_point': settings.LEVEL_UPPER_GAIN_POINTS,  # 升下一级所加的美分
            'uni_task': daily_data['uni_task'],  # 每日任务
            'multi_task': daily_data['multi_task'],  # 成长任务
        }

@bind_context('mimas/user/process_event_task')
def process_task(ctx, event_type, user_id, related_item=None, version='7.6.19', only_record_event=False):
    try:
        from gm_rpcd.internals.proxy_object import unproxy
        client_info = unproxy(ctx)._Context__request.client_info  # 慎用
        version = client_info.get('cl_ver')
        session_key = unproxy(ctx)._Context__request.session_id
    except:
        version = version  # 7.6.20 以下皆可
        session_key = ''

    if not user_id or not event_type:
        return gen(CODES.PARAMS_INCOMPLETE)
    task_manager = TaskCenter(user_id, event_type, related_item, session_key)
    re_data = task_manager.get_reveal_data(only_record_event=only_record_event)
    if re_data['growth_value'] or re_data['point_value']:
        task_manager.add_work(version)

    return re_data


@bind_context('mimas/card/feedback')
def user_feedback(ctx, element_type, element_id, device_id, feedback_types):

    defaults = {}
    user = get_user_from_context(ctx)
    if user.id:
        defaults["user_id"] = user.id
    else:
        defaults["user_id"] = 0

    if not device_id and not user:
        return

    for item in feedback_types:
        if item not in FEEDBACK:
            continue

        UserFeedback.objects.get_or_create(
            element_type=element_type,
            element_id=element_id,
            device_id=device_id,
            feedback_type=item,
            defaults=defaults,
        )