from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
from django.contrib.auth import get_user_model
from utils.threads.email_thread import send_mail
from apps.core.utils.generate_password_util import generate_secure_password
from datetime import date
from django.conf import settings

User = get_user_model()
react_domain = settings.REACT_DOMAIN


class ResendPasswordView(APIView):
    """Resend generated password for users who lost their email/password"""
    permission_classes = [AllowAny]

    def post(self, request, *args, **kwargs):
        email = request.data.get('email')

        if not email:
            return Response({
                'error': 'Email is required'
            }, status=status.HTTP_400_BAD_REQUEST)

        try:
            user = User.objects.get(email=email, is_active=True)
        except User.DoesNotExist:
            return Response({
                'error': 'User with this email does not exist or account is not active'
            }, status=status.HTTP_404_NOT_FOUND)

        # Check if user already changed their password
        if not user.must_change_password:
            return Response({
                'error': 'You have already changed your password. Please use the forgot password feature instead.'
            }, status=status.HTTP_400_BAD_REQUEST)

        # Generate new password using utility
        new_password = generate_secure_password(12)

        from django.contrib.auth.hashers import make_password
        User.objects.filter(id=user.id).update(
            password=make_password(new_password),
            must_change_password=True
        )

        # Refresh user object to get updated data
        user.refresh_from_db()

        # Send email with new password
        key = {
            'username': user.username,
            'password': new_password,
            'year': date.today().year
        }

        subject = "New Generated Password"
        template_name = "auth/new_userRegister.html"  # Reuse existing template
        recipient = [email]

        send_mail(subject=subject, html_content=template_name,
                  recipient_list=recipient, key=key)

        return Response({
            'message': 'New password has been sent to your email. Please check your inbox.'
        }, status=status.HTTP_200_OK)