import logging
from django.db import transaction
from django.db.models import Q
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import viewsets
from app.pagination import MyPageNumberPagination
from user.models import UserProfile
from .models import Department
from .serializers import DepartmentSerializer
# Create your views here.

logger = logging.getLogger('mylogger')


class DepartmentView(viewsets.GenericViewSet):
    def list(self, request, *args, **kwargs):
        data = dict()
        try:
            parent_departments = list(Department.objects.filter(parent_id__isnull=True).values())
            for parent_department in parent_departments:
                parent_id = parent_department.get('id')
                son_departs = list(Department.objects.filter(parent_id=parent_id).values())
                parent_department['children'] = son_departs
            data['data'] = parent_departments
            return Response(data)
        except Exception as e:
            return Response({'msg': f'查询失败, {e}'})

    def query_department_users(self, request, *args, **kwargs):
        res = dict()
        data = request.data
        department_id = data.get('department_id')
        try:
            users = list(UserProfile.objects.filter(department_id=department_id).values('id', 'username', 'phone_number', 'status', 'department_id'))
            res['data'] = users
            return Response(res)
        except Exception as e:
            return Response({'msg': f'查询失败,原因{e}'})

    # def list_son_departments(self, request, *args, **kwargs):
    #     query_params = dict(request.query_params)
    #     parent_name = query_params.get('parent_name')
    #     if isinstance(parent_name, list):
    #         parent_name = ''.join(parent_name)
    #     logger.info(parent_name)
    #     parent_obj = Department.objects.filter(name=parent_name).first()
    #     if not parent_obj:
    #         return Response({'msg': '非法请求,该父级部门不存在'})
    #     parent_id = parent_obj.id
    #     queryset = Department.objects.filter(parent_id=parent_id).order_by('-id')
    #     paginator = MyPageNumberPagination()
    #     paginated_queryset = paginator.paginate_queryset(queryset, request)
    #     serializer = DepartmentSerializer(paginated_queryset, many=True)
    #
    #     return paginator.get_paginated_response(serializer.data)

    # def create(self, request, *args, **kwargs):
    #     data = request.data
    #     parent_depart_name = data.get('parent_department')
    #     if not parent_depart_name:
    #         return Response({"msg": "请输入父级部门名称"})
    #     parent_obj = Department.objects.filter(name=parent_depart_name).first()
    #     if parent_obj:
    #         return Response({'msg': '该部门已存在,请换一个'})
    #     try:
    #         with transaction.atomic():
    #             new_obj = Department.objects.create(name=parent_depart_name)
    #         return Response({'msg': '创建父级部门成功'})
    #     except Exception as e:
    #         return Response({'msg': f'创建失败,原因{e}'})

    # def create(self, request, *args, **kwargs):
    #     data = request.data
    #     parent_name = data.get('parent_department_name')
    #     if not parent_name:
    #         return Response({'msg': '请输入父级部门名称'})
    #     depart_name = data.get('department_name')
    #     try:
    #         with transaction.atomic():
    #             if not depart_name:
    #                 old_parent_obj = Department.objects.filter(name=parent_name).first()
    #                 if old_parent_obj:
    #                     return Response({'msg': '该父级部门名称已存在,请换一个'})
    #                 parent_obj = Department.objects.create(name=parent_name)
    #                 return Response({'msg': '创建父级部门成功'})
    #             else:
    #                 old_parent_obj = Department.objects.filter(name=parent_name).first()
    #                 if not old_parent_obj:
    #                     old_parent_obj = Department.objects.create(name=parent_name)
    #                 old_depart_obj = Department.objects.filter(name=depart_name, parent_id=old_parent_obj.id).first()
    #                 if old_depart_obj:
    #                     return Response({'msg': f'{parent_name}下已有{depart_name}啦,请换一个'})
    #                 new_depart_obj = Department.objects.create(name=depart_name, parent_id=old_parent_obj.id)
    #                 return Response({'msg': '创建子部门成功'})
    #     except Exception as e:
    #         return Response({'msg': f'创建失败,{e}'})

    def create(self, request, *args, **kwargs):
        data = request.data
        department_name = data.get('department_name')
        department_id = data.get('department_id')
        if not department_id or department_id == '':
            old_depart_obj = Department.objects.filter(name=department_name, parent_id__isnull=True).first()
            if old_depart_obj:
                return Response({'msg': f'该父级部门{department_name}已存在'})
            depart_obj = Department.objects.create(name=department_name)
            return Response({'msg': f'创建父级部门{department_name}成功', 'success': True})
        else:
            parent_obj = Department.objects.filter(id=department_id, parent_id__isnull=True).first()
            if not parent_obj:
                return Response({'msg': '非法请求'})
            old_son_obj = Department.objects.filter(name=department_name, parent_id=department_id).first()
            if old_son_obj:
                return Response({'msg': f'该父级部门{parent_obj.name}下已有{old_son_obj.name}啦'})
            son_obj = Department.objects.create(name=department_name, parent_id=department_id)
            return Response({'msg': f'创建父级部门{parent_obj.name}下{son_obj.name}成功', 'success': True})

    # def create_son_department(self, request, *args, **kwargs):
    #     data = request.data
    #     parent_name = data.get('parent_name')
    #     if not parent_name:
    #         return Response({'msg': '请输入父级部门名称以便创建子部门'})
    #     parent_obj = Department.objects.filter(name=parent_name).first()
    #     parent_id = parent_obj.id
    #     department_name = data.get('department_name')
    #     if not department_name:
    #         return Response({'msg': '请输入子部门名称'})
    #     depart_obj = Department.objects.filter(name=department_name, parent_id=parent_id).first()
    #     if depart_obj:
    #         return Response({'msg': f'{parent_name}下已有{department_name},请换一个'})
    #     try:
    #         with transaction.atomic():
    #             Department.objects.create(name=department_name, parent_id=parent_id)
    #         return Response({'msg': '创建成功'})
    #     except Exception as e:
    #         return Response({'msg': f'创建失败,原因{e}'})

    def update(self, request, pk, *args, **kwargs):
        data = request.data
        try:
            with transaction.atomic():
                depart_obj = Department.objects.filter(id=pk).update(**data)
            return Response({'msg': '更新成功', 'success': True})
        except Department.DoesNotExist:
            return Response({'msg': '该部门不存在'})
        except Exception as e:
            return Response({'msg': f'更新失败,原因{e}'})

    def destroy(self, request, pk, *args, **kwargs):
        try:
            with transaction.atomic():
                depart_obj = Department.objects.filter(id=pk).delete()
            return Response({'msg': '删除成功', 'success': True})
        except Department.DoesNotExist:
            return Response({'msg': '该部门不存在'})
        except Exception as e:
            return Response({'msg': f'删除失败,原因{e}'})