from django.db import IntegrityError
from rest_framework import viewsets, generics, permissions, status
from rest_framework.response import Response
from apps.companies.models import Dealership
from apps.companies.serializers import DealershipSerializer, DealershipCreateSerializer
from rest_framework.exceptions import ValidationError

from datetime import timedelta
from django.utils import timezone
from django.db.models import Count
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from apps.calls.models import Call
from apps.permissions.permissions import CompanyPermission
from utils.paginations import LimitOffsetPagination


class DealershipViewSet(viewsets.ModelViewSet):
    serializer_class = DealershipSerializer
    permission_classes = [permissions.IsAuthenticated, CompanyPermission]
    pagination_classes = [LimitOffsetPagination]

    def get_permission_classes(self):
        if self.action in ['create', 'update', 'partial_update', 'destroy']:
            return [CompanyPermission('dealership_group_create_dealerships')]
        return [CompanyPermission('dealership_group_view_dealerships')]

    def get_queryset(self):
        company = self.request.user.active_company
        return Dealership.objects.filter(company=company)

    def get_serializer_class(self):
        if self.action in ['create', 'update', 'partial_update', 'destroy']:
            return DealershipCreateSerializer
        return DealershipSerializer

    def perform_create(self, serializer):
        company = self.request.user.active_company
        try:
            serializer.save(company=company)
        except IntegrityError as e:
            if 'companies_dealership_company_id_name' in str(e):
                raise ValidationError({
                    "name": "A dealership with this name already exists for this company."
                })
            else:
                raise e

    def perform_update(self, serializer):
        try:
            serializer.save()
        except IntegrityError as e:
            if 'companies_dealership_company_id_name' in str(e):
                raise ValidationError({
                    "name": "A dealership with this name already exists for this company."
                })
            else:
                raise e

class CallsDashboardView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        company = request.user.active_company
        now = timezone.now()
        last_30_days = now - timedelta(days=30)

        qs = Call.objects.filter(
            company=company,
            created_at__gte=last_30_days
        )

        # Graph: calls per day
        calls_per_day = (
            qs.extra({'day': "date(created_at)"})
            .values('day')
            .annotate(total=Count('id'))
            .order_by('day')
        )

        summary = {
            "total_calls": qs.count(),
            "answered_calls": qs.filter(is_answered=True).count(),
            "missed_calls": qs.filter(is_answered=False).count(),
            "calls_graph": calls_per_day,
        }

        return Response(summary)

class CompanyDealershipsCallLogView(generics.ListAPIView):
    serializer_class = DealershipSerializer
    permission_classes = [IsAuthenticated, CompanyPermission('dealership_group_view_dealerships')]
    pagination_class = LimitOffsetPagination

    def get_queryset(self):
        company = self.request.user.active_company
        return Dealership.objects.filter(company=company).prefetch_related('calls')
