from rest_framework import viewsets, permissions, status
from rest_framework.decorators import action
from rest_framework.response import Response
from django.db.models import Count
from django.shortcuts import get_object_or_404

from .models import MarketSurvey, SurveyResponse
from .serializers import SurveyResponseSerializer, MarketSurveyStatsSerializer

class MarketSurveyViewSet(viewsets.ModelViewSet):
    """
    ViewSet principal.
    L'utilisateur ne voit QUE ses propres données.
    """
    serializer_class = SurveyResponseSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        if getattr(self.request.user, 'is_staff', False):
            return SurveyResponse.objects.all().order_by('-created_at')
        study, _ = MarketSurvey.objects.get_or_create(entrepreneur=self.request.user)
        return SurveyResponse.objects.filter(study=study).order_by('-created_at')

    def perform_create(self, serializer):
        # Étude de Marché accessible sans avoir terminé les formations (liaison supprimée)
        study, created = MarketSurvey.objects.get_or_create(entrepreneur=self.request.user)
        serializer.save(study=study)

    @action(detail=False, methods=['get'])
    def status(self, request):
        """
        Renvoie l'état global : Combien de réponses ? Est-ce que le BP est débloqué ?
        L'étude de marché est accessible sans avoir terminé les formations (liaison supprimée).
        """
        from formations.models import Formation, UserFormationStatus

        all_formations = Formation.objects.count()
        validated_formations = UserFormationStatus.objects.filter(
            user=request.user, is_completed=True
        ).count()
        all_formations_validated = all_formations == 0 or validated_formations >= all_formations

        study, created = MarketSurvey.objects.get_or_create(entrepreneur=request.user)
        total = study.responses.count()
        REQUIRED_RESPONSES = 2
        needed = REQUIRED_RESPONSES
        # BP débloqué dès que le quota de réponses est atteint (plus de condition formations)
        is_unlocked = total >= needed

        # Si on atteint le quota ET formations validées, on valide l'étude dans la BDD
        if is_unlocked and not study.is_validated:
            study.is_validated = True
            study.save()

        # Agrégation des données pour Chart.js
        age_stats = study.responses.values('age_range').annotate(count=Count('id'))
        gender_stats = study.responses.values('gender').annotate(count=Count('id'))
        interest_stats = study.responses.values('interest_level').annotate(count=Count('id'))
        price_stats = study.responses.values('general_price_perception').annotate(count=Count('id'))
        location_stats = study.responses.values('location').annotate(count=Count('id'))
        purchase_frequency_stats = study.responses.values('purchase_frequency').annotate(count=Count('id'))
        competitor_price_stats = study.responses.filter(competitor_avg_price_perception__isnull=False).exclude(competitor_avg_price_perception='').values('competitor_avg_price_perception').annotate(count=Count('id'))
        competitor_service_stats = study.responses.filter(competitor_service_rating__isnull=False).exclude(competitor_service_rating='').values('competitor_service_rating').annotate(count=Count('id'))

        data = {
            "total_responses": total,
            "required_responses": needed,
            "responses_needed": max(0, needed - total),
            "is_unlocked": is_unlocked,
            "all_formations_validated": all_formations_validated,
            "formations_validated_count": validated_formations,
            "formations_total": all_formations,
            "age_distribution": {item['age_range']: item['count'] for item in age_stats},
            "gender_distribution": {item['gender']: item['count'] for item in gender_stats},
            "interest_distribution": {str(item['interest_level']): item['count'] for item in interest_stats},
            "price_perception": {item['general_price_perception']: item['count'] for item in price_stats},
            "location_distribution": {item['location']: item['count'] for item in location_stats},
            "purchase_frequency_distribution": {item['purchase_frequency']: item['count'] for item in purchase_frequency_stats},
            "competitor_price_perception": {item['competitor_avg_price_perception']: item['count'] for item in competitor_price_stats},
            "competitor_service_rating_distribution": {item['competitor_service_rating']: item['count'] for item in competitor_service_stats},
        }

        return Response(data)

    @action(detail=False, methods=['post'])
    def batch_upload(self, request):
        """
        (Optionnel) Pour uploader plusieurs réponses d'un coup si besoin.
        """
        pass