def edit_user_info(request):
    token = get_token_from_request(request)
    user = get_user_from_token(token)
    code = request.data.get("code")
    avatar = request.data.get("avatar")
    phone_number = request.data.get("phone_number")
    gender = request.data.get("gender")
    unit = request.data.get("unit")
    address = request.data.get("address")
    birthday = dateutil.parser.parse(request.data.get("birthday"))
    first_name = request.data.get("first_name")
    last_name = request.data.get("last_name")
    username = request.data.get("username")
    try:
        user.code = code
        user.avatar = avatar
        user.phone_number = phone_number
        user.gender = gender
        user.unit = unit
        user.address = address
        user.birthday = birthday
        user.first_name = first_name
        user.last_name = last_name
        user.username = username
        user.save()
    except:
        data = {"success": False, "message": "Can't edit info"}
        return Response(data)
    else:
        data = {"success": True, "message": "Edited"}
def change_password(request):
    # try :
    #     user = User.objects.get(pk=id)
    # except User.DoesNotExist:
    #     data = {
    #             "success" : False,
    #             "errors" : "User is invalid"
    #     }
    #     return Response(data)
    # else:
    token = get_token_from_request(request)
    user = get_user_from_token(token)
    old_password = request.data.get("old_password")
    validated = authenticate(username=user.username, password=old_password)
    if validated:
        new_password = request.data.get("new_password")
        if user is not None:
            user.set_password(str(new_password))
            user.save()

            data = {"success": True, "message": "Done!"}
            return Response(data)
        else:
            data = {"success": False, "message": "User is invalid"}
        return Response(data)
    else:
        data = {"success": False, "message": "Current Password is invalid"}
        return Response(data)
def get_user_detail_view(request):

    token = get_token_from_request(request)
    view_user = get_user_from_token(token)
    id = request.data.get('profile_id')
    try:
        user = User.objects.get(pk=id)
    except User.DoesNotExist:
        data = {"success": False, "errors": "User is invalid"}
        return Response(data)
    else:
        if view_user is not None:
            result = user.parse_data()
            return Response({"success": True, "profile": result})
def get_class_of_user(request):
    token = get_token_from_request(request)
    user = get_user_from_token(token)
    now = datetime.datetime.now(tz=timezone.utc)
    if user is not None:
        if user.is_student():

            all_class = ClassStudent.objects.filter(
                student__id=user.id).exclude(own_class__time_start__gte=now)
            data = {"success": True, "data": len(all_class)}
            return Response(data)
        elif user.is_lecturer():
            all_class = ClassLecturer.objects.filter(
                lecturer__id=user.id).exclude(own_class__time_start__gte=now)
            data = {"success": True, "data": len(all_class)}
            return Response(data)
    else:
        data = {"success": False, "data": "User is invalid"}
        return Response(data)
def check_validate(request):
    # print(json.loads(request.body.decode('utf-8')))

    time_start = dateutil.parser.parse(request.data.get('time_start'))
    time_end = dateutil.parser.parse(request.data.get('time_end'))
    session_start = request.data.get('session_start')
    session_end = request.data.get('session_end')
    day_of_week = request.data.get('day_of_week')
    subject = Subject.objects.get(pk=request.data.get('subject'))
    description = request.data.get('description')
    if time_start > time_end:
        data = {
            "success": False,
            "errors": "Time start cannot greater than time end!"
        }
        return Response(data)
    if session_start > session_end:
        data = {
            "success": False,
            "errors": "Session start cannot greater than session end!"
        }
        return Response(data)
    token = get_token_from_request(request)
    user = get_user_from_token(token)
    if user is not None:
        now = datetime.datetime.now(tz=timezone.utc)
        # comment  2 line after when read data from post method
        # time_end = now
        # time_start = now
        all_class = []
        if user.is_lecturer():
            # class_lecturers = ClassLecturer.objects.filter(lecturer__id= id).select_related('own_class').filter(own_class__time_start__lte= now,own_class__time_end__gte=now)
            class_lecturers = ClassLecturer.objects.filter(
                lecturer__id=user.id).select_related('own_class').exclude(
                    Q(own_class__time_start__gte=time_end)
                    | Q(own_class__time_end__lte=time_start))
            # if len(class_lecturers) == 0:
            #     data = {
            #         "success": False,
            #         "errors": "Class is invalid"
            #     }
            #     return Response(data)
            # else:
            all_class = [
                item.own_class for item in class_lecturers
                if item.own_class is not None
            ]
            # if len(all_class) == 0:
            #     data = {
            #         "success": False,
            #         "errors": "Class is invalid"
            #     }
            #     return Response(data)

            schedules = []
            info_all_schedule = ClassSession()
            for item in all_class:
                rs = Schedule.objects.filter(own_class__id=item.id,
                                             day_of_week=day_of_week)

                for rs_item in rs:
                    info_all_schedule.add(int(rs_item.session_start),
                                          int(rs_item.session_end))
            if info_all_schedule.add(session_start, session_end) == False:
                data = {"success": False, "errors": "Session is coincided!"}
                return Response(data)
                # print(schedules)

            new_class = Class.objects.create(description=description,
                                             time_start=time_start,
                                             time_end=time_end,
                                             subject=subject)
            new_class.save()
            new_class_lecturer = ClassLecturer.objects.create(
                own_class=new_class, lecturer=user)
            new_class_lecturer.save()
            new_schedule = Schedule.objects.create(own_class=new_class,
                                                   day_of_week=day_of_week,
                                                   session_start=session_start,
                                                   session_end=session_end)
            new_schedule.save()

            data = {
                "success": True,
                "message":
                "Class" + new_class.name + "have been created successfully",
                "class_id": new_class.id
            }
            return Response(data)

        elif user.is_student():
            # data = {
            #             "success" : False,
            #             "errors" : "Access denied!"
            #         }
            # return Response(data)
            class_students = ClassStudent.objects.filter(
                student__id=user.id).select_related('own_class').exclude(
                    Q(own_class__time_start__gte=time_end)
                    | Q(own_class__time_end__lte=time_start))
            if len(class_students) == 0:
                data = {"success": False, "errors": "Class is invalid"}
                return Response(data)
            else:
                all_class = [
                    item.own_class for item in class_students
                    if item.own_class is not None
                ]
                if len(all_class) == 0:
                    data = {"success": False, "errors": "Class is invalid"}
                    return Response(data)

            schedules = []
            info_all_schedule = ClassSession()
            for item in all_class:
                rs = Schedule.objects.filter(own_class__id=item.id,
                                             day_of_week=day_of_week)

                for rs_item in rs:
                    info_all_schedule.add(int(rs_item.session_start),
                                          int(rs_item.session_end))
            if info_all_schedule.add(session_start, session_end) == False:
                data = {
                    "success": False,
                    "code": "coincided",
                    "errors": "Session is coincided!"
                }
                return Response(data)
                # print(schedules)

            data = {"success": True, "message": "You can enroll this class"}
            return Response(data)
