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.permissions import can_manage_club,is_platform_admin
from players.models import Player
from .api_serializers import NutritionEventSerializer,NutritionProfileSerializer,NutritionSelectSerializer
from .exceptions import NutritionDomainError
from .models import NutritionSelectionEvent,PlayerNutritionProfile
from .services import NutritionProfileService
class PlayerNutritionAPIView(APIView):
    permission_classes=[permissions.IsAuthenticated]
    def _player(self,request,player_id):
        p=get_object_or_404(Player.objects.select_related("career__user"),pk=player_id)
        can=is_platform_admin(request.user) or p.career.user_id==request.user.pk
        if not can:
            try:can=can_manage_club(request.user,p.squad_membership.club)
            except Exception:pass
        if not can:return None
        return p
    def get(self,request,player_id):
        p=self._player(request,player_id)
        if not p:return Response({"detail":"Not authorized."},status=403)
        profile=PlayerNutritionProfile.objects.filter(player=p).first();return Response({"profile":NutritionProfileSerializer(profile).data if profile else None,"events":NutritionEventSerializer(NutritionSelectionEvent.objects.filter(player=p)[:30],many=True).data})
    def post(self,request,player_id):
        p=self._player(request,player_id)
        if not p or (not is_platform_admin(request.user) and p.career.user_id!=request.user.pk):return Response({"detail":"Only the player owner may select nutrition level."},status=403)
        s=NutritionSelectSerializer(data=request.data);s.is_valid(raise_exception=True)
        return mutation(request=request,scope=f"nutrition.player.{player_id}.select",operation=lambda:NutritionProfileService.select_level(player_id=player_id,**s.validated_data),serialize=lambda x:NutritionProfileSerializer(x).data,domain_errors=(NutritionDomainError,))
