#!/usr/bin/env python
# -*- coding:utf-8 -*-
# project: 11月 
# author: NinEveN
# date: 2021/11/4
import logging

from rest_framework.response import Response
from rest_framework.views import APIView

from api.models import Apps, AppReportInfo
from api.utils.auth.util import AuthInfo
from api.utils.modelutils import add_remote_info_from_request
from api.utils.response import BaseResponse
from api.utils.serializer import AppReportSerializer
from common.base.baseutils import get_real_ip_address, get_choices_dict
from common.core.sysconfig import Config
from common.core.throttle import InstallThrottle2
from common.utils.caches import login_auth_failed
from common.utils.sendmsg import is_valid_sender_code

logger = logging.getLogger(__name__)


class ReportView(APIView):
    throttle_classes = [InstallThrottle2]

    def get(self, request):
        response = BaseResponse()
        response.data = {}
        allow_f = Config.REPORT.get("enable")
        if allow_f:
            auth_obj = AuthInfo(Config.REPORT.get("captcha"), Config.REPORT.get("geetest"))
            response.data['auth_rules'] = auth_obj.make_rules_info()
            response.data['report_type'] = Config.REPORT.get("report_type")
            response.data['s_list'] = get_choices_dict(AppReportInfo.report_type_choices)
        response.data['enable'] = allow_f
        return Response(response.dict)

    def post(self, request):
        res = BaseResponse()
        data = request.data
        msg = f"add new app report data:{data}"
        logger.info(msg)
        email = data.get('email', '')
        is_valid, target = is_valid_sender_code(data.get('act'), data.get("auth_token", None),
                                                data.get("seicode", None), True)
        if is_valid and str(target) == str(email):
            if login_auth_failed("get", email):
                add_remote_info_from_request(request, msg)
                if data.get('app_id'):
                    app_obj = Apps.objects.filter(app_id=data.get('app_id')).first()
                    ext_info = {
                        'app_name': app_obj.name,
                        'bundle_id': app_obj.bundle_id,
                        'remote_addr': get_real_ip_address(request),
                        'app_id': app_obj.pk
                    }
                    data.update(ext_info)
                    serializer = AppReportSerializer(data=data, context={'user_obj': request.user})
                    if serializer.is_valid():
                        serializer.save()
                    else:
                        logger.info(f"add new app report failed")
                        res.msg = serializer.errors
                        res.code = 1005
            else:
                res.code = 1006
                logger.error(f"email:{email} failed too try , locked")
                res.msg = "失败次数过多，已被锁定，请1小时之后再次尝试"
        else:
            res.code = 1001
            res.msg = "验证码有误或失效"

        return Response(res.dict)
