from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from .models import CrawledDevelopment, CrawledFlat, CrawledAttachment, SyncLog
from .serializers import (
    CrawledDevelopmentSerializer, CrawledFlatSerializer, 
    CrawledAttachmentSerializer, SyncLogSerializer
)
from .utils import SyncService

class CrawledDevelopmentViewSet(viewsets.ModelViewSet):
    queryset = CrawledDevelopment.objects.all()
    serializer_class = CrawledDevelopmentSerializer
    permission_classes = [IsAuthenticated]
    
    @action(detail=True, methods=['post'])
    def sync(self, request, pk=None):
        result = SyncService.sync_development(pk)
        if result['success']:
            return Response(result, status=status.HTTP_200_OK)
        return Response(result, status=status.HTTP_400_BAD_REQUEST)
    
    @action(detail=False, methods=['post'])
    def bulk_sync(self, request):
        development_ids = request.data.get('development_ids', [])
        results = []
        
        for dev_id in development_ids:
            result = SyncService.sync_development(dev_id)
            results.append({
                'id': dev_id,
                'result': result
            })
        
        return Response(results, status=status.HTTP_200_OK)

class CrawledFlatViewSet(viewsets.ModelViewSet):
    queryset = CrawledFlat.objects.all()
    serializer_class = CrawledFlatSerializer
    permission_classes = [IsAuthenticated]
    
    @action(detail=True, methods=['post'])
    def sync(self, request, pk=None):
        result = SyncService.sync_flat(pk)
        if result['success']:
            return Response(result, status=status.HTTP_200_OK)
        return Response(result, status=status.HTTP_400_BAD_REQUEST)

class CrawledAttachmentViewSet(viewsets.ModelViewSet):
    queryset = CrawledAttachment.objects.all()
    serializer_class = CrawledAttachmentSerializer
    permission_classes = [IsAuthenticated]
    
    @action(detail=True, methods=['post'])
    def sync(self, request, pk=None):
        result = SyncService.sync_attachment(pk)
        if result['success']:
            return Response(result, status=status.HTTP_200_OK)
        return Response(result, status=status.HTTP_400_BAD_REQUEST)

class SyncLogViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = SyncLog.objects.all()
    serializer_class = SyncLogSerializer
    permission_classes = [IsAuthenticated]
    
    @action(detail=True, methods=['get'])
    def check_status(self, request, pk=None):
        result = SyncService.check_sync_status(pk)
        if result['success']:
            return Response(result, status=status.HTTP_200_OK)
        return Response(result, status=status.HTTP_400_BAD_REQUEST)