from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import Http404, JsonResponse
from django.shortcuts import get_object_or_404, redirect
from django.views import View
from django.views.generic import DetailView, ListView

from order_module.models import Order
from product_module.models import Product

from .models import ChatMessage, ChatRoom


class ChatRoomListView(LoginRequiredMixin, ListView):
    model = ChatRoom
    template_name = "chat_module/chat_list.html"
    context_object_name = "rooms"

    def get_queryset(self):
        qs = ChatRoom.objects.select_related("user", "product", "order")

        if self.request.user.is_staff:
            return qs.order_by("-updated_at")

        return qs.filter(user=self.request.user).order_by("-updated_at")


class ChatDetailView(LoginRequiredMixin, DetailView):
    model = ChatRoom
    template_name = "chat_module/chat_detail.html"
    context_object_name = "room"
    pk_url_kwarg = "room_id"

    def get_object(self, queryset=None):
        room = get_object_or_404(
            ChatRoom.objects.select_related("user", "product", "order"),
            pk=self.kwargs["room_id"],
        )

        if not self.request.user.is_staff and room.user != self.request.user:
            raise Http404("شما به این گفتگو دسترسی ندارید")

        return room

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        room = self.object

        room.messages.filter(is_seen=False).exclude(sender=self.request.user).update(
            is_seen=True
        )

        context["messages"] = room.messages.select_related("sender").order_by("created_at")
        return context


class SendMessageView(LoginRequiredMixin, View):
    def post(self, request, *args, **kwargs):
        room_id = request.POST.get("room_id")
        message = (request.POST.get("message") or "").strip()

        if not room_id or not message:
            return JsonResponse(
                {"status": "error", "message": "اطلاعات ارسال ناقص است."},
                status=400,
            )

        room = get_object_or_404(ChatRoom, id=room_id)

        if room.is_closed:
            return JsonResponse(
                {"status": "error", "message": "این گفتگو بسته شده است."},
                status=400,
            )

        if not request.user.is_staff and room.user != request.user:
            return JsonResponse(
                {"status": "error", "message": "شما دسترسی به این گفتگو ندارید."},
                status=403,
            )

        chat_message = ChatMessage.objects.create(
            room=room,
            sender=request.user,
            message=message,
        )

        room.save()

        return JsonResponse(
            {
                "status": "success",
                "message_id": chat_message.id,
                "text": chat_message.message,
                "sender": request.user.username,
                "sender_id": request.user.id,
                "created_at": chat_message.created_at.strftime("%Y-%m-%d %H:%M"),
                "is_seen": chat_message.is_seen,
            }
        )


class FetchMessagesView(LoginRequiredMixin, View):
    def get(self, request, room_id, *args, **kwargs):
        room = get_object_or_404(ChatRoom, id=room_id)

        if not request.user.is_staff and room.user != request.user:
            return JsonResponse(
                {"status": "error", "message": "دسترسی ندارید."},
                status=403,
            )

        messages = room.messages.select_related("sender").order_by("created_at")

        last_id = request.GET.get("last_id")
        if last_id and str(last_id).isdigit():
            messages = messages.filter(id__gt=int(last_id))

        room.messages.filter(is_seen=False).exclude(sender=request.user).update(
            is_seen=True
        )

        data = [
            {
                "id": msg.id,
                "text": msg.message,
                "sender": msg.sender.username,
                "sender_id": msg.sender.id,
                "created_at": msg.created_at.strftime("%Y-%m-%d %H:%M"),
                "is_seen": msg.is_seen,
                "is_mine": msg.sender_id == request.user.id,
            }
            for msg in messages
        ]

        return JsonResponse({"status": "success", "messages": data})


class CreateProductChatRoomView(LoginRequiredMixin, View):
    def get(self, request, product_id, *args, **kwargs):
        product = get_object_or_404(Product, id=product_id)

        room, _ = ChatRoom.objects.get_or_create(
            user=request.user,
            product=product,
            order=None,
            defaults={"subject": f"گفتگو درباره محصول: {product.title}"},
        )

        return redirect("chat:chat-detail", room_id=room.id)


class CreateOrderChatRoomView(LoginRequiredMixin, View):
    def get(self, request, order_id, *args, **kwargs):
        order = get_object_or_404(Order, id=order_id)

        if not request.user.is_staff and order.user != request.user:
            raise Http404("شما به این سفارش دسترسی ندارید")

        room, _ = ChatRoom.objects.get_or_create(
            user=order.user,
            order=order,
            product=None,
            defaults={"subject": f"گفتگو درباره سفارش #{order.id}"},
        )

        return redirect("chat:chat-detail", room_id=room.id)
