from rest_framework.decorators import action
from django.utils import timezone
from rest_framework import viewsets, filters, status # Dodan status
from django_filters.rest_framework import DjangoFilterBackend
from .models import RadniNalog, RadniNalogSlika, PutniNalog
from rest_framework.response import Response
from .serializers import (
    RadniNalogSerializer, 
    RadniNalogListaSerializer, 
    RadniNalogDetaljiSerializer
)
from kalendar.services import kreiraj_kalendarski_unos

class RadniNalogViewSet(viewsets.ModelViewSet):
    """
    API endpoint za upravljanje radnim nalozima. 
    Vozilo se sada filtrira i pretražuje preko Putnog Naloga.
    """
    # 1. queryset: UKLONJEN 'vozilo' iz select_related
    queryset = RadniNalog.objects.all().select_related(
        'klijent', 'izvrsitelj', 'putni_nalog__vozilo'
    )

    serializer_class = RadniNalogSerializer
    
    filter_backends = [
        DjangoFilterBackend, 
        filters.SearchFilter, 
        filters.OrderingFilter
    ]
    
    # 2. filterset_fields: 'vozilo' zamijenjeno putanjom preko putnog naloga
    filterset_fields = ['status', 'izvrsitelj', 'klijent', 'putni_nalog__vozilo']
    
    # 3. search_fields: pretraga ide preko putni_nalog__vozilo__registracija
    search_fields = [
        'broj_naloga', 
        'klijent__naziv', 
        'putni_nalog__vozilo__registracija', 
        'putni_nalog__vozilo__naziv'
    ]
    
    ordering_fields = ['datum_kreiranja', 'status', 'broj_naloga']
    ordering = ['-datum_kreiranja']

    def get_serializer_class(self):
        if self.action == 'list':
            return RadniNalogListaSerializer
        if self.action == 'retrieve':
            return RadniNalogDetaljiSerializer
        return RadniNalogSerializer

    def get_queryset(self):
        # Optimizacija upita ovisno o akciji
        queryset = self.queryset
        if self.action == 'retrieve':
            queryset = queryset.prefetch_related('slike')
        return queryset

    def perform_create(self, serializer):
        # Postavljamo izvršitelja ako nije poslan
        if not serializer.validated_data.get('izvrsitelj'):
            radni_nalog = serializer.save(izvrsitelj=self.request.user)
        else:
            radni_nalog = serializer.save()

        # Kalendar servis
        try:
            kreiraj_kalendarski_unos(radni_nalog)
        except Exception as e:
            print(f"Greška pri kreiranju kalendarskog zapisa: {e}")

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        
        instance = serializer.instance
        
        # Obrada višestrukih slika
        files = request.FILES.getlist('slike')
        for f in files:
            RadniNalogSlika.objects.create(radni_nalog=instance, slika=f)
            
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
    
    @action(detail=False, methods=['get'], url_path='sljedeci-broj')
    def dohvati_sljedeci_broj(self, request):
        godina = timezone.now().year
        prefix = f"{godina}-"
        
        zadnji_nalog = RadniNalog.objects.filter(
            broj_naloga__startswith=prefix
        ).order_by('-broj_naloga').first()

        if zadnji_nalog:
            try:
                zadnji_broj = int(zadnji_nalog.broj_naloga.split('-')[-1])
                novi_broj = zadnji_broj + 1
            except (ValueError, IndexError):
                novi_broj = 1
        else:
            novi_broj = 1

        return Response({"broj_naloga": f"{prefix}{novi_broj:04d}"})