import logging
from django.db import IntegrityError, transaction
from django.utils import timezone
from rest_framework import viewsets
from rest_framework.exceptions import ValidationError

from apps.companies.constants import CompanyType
from apps.companies.serializers import (
    DealershipSerializer,
    DealershipCreateSerializer
)

from apps.permissions.models import UserCompanyRole, Role
from apps.permissions.permissions import CompanyPermission
from apps.permissions.services import set_active_company, sync_companies
from utils.paginations import LimitOffsetPagination


logger = logging.getLogger(__name__)


class DealershipViewSet(viewsets.ModelViewSet):
    serializer_class = DealershipSerializer
    permission_classes = []
    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):
        return self.request.user.companies.filter(
            company_type=CompanyType.DEALERSHIP,
        )

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

    @transaction.atomic
    def perform_create(self, serializer):
        try:
            instance = serializer.save(
                company_type=CompanyType.DEALERSHIP,
            )

            role = Role.objects.filter(
                company=instance,
            ).first()

            if not role:
                logger.warning(f"Get No Role")
                return

            user = self.request.user

            memberships = []

            membership, created = UserCompanyRole.objects.get_or_create(
                user=user,
                company_id=instance.id,
                defaults={
                    'role':role,

                    'first_name':user.profile.first_name,
                    'last_name':user.profile.last_name,

                    'invited_at':timezone.now(),
                    'is_active':True,
                    'is_default':False,
                    'is_owner':False,
                    'is_available':True,

                    'phone':user.profile.phone_number,
                    'designation':role.name,
                    # 'image':image,

                    'created_by':user
                }
            )

            memberships.append(membership)

            sync_companies(user)
            set_active_company(user, memberships)

        except IntegrityError as e:
            if "unique" in str(e).lower():
                raise ValidationError({
                    "name": "A dealership with this name already exists."
                })
            raise e

    def perform_update(self, serializer):
        try:
            serializer.save(
                company_type=CompanyType.DEALERSHIP,
            )
        except IntegrityError as e:
            if "unique" in str(e).lower():
                raise ValidationError({
                    "name": "A dealership with this name already exists."
                })
            raise e
