
from rest_framework import generics
from .models import Newsletter
from .serializers import NewsletterSerializer
from rest_framework import status
from utils.helper import success_response, failed_response  ,generate_random_text
from utils.logger import record
from utils.data import logger_settings 



log_msg=logger_settings["msg"]



class NewsletterCreateView(generics.CreateAPIView):
    queryset = Newsletter.objects.all()
    serializer_class = NewsletterSerializer

    def create(self, request, *args, **kwargs):
        process_code = generate_random_text(6)
        record('info', f'{process_code}: {log_msg["started"]} - Newsletter creation process started')

        try:
            response = super().create(request, *args, **kwargs)
            record('info', f'{process_code}: {log_msg["completed"]} - Newsletter created successfully')
            return success_response(data=response.data, msg="Newsletter created successfully")
        except Exception as e:
            record('error', f'{process_code}: {log_msg["error"]} - An unexpected error occurred: {str(e)}')
            return failed_response(msg="An unexpected error occurred while creating the newsletter.", code=status.HTTP_500_INTERNAL_SERVER_ERROR)


class NewsletterSubscribeView(generics.CreateAPIView):
    queryset = Newsletter.objects.all()
    serializer_class = NewsletterSerializer

    def create(self, request, *args, **kwargs):
        process_code = generate_random_text(6)
        record('info', f'{process_code}: {log_msg["started"]} - Newsletter subscription process started')

        try:
            serializer = self.get_serializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                record('info', f'{process_code}: {log_msg["completed"]} - Successfully subscribed to the newsletter')
                return success_response(data=serializer.data, msg="Successfully subscribed to the newsletter.")
            else:
                record('warn', f'{process_code}: {log_msg["validation_failed"]} - Validation errors: {serializer.errors}')
                return failed_response(msg=serializer.errors, code=status.HTTP_400_BAD_REQUEST)
        except Exception as e:
            record('error', f'{process_code}: {log_msg["error"]} - An unexpected error occurred: {str(e)}')
            return failed_response(msg="An unexpected error occurred while subscribing to the newsletter.", code=status.HTTP_500_INTERNAL_SERVER_ERROR)
