from rest_framework import status, permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.authtoken.models import Token
from django.contrib.auth import authenticate
from django.utils import timezone
from datetime import timedelta
import uuid
import logging
from rest_framework.permissions import IsAdminUser

from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi
from django.core.mail import send_mail, EmailMessage
from django.conf import settings

logger = logging.getLogger(__name__)


class SendEmailView(APIView):
    # permission_classes = [permissions.IsAuthenticated] # Or adjust permissions as needed
    permission_classes = [IsAdminUser]
    @swagger_auto_schema(
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            required=['recipient_email', 'subject', 'message'],
            properties={
                'recipient_email': openapi.Schema(type=openapi.TYPE_STRING, format=openapi.FORMAT_EMAIL, description="The recipient's email address."),
                'subject': openapi.Schema(type=openapi.TYPE_STRING, description="The subject of the email."),
                'message': openapi.Schema(type=openapi.TYPE_STRING, description="The body of the email."),
                'cc_recipients': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING, format=openapi.FORMAT_EMAIL), description="A list of CC recipient email addresses (optional)."),
                'bcc_recipients': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING, format=openapi.FORMAT_EMAIL), description="A list of BCC recipient email addresses (optional)."),
            }
        ),
    )
    def post(self, request):
        recipient_email = request.data.get('recipient_email')
        subject = request.data.get('subject')
        message = request.data.get('message')
        cc_recipients = request.data.get('cc_recipients', [])
        bcc_recipients = request.data.get('bcc_recipients', [])

        if not recipient_email or not subject or not message:
            return Response({
                "error": "Recipient email, subject, and message are required."
            }, status=status.HTTP_400_BAD_REQUEST)

        try:
            email = EmailMessage(
                subject=subject,
                body=message,
                from_email=settings.DEFAULT_FROM_EMAIL,
                to=[recipient_email],
                cc=cc_recipients,
                bcc=bcc_recipients
            )
            email.send()
            logger.info(f"Email sent to {recipient_email} with CC: {cc_recipients}, BCC: {bcc_recipients}")
            return Response({
                "message": "Email sent successfully."
            }, status=status.HTTP_200_OK)
        except Exception as e:
            logger.error(f"Failed to send email: {str(e)}")
            return Response({
                "error": f"Failed to send email: {str(e)}"
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

