from django.shortcuts import get_object_or_404
from rest_framework import generics, status
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
from .models import Course
from .serializers import CourseDetailSerializer, CourseCreateSerializer


class CourseDetailView(generics.RetrieveUpdateAPIView):
    """
    Retrieve detailed information for a specific course by its slug.
    GET: Retrieve course details
    PUT/PATCH: Update course details
    """
    serializer_class = CourseDetailSerializer
    permission_classes = [AllowAny]
    lookup_field = 'slug'
    queryset = Course.objects.all()

    def get_object(self):
        """
        Retrieve the course by slug, returning 404 if not found
        """
        slug = self.kwargs.get('slug')
        return get_object_or_404(Course, slug=slug)
    
    def get_serializer_class(self):
        """
        Use CourseCreateSerializer for PUT/PATCH requests
        """
        if self.request.method in ['PUT', 'PATCH']:
            from .serializers import CourseCreateSerializer
            return CourseCreateSerializer
        return CourseDetailSerializer


class CourseListCreateView(generics.ListCreateAPIView):
    """
    GET: List all courses with basic information
    POST: Create a new course with all related data
    """
    queryset = Course.objects.all()
    permission_classes = [AllowAny]  # You may want to restrict this to authenticated users
    parser_classes = [MultiPartParser, FormParser, JSONParser]
    
    def get_serializer_class(self):
        if self.request.method == 'POST':
            return CourseCreateSerializer
        return CourseDetailSerializer
    
    def create(self, request, *args, **kwargs):
        """
        Create a new course with comprehensive data
        """
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            course = serializer.save()
            # Return the created course with full details
            response_serializer = CourseDetailSerializer(course)
            return Response(
                {
                    'message': 'Course created successfully',
                    'course': response_serializer.data
                },
                status=status.HTTP_201_CREATED
            )
        return Response(
            {
                'message': 'Course creation failed',
                'errors': serializer.errors
            },
            status=status.HTTP_400_BAD_REQUEST
        )


class CourseCreateView(generics.CreateAPIView):
    """
    POST: Create a new course with all related data
    Dedicated endpoint for course creation
    """
    queryset = Course.objects.all()
    serializer_class = CourseCreateSerializer
    permission_classes = [AllowAny]  # You may want to restrict this to authenticated users
    parser_classes = [MultiPartParser, FormParser, JSONParser]
    
    def create(self, request, *args, **kwargs):
        """
        Create a new course with comprehensive validation and response
        """
        serializer = self.get_serializer(data=request.data)
        
        if serializer.is_valid():
            try:
                course = serializer.save()
                
                # Return the created course with full details
                response_serializer = CourseDetailSerializer(course)
                
                return Response(
                    {
                        'success': True,
                        'message': 'Course created successfully',
                        'course_id': course.id,
                        'course_slug': course.slug,
                        'course': response_serializer.data
                    },
                    status=status.HTTP_201_CREATED
                )
                
            except Exception as e:
                return Response(
                    {
                        'success': False,
                        'message': 'Course creation failed due to server error',
                        'error': str(e)
                    },
                    status=status.HTTP_500_INTERNAL_SERVER_ERROR
                )
        
        return Response(
            {
                'success': False,
                'message': 'Course creation failed due to validation errors',
                'errors': serializer.errors
            },
            status=status.HTTP_400_BAD_REQUEST
        )