from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
from django.db import IntegrityError
from rest_framework.exceptions import ValidationError

from apps.companies.models import DealershipDepartment
from apps.companies.serializers import (
    DealershipDepartmentSerializer,
    DealershipDepartmentCreateSerializer
)
from apps.permissions.permissions import CompanyPermission
from utils.paginations import LimitOffsetPagination


class DealershipDepartmentViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows dealership departments to be viewed or edited.
    """
    queryset = DealershipDepartment.objects.all().order_by('-created_at')
    pagination_class = LimitOffsetPagination

    def get_permissions(self):
        if self.action in ['create']:
            return [
                IsAuthenticated(),
                CompanyPermission('dealership_group_create_departments')
            ]
        elif self.action in ['update', 'partial_update', 'destroy']:
            return [
                IsAuthenticated(),
                CompanyPermission('dealership_group_edit_departments')
            ]
        return [
            IsAuthenticated(),
            CompanyPermission('dealership_group_view_departments')
        ]

    def get_queryset(self):
        queryset = super().get_queryset()
        dealership_id = self.request.query_params.get('dealership_id')

        if dealership_id:
            queryset = queryset.filter(dealership_id=dealership_id)

        return queryset

    def get_serializer_class(self):
        if self.action in ['create', 'update', 'partial_update']:
            return DealershipDepartmentCreateSerializer
        return DealershipDepartmentSerializer

    def _save(self, serializer):
        try:
            serializer.save()
        except IntegrityError:
            raise ValidationError({"detail": "Duplicate entry detected."})

    def perform_create(self, serializer):
        self._save(serializer)

    def perform_update(self, serializer):
        self._save(serializer)

    def perform_destroy(self, instance):
        instance.delete()
