from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action

from apps.companies.models import Holiday
from apps.companies.serializers.holidays import HolidaySerializer
from apps.companies.services.holiday_service import HolidayService
from apps.companies.mixins.active_company import ActiveCompanyMixin
from apps.companies.mixins.permission_by_action import PermissionByActionMixin
from apps.companies.utils import apply_holidays_to_all_companies


class HolidayViewSetOnHold(
    ActiveCompanyMixin,
    PermissionByActionMixin,
    ModelViewSet
):
    serializer_class = HolidaySerializer

    permission_map = {
        'list': 'view_holidays',
        'retrieve': 'view_holidays',
        'create': 'edit_holidays',
        'update': 'edit_holidays',
        'partial_update': 'edit_holidays',
        'destroy': 'edit_holidays',
    }

    def get_queryset(self):
        return Holiday.objects.filter(
            company=self.get_active_company()
        ).prefetch_related('bots').order_by('start_date')

    def perform_create(self, serializer):
        HolidayService.create(
            company=self.get_active_company(),
            user=self.request.user,
            serializer=serializer
        )

    def perform_update(self, serializer):
        HolidayService.update(
            company=self.get_active_company(),
            user=self.request.user,
            instance=self.get_object(),
            serializer=serializer
        )

    def perform_destroy(self, instance):
        HolidayService.delete(
            company=self.get_active_company(),
            user=self.request.user,
            instance=instance
        )

    @action(detail=False, methods=['post'])
    def apply_to_all_companies(self, request):
        return apply_holidays_to_all_companies(request)
