from django.shortcuts import get_object_or_404
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from api_core.application import mutation
from api_core.pagination import limited
from api_core.permissions import is_platform_admin
from .api_serializers import SeasonCalendarSlotSerializer,SeasonCreateSerializer,SeasonOrchestrationRunSerializer,SeasonOrchestrationStepSerializer,SeasonSerializer
from .exceptions import SeasonError
from .models import Season,SeasonCompetitionCalendarSlot,SeasonOrchestrationRun
from .services import SeasonService

class SeasonListCreateAPIView(APIView):
    permission_classes=[permissions.IsAuthenticated]
    def get(self,request): return limited(request,Season.objects.all(),SeasonSerializer)
    def post(self,request):
        if not is_platform_admin(request.user): return Response({"detail":"Platform administration permission required."},status=403)
        s=SeasonCreateSerializer(data=request.data);s.is_valid(raise_exception=True)
        return mutation(request=request,scope="seasons.create",operation=lambda:SeasonService.create_season(**s.validated_data),serialize=lambda x:SeasonSerializer(x).data,success_status=201,domain_errors=(SeasonError,))
class SeasonDetailAPIView(APIView):
    permission_classes=[permissions.IsAuthenticated]
    def get(self,request,season_id): return Response(SeasonSerializer(get_object_or_404(Season,pk=season_id)).data)
class SeasonActionAPIView(APIView):
    permission_classes=[permissions.IsAuthenticated]
    def post(self,request,season_id,action):
        if not is_platform_admin(request.user): return Response({"detail":"Platform administration permission required."},status=403)
        actions={"upcoming":SeasonService.mark_upcoming,"activate":SeasonService.activate,"complete":SeasonService.complete,"archive":SeasonService.archive,"cancel":SeasonService.cancel}
        if action not in actions:return Response({"detail":"Unknown action."},status=404)
        if action == "activate":
            from .models import SeasonAutomationPolicy
            if not SeasonAutomationPolicy.objects.filter(season_id=season_id).exists():
                return Response({"detail":"Configure the season calendar and readiness gates before activation."},status=409)
        return mutation(request=request,scope=f"seasons.{season_id}.{action}",operation=lambda:actions[action](season_id=season_id),serialize=lambda x:SeasonSerializer(x).data,domain_errors=(SeasonError,))
class SeasonOrchestrationAPIView(APIView):
    permission_classes=[permissions.IsAuthenticated]
    def get(self,request,season_id):
        qs=SeasonOrchestrationRun.objects.filter(source_season_id=season_id).prefetch_related("steps").order_by("-created_at")
        data=SeasonOrchestrationRunSerializer(qs,many=True).data
        for row,obj in zip(data,qs): row["steps"]=SeasonOrchestrationStepSerializer(obj.steps.all(),many=True).data
        return Response(data)
class SeasonCalendarAPIView(APIView):
    permission_classes=[permissions.IsAuthenticated]
    def get(self,request,season_id):
        qs=SeasonCompetitionCalendarSlot.objects.filter(season_id=season_id).order_by("scheduled_date","sequence")
        return limited(request,qs,SeasonCalendarSlotSerializer,default=100)
