from datetime import date
from django.conf import settings
from rest_framework import status
from rest_framework.response import Response
from django.contrib.auth import get_user_model
from rest_framework import generics, permissions
from utils.threads.email_thread import send_mail
from apps.core.serializers import ChangePasswordSerializer, ChangeOldPasswordSerializer

User = get_user_model()


class ChangePasswordView(generics.UpdateAPIView):
    """Change password api instant """
    queryset = User.objects.all()
    serializer_class = ChangePasswordSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def get_object(self):
        return self.request.user

    def update(self, request, *args, **kwargs):
        self.object = self.get_object()
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            self.object.set_password(serializer.data.get("new_password"))
            self.object.must_change_password = False
            self.object.save()

            response = {
                'status': 'success',
                'code': status.HTTP_200_OK,
                'message': 'Password updated successfully. Please login with new credentials.',
            }

            subject = "Dealership Password Confirmation"

            html_content = "auth/passwordChanged.html"

            key = {
                'username': self.object.username,
                'firstname': self.object.profile.first_name,
                'lastname': self.object.profile.last_name,
                'button': settings.REACT_DOMAIN+'auth/login',
                'year': date.today().year
            }

            send_mail(
                subject=subject,
                html_content=html_content,
                recipient_list=[self.object.email],
                key=key
            )

            return Response(response)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class ChangeOldPasswordView(generics.UpdateAPIView):
    """Change Old password api instant """
    queryset = User.objects.all()
    serializer_class = ChangeOldPasswordSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def get_object(self):
        return self.request.user

    def update(self, request, *args, **kwargs):
        self.object = self.get_object()
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            old_password = serializer.data.get("old_password")
            if not old_password or not self.object.check_password(old_password):
                return Response({"old_password": ["Wrong password."]}, status=status.HTTP_400_BAD_REQUEST)

            self.object.set_password(serializer.data.get("new_password"))
            self.object.must_change_password = False
            self.object.save()

            response = {
                'status': 'success',
                'code': status.HTTP_200_OK,
                'message': 'Old Password updated successfully. Please login with new credentials.',
            }

            key = {
                'username': self.object.username,
                'button': settings.REACT_DOMAIN+'auth/login',
                'year': date.today().year
            }
            
            send_mail(
                subject="Password Changed",
                html_content="auth/passwordChanged.html",
                recipient_list=[self.object.email], key=key
            )

            return Response(response)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