def get_schedule(request):
    # id = request.user.id
    # try :
    #     user = User.objects.get(pk = id)
    # except User.DoesNotExist :
    #        data = {
    #             "success" : False,
    #             "errors" : "User is invalid"
    #     }
    #     return Response(data)
    # else :
    token = get_token_from_request(request)
    user = get_user_from_token(token)
    if user is not None:
        now = datetime.datetime.now(tz=timezone.utc)
        all_class = []
        if user.is_lecturer():
            class_lecturers = ClassLecturer.objects.filter(
                lecturer__id=user.id).select_related('own_class').filter(
                    own_class__time_start__lte=now,
                    own_class__time_end__gte=now)
            if len(class_lecturers) == 0:
                data = {"success": False, "errors": "Class is invalid"}
                return Response(data)
            else:
                all_class = [
                    item.own_class for item in class_lecturers
                    if item.own_class is not None
                ]
                if len(all_class) == 0:
                    data = {"success": False, "errors": "Class is invalid"}
                    return Response(data)

        elif user.is_student():
            class_students = ClassStudent.objects.filter(
                student__id=user.id).select_related('own_class').filter(
                    own_class__time_start__lte=now,
                    own_class__time_end__gte=now)
            if len(class_students) == 0:
                data = {"success": False, "errors": "Class is invalid"}
                return Response(data)
            else:
                all_class = [
                    item.own_class for item in class_students
                    if item.own_class is not None
                ]
                if len(all_class) == 0:
                    data = {"success": False, "errors": "Class is invalid"}
                    return Response(data)

        schedules = []
        for item in all_class:
            rs = Schedule.objects.filter(own_class__id=item.id)
            schedules.append(
                {item.code: [schedule.parse_data() for schedule in rs]})
        if len(schedules) == 0:
            data = {"success": False, "errors": "Schedules is invalid"}
            return Response(data)
        else:

            return JsonResponse({"data": schedules})
    else:
        return Response({"invalid": "User is invalid"})
def get_future_class(request):
    # id = request.user.id
    # try :
    #     user = User.objects.get(pk = id)
    # except User.DoesNotExist :
    #     data = {
    #             "success" : False,
    #             "errors" : "User is invalid"
    #     }
    #     return Response(data)
    # else :
    token = get_token_from_request(request)
    user = get_user_from_token(token)
    if user is not None:
        now = datetime.datetime.now(tz=timezone.utc)
        if user.is_lecturer():

            class_lecturers = ClassLecturer.objects.filter(
                lecturer__id=user.id).select_related('own_class').filter(
                    own_class__time_start__gte=now)
            if len(class_lecturers) == 0:
                data = {"empty": True, "message": "ClassList is empty"}
                return Response(data)
            else:
                all_class = [
                    item.own_class for item in class_lecturers
                    if item.own_class is not None
                ]
                if len(all_class) == 0:
                    data = {"success": False, "errors": "Class is invalid"}
                    return Response(data)
                else:
                    data = []
                    for class_queryset in all_class:
                        data.append(class_queryset.parse_info_and_username())
                    return Response(data)
                    # serializers = ClassSerializer(all_class, many=True)
                    # return Response(serializers.data)
        elif user.is_student():
            class_students = ClassStudent.objects.filter(
                student__id=user.id).select_related('own_class').filter(
                    own_class__time_start__gte=now)
            if len(class_students) == 0:
                data = {"empty": True, "message": "ClassList is empty"}
                return Response(data)
            else:
                all_class = [
                    item.own_class for item in class_students
                    if item.own_class is not None
                ]
                if len(all_class) == 0:
                    data = {"success": False, "errors": "Class is invalid"}
                    return Response(data)
                else:
                    data = []
                    for class_queryset in all_class:
                        data.append(class_queryset.parse_info_and_username())
                    return Response(data)

                    # serializers = ClassSerializer(all_class, many=True)
                    # return Response(serializers.data)
        else:
            return Response({"admin": "User is admin"})
    else:
        return Response({"invalid": "User is invalid"})