import logging
import os

from django.contrib.auth.mixins import UserPassesTestMixin
from django.shortcuts import get_object_or_404

from tickets.models import *


log = logging.getLogger(__name__)


class SuperuserStaffRequiredMixin(UserPassesTestMixin):
    def test_func(self):
        return self.request.user.is_superuser or self.request.user.is_staff


class UserCanReadTicketListMixin(UserPassesTestMixin):
    def test_func(self):
        ticket_list = get_object_or_404(TicketList.objects.select_related('group'), pk=self.kwargs.get('pk'))
        return self.request.user.is_superuser or ticket_list.group in self.request.user.groups.all()


class UserCanReadTicketMixin(UserPassesTestMixin):
    def test_func(self):
        ticket = get_object_or_404(Ticket.objects.select_related('ticket_list', 'ticket_list__group'), pk=self.kwargs.get('pk'))
        return self.request.user.is_superuser or ticket.ticket_list.group in self.request.user.groups.all() or ticket.assigned_to == self.request.user


class UserCanWriteTicketMixin(UserPassesTestMixin):
    def test_func(self):
        ticket = get_object_or_404(Ticket.objects.all(), pk=self.kwargs.get('pk'))
        return self.request.user.is_superuser or self.request.user.is_staff or ticket.created_by == self.request.user


def remove_attachment_file(attachment_id: int) -> bool:
    """Delete an Attachment object and its corresponding file from the filesystem."""
    try:
        attachment = Attachment.objects.get(id=attachment_id)
        if attachment.file:
            if os.path.isfile(attachment.file.path):
                os.remove(attachment.file.path)

        attachment.delete()
        return True

    except Attachment.DoesNotExist:
        log.info(f"Attachment {attachment_id} not found.")
        return False