import datetime
import logging

from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import permission_classes as single_permission
from rest_framework.permissions import IsAuthenticated

from app.pagination import MyPageNumberPagination
from app.serializers import AuthUserSerializer
from app.models import AuthUser, EnterpriseModel
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

logger = logging.getLogger('mylogger')


class UserViewSet(ModelViewSet):
    serializer_class = AuthUserSerializer
    pagination_class = MyPageNumberPagination

    authentication_classes = []
    permission_classes = []

    @staticmethod
    def login(request, *args, **kwargs):
        """登录 POST"""
        data = request.data
        username = data.get('username')
        password = data.get('password')

        # 验证是否过期
        enterprise_obj = EnterpriseModel.objects.filter(account=username, pwd=password).last()
        if not enterprise_obj:
            response = {
                'success': False,
                'msg': "该账号不存在",
                'data': {
                    'username': None,
                    'roles': [],
                    'token': None,
                    'expires': None
                }
            }
            return Response(response)

        else:
            flag = datetime.date.today() < enterprise_obj.end_valid_date
            if not flag:
                response = {
                    'success': False,
                    'msg': f"该账号已过期,有效时间为{enterprise_obj.start_valid_date}至{enterprise_obj.end_valid_date}",
                    'data': {
                        'username': None,
                        'roles': [],
                        'token': None,
                        'expires': None
                    }
                }
                return Response(response)

        serializer = TokenObtainPairSerializer(data=request.data)

        try:
            serializer.is_valid(raise_exception=True)
        except Exception as e:
            response = {
                    'success': False,
                    'msg': str(e),
                    'data': {
                        'username': None,
                        'roles': [],
                        'token': None,
                        'expires': None
                    }
                }
            return Response(response)

        response = {
            'success': True,
            'msg': '登录成功',
            'data': {
                'username': username,
                'roles': ['admin'],
                'accessToken': serializer.validated_data.get("access"),
                'refreshToken': serializer.validated_data.get("refresh"),
            }
        }
        return Response(response)

    @staticmethod
    def get_user_info(request, *args, **kwargs):
        return Response({
            "code": 0,
            "success": True,
            "data": {
                "userInfo": {
                    "id": 1,
                    "createTime": "2023-10-08T08:02:30.775742Z",
                    "updateTime": "2024-01-23T08:51:08.648364Z",
                    "userName": "admin",
                    "nickName": "管理员",
                    "phone": "",
                    "email": "",
                    "avatarId": 1,
                    "roleId": 1,
                    "postId": None,
                    "deptId": None,
                    "roleIds": "1",
                    "postIds": "",
                    "remark": "",
                    "enable": None,
                    "lastLoginTime": "2024-01-23T08:51:08.558393Z",
                    "roles": [
                        {
                            "label": "管理员",
                            "value": 1
                        }
                    ],
                    "avatarUrl": "uploads/image/user/avatar/39c63ddb96a31b9610cd976b896ad4f0_20231016113731.jpg"
                }
            },
            "msg": "获取成功"
        })

    @single_permission([IsAuthenticated])
    def create(self, request, *args, **kwargs):
        """注册 POST  用户名 手机号 状态 性别 部门"""
        data = request.data
        username = data.get('username')
        if not username:
            return Response({'msg': '用户名不能为空'})
        user_id = data.pop("id", None)
        password = data.pop('password', None)
        note = data.get("note", None)

        # 新增用户
        if not user_id:
            try:
                if AuthUser.objects.filter(username=username).first():
                    return Response({'msg': '该用户名已存在,请换一个', "success": False, "status": 400})
                if not password:
                    password = "#Yaxin0504"
                user = AuthUser.objects.create_user(username=username, password=password, note=note)
                return Response({'msg': '用户添加成功', 'success': True, "status": 200})
            except Exception as e:
                response = {
                    "msg": f'添加失败, 原因:{e}',
                    "success": False,
                    "status": 400
                }
                return Response(response)
        else:
            try:
                partial = kwargs.pop('partial', True)
                try:
                    user = AuthUser.objects.filter(id=user_id).get()
                except Exception as e:
                    logger.error(f"查询用户报错:{e}")
                    return Response({"msg": "该用户不存在", "status": 400, "success": False, "data": None})

                if password:
                    user.set_password(password)
                    user.save()

                if data:
                    serializer = self.get_serializer(user, data=data, partial=partial)
                    serializer.is_valid(raise_exception=True)
                    self.perform_update(serializer)

                return Response({'msg': '用户更新成功', 'success': True, "status": 200})
            except Exception as e:
                response = {
                    "msg": f'用户更新失败, 原因:{e}',
                    "success": False,
                    "status": 400
                }
                return Response(response)

    @single_permission([IsAuthenticated])
    def list(self, request, *args, **kwargs):
        data = request.query_params
        user_id = data.get("id")
        status = data.get("status", 1)
        self.queryset = AuthUser.objects.filter(status=status).all().order_by("-id")

        if not user_id:
            return Response({
                "data": super().list(request, *args, **kwargs).data,
                "msg": None,
                "success": True,
                "status": 200
            })

        else:
            try:
                instance = self.queryset.filter(id=user_id).get()
            except Exception as e:
                logger.error(f"查询用户{user_id}报错:{e}")
                return Response({"msg": "该用户不存在", "status": 400, "success": False, "data": None})

            serializer = self.get_serializer(instance)
            return Response({
                "data": serializer.data,
                "msg": None,
                "success": True,
                "status": 200
            })


class AsyncRoutesViewSet(ModelViewSet):

    def list(self, request, *args, **kwargs):
        return Response(
            {
                "success": True,
                "data": []
            }
        )