"""
chat/forms.py

Forms for the Chat application.
"""

from django import forms
from django.utils.translation import gettext_lazy as _

from base.forms import ModelForm
from chat.models import ChatAttachment, ChatMessage, ChatRoom, ChatRoomMember
from employee.filters import EmployeeFilter
from employee.models import Employee
from horilla_widgets.widgets.horilla_multi_select_field import HorillaMultiSelectField
from horilla_widgets.widgets.select_widgets import HorillaMultiSelectWidget


class MultipleFileInput(forms.ClearableFileInput):
    """Widget that allows multiple file selection."""
    allow_multiple_selected = True


class MultipleFileField(forms.FileField):
    """Field that handles multiple file uploads."""

    def __init__(self, *args, **kwargs):
        kwargs.setdefault("widget", MultipleFileInput())
        super().__init__(*args, **kwargs)

    def clean(self, data, initial=None):
        single_file_clean = super().clean
        if isinstance(data, (list, tuple)):
            result = [single_file_clean(d, initial) for d in data]
        else:
            result = [single_file_clean(data, initial)]
        return result[0] if result else None


class ChatRoomForm(ModelForm):
    """
    Form for creating/editing a group chat room.
    """

    members = forms.ModelMultipleChoiceField(
        queryset=Employee.objects.filter(is_active=True),
        required=True,
        widget=forms.SelectMultiple(
            attrs={
                "class": "oh-select oh-select-2 select2-hidden-accessible",
                "multiple": "multiple",
            }
        ),
        label=_("Members"),
    )

    class Meta:
        model = ChatRoom
        fields = ["name", "description", "room_image"]
        widgets = {
            "name": forms.TextInput(
                attrs={"class": "oh-input w-100", "placeholder": _("Group Name")}
            ),
            "description": forms.Textarea(
                attrs={
                    "class": "oh-input w-100",
                    "rows": 3,
                    "placeholder": _("Group Description (optional)"),
                }
            ),
        }

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request", None)
        super().__init__(*args, **kwargs)
        
        # Filter members to same company as current user
        if self.request and hasattr(self.request.user, "employee_get"):
            current_employee = self.request.user.employee_get
            company = current_employee.get_company()
            if company:
                self.fields["members"].queryset = Employee.objects.filter(
                    is_active=True,
                    employee_work_info__company_id=company,
                ).exclude(id=current_employee.id)
            else:
                self.fields["members"].queryset = Employee.objects.filter(
                    is_active=True
                ).exclude(id=current_employee.id)


class ChatMessageForm(forms.Form):
    """
    Form for sending a chat message.
    """

    content = forms.CharField(
        required=False,
        widget=forms.Textarea(
            attrs={
                "class": "oh-input w-100",
                "rows": 1,
                "placeholder": _("Type a message..."),
                "id": "messageInput",
            }
        ),
    )
    attachments = MultipleFileField(
        required=False,
    )
    reply_to = forms.IntegerField(required=False, widget=forms.HiddenInput())

    def clean(self):
        cleaned_data = super().clean()
        content = cleaned_data.get("content", "").strip()
        attachments = self.files.getlist("attachments")

        if not content and not attachments:
            raise forms.ValidationError(
                _("Please enter a message or attach a file.")
            )
        return cleaned_data


class StartDirectChatForm(forms.Form):
    """
    Form for starting a direct chat with an employee.
    """

    employee_id = forms.ModelChoiceField(
        queryset=Employee.objects.filter(is_active=True),
        required=True,
        widget=forms.Select(
            attrs={"class": "oh-select oh-select-2 select2-hidden-accessible"}
        ),
        label=_("Employee"),
    )

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request", None)
        super().__init__(*args, **kwargs)
        
        # Filter employees to same company
        if self.request and hasattr(self.request.user, "employee_get"):
            current_employee = self.request.user.employee_get
            company = current_employee.get_company()
            if company:
                self.fields["employee_id"].queryset = Employee.objects.filter(
                    is_active=True,
                    employee_work_info__company_id=company,
                ).exclude(id=current_employee.id)
            else:
                self.fields["employee_id"].queryset = Employee.objects.filter(
                    is_active=True
                ).exclude(id=current_employee.id)


class AddMembersForm(forms.Form):
    """
    Form for adding members to a group chat.
    """

    def __init__(self, *args, **kwargs):
        self.chat_room = kwargs.pop("chat_room", None)
        self.request = kwargs.pop("request", None)
        super().__init__(*args, **kwargs)

        # Build queryset excluding existing members
        queryset = Employee.objects.filter(is_active=True)
        if self.chat_room:
            existing_member_ids = self.chat_room.members.values_list(
                "employee_id", flat=True
            )
            queryset = queryset.exclude(id__in=existing_member_ids)

        if self.request and hasattr(self.request.user, "employee_get"):
            current_employee = self.request.user.employee_get
            company = current_employee.get_company()
            if company:
                queryset = queryset.filter(employee_work_info__company_id=company)

        self.fields["members"] = HorillaMultiSelectField(
            queryset=queryset,
            widget=HorillaMultiSelectWidget(
                filter_route_name="employee-widget-filter",
                filter_class=EmployeeFilter,
                filter_instance_contex_name="f",
                filter_template_path="employee_filters.html",
            ),
            label=_("Members"),
        )

