from rest_framework import viewsets, generics
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404
from colleges.models import College
from colleges.serializers import CollegeSerializer
from colleges.models import Program, ProgramsSection
from rest_framework.views import APIView

class FindAProgramView(APIView):
    """
    Read-only API to fetch all colleges and their programs in the required format.
    Colleges are ordered by priority_order (ascending) then by name.
    """
    def get(self, request):
        colleges = College.objects.all().order_by('priority_order', 'name')
        result = []
        for college in colleges:
            programs_section = getattr(college, 'programs_section', None)
            programs_list = []
            if programs_section:
                for program in programs_section.programs.all():
                    course = program.course
                    programs_list.append({
                        'name': program.name,
                        'course_id': course.id if course else None,
                        'course_title': course.title if course else None,
                        'course_link': f"/academics/programs/courses/{course.slug}/" if course and course.slug else None,
                        'duration': course.duration if course else None
                    })
            result.append({
                'name': college.name,
                'programs': programs_list
            })
        return Response(result, status=status.HTTP_200_OK)

class CollegeViewSet(viewsets.ReadOnlyModelViewSet):
    """
    A viewset for viewing college instances.
    """
    queryset = College.objects.all()
    serializer_class = CollegeSerializer
    lookup_field = 'slug'

class CollegeDetailView(generics.RetrieveAPIView):
    """
    Retrieve a college by its slug.
    """
    queryset = College.objects.all()
    serializer_class = CollegeSerializer
    lookup_field = 'slug'
    
    def get(self, request, *args, **kwargs):
        slug = kwargs.get('slug')
        try:
            college = get_object_or_404(College, slug=slug)
            serializer = self.get_serializer(college)
            return Response(serializer.data)
        except College.DoesNotExist:
            return Response(
                {"error": "College not found"}, 
                status=status.HTTP_404_NOT_FOUND
            )

