from rest_framework import generics, views, response, status, pagination
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from django_filters.rest_framework import DjangoFilterBackend
from django.utils import timezone
from datetime import timedelta
from .models import BlacklistRecord, ScrapeLog
from .serializers import BlacklistRecordSerializer, ScrapeLogSerializer
from .scraper import scrape_blacklist

class StandardResultsSetPagination(pagination.PageNumberPagination):
    page_size = 50
    page_size_query_param = 'page_size'
    max_page_size = 1000

class BlacklistListView(generics.ListAPIView):
    queryset = BlacklistRecord.objects.all().order_by('-blacklist_date_ad', '-id')
    serializer_class = BlacklistRecordSerializer
    pagination_class = StandardResultsSetPagination
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_fields = {
        'borrower_name': ['icontains'],
        'associated_entities': ['icontains'],
        'blacklist_no': ['icontains'],
    }
    search_fields = ['blacklist_no', 'borrower_name', 'associated_entities']
    ordering_fields = ['sno', 'blacklist_date_ad', 'borrower_name']
    permission_classes = [AllowAny]

class StatsView(views.APIView):
    permission_classes = [AllowAny]
    def get(self, request):
        now = timezone.now().date()
        today_count = BlacklistRecord.objects.filter(blacklist_date_ad=now).count()
        last_7_days_count = BlacklistRecord.objects.filter(blacklist_date_ad__gte=now - timedelta(days=7)).count()
        total_count = BlacklistRecord.objects.count()
        
        return response.Response({
            'total_count': total_count,
            'today_count': today_count,
            'last_7_days_count': last_7_days_count,
        })

class TriggerScrapeView(views.APIView):
    permission_classes = [AllowAny]
    def post(self, request):
        success = scrape_blacklist()
        if success:
            return response.Response({'message': 'Scraping triggered successfully'}, status=status.HTTP_200_OK)
        else:
            return response.Response({'message': 'Scraping failed'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class ScrapeLogListView(generics.ListAPIView):
    queryset = ScrapeLog.objects.all().order_by('-timestamp')
    serializer_class = ScrapeLogSerializer
    permission_classes = [IsAuthenticated]

class ScrapeLogDetailView(generics.DestroyAPIView):
    queryset = ScrapeLog.objects.all()
    serializer_class = ScrapeLogSerializer
    permission_classes = [IsAuthenticated]

class ScrapeLogRecordsView(generics.ListAPIView):
    serializer_class = BlacklistRecordSerializer
    pagination_class = StandardResultsSetPagination
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        log_id = self.kwargs['pk']
        return BlacklistRecord.objects.filter(scrape_log_id=log_id).order_by('sno')

class LoginView(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return response.Response({
            'token': token.key,
            'user_id': user.pk,
            'email': user.email
        })
