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

import logging

from django.contrib import auth
from rest_framework.views import APIView

from api.utils.auth.util import AuthInfo
from api.utils.serializer import UserInfoSerializer
from api.utils.utils import set_user_token
from common.core.auth import ExpiringTokenAuthentication
from common.core.response import ApiResponse
from common.core.sysconfig import Config
from common.core.throttle import VisitRegister1Throttle, VisitRegister2Throttle
from common.utils.caches import login_auth_failed

logger = logging.getLogger(__name__)


class LoginView(APIView):
    throttle_classes = [VisitRegister1Throttle, VisitRegister2Throttle]

    def post(self, request):
        receive = request.data
        username = receive.get("username", None)
        code = 1000
        msg = 'success'
        data = None
        # if Config.LOGIN.get("captcha"):
        #     is_valid = valid_captcha(receive.get("captcha_key", None), receive.get("verify_code", None), username)
        # else:
        #     is_valid = True
        if True:
            if login_auth_failed("get", username):
                password = receive.get("password")
                user = auth.authenticate(username=username, password=password)
                logger.info(f"username:{username}  password:{password}")
                if user:
                    if user.is_active:
                        if user.role == 3:
                            login_auth_failed("del", username)
                            key, user_info = set_user_token(user, request)
                            data = {
                                "username": user_info.username,
                                "token": key
                            }
                        else:
                            msg = "权限拒绝"
                            code = 1003
                    else:
                        msg = "用户被禁用"
                        code = 1005
                else:
                    login_auth_failed("set", username)
                    msg = "密码或者账户有误"
                    code = 1002
            else:
                code = 1006
                logger.error(f"username:{username} failed too try , locked")
                msg = "用户登录失败次数过多，已被锁定，请1小时之后再次尝试"
        else:
            code = 1001
            msg = "验证码有误"

        return ApiResponse(code=code, msg=msg, data=data)

    def get(self, request):
        auth_obj = AuthInfo(Config.LOGIN.get("captcha"), False)
        data = auth_obj.make_rules_info()
        return ApiResponse(data=data)


class LoginUserView(APIView):
    throttle_classes = [VisitRegister1Throttle, VisitRegister2Throttle]
    authentication_classes = [ExpiringTokenAuthentication, ]

    def get(self, request):
        serializer = UserInfoSerializer(request.user, )
        return ApiResponse(data=serializer.data)
