from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

from core.views import _get_authenticated_user

from .models import Dispute, DisputeMessage
from .serializers import DisputeDetailSerializer, DisputeMessageSerializer


def _get_dispute_for_user(dispute_id, user):
	dispute = Dispute.objects.filter(id=dispute_id).select_related(
		"deal",
		"deal__seller",
		"deal__buyer",
		"raised_by",
		"assigned_to",
	).first()
	if dispute is None:
		return None, Response({"detail": "Dispute not found."}, status=status.HTTP_404_NOT_FOUND)

	participant_ids = {
		dispute.deal.seller_id,
		dispute.deal.buyer_id,
		dispute.raised_by_id,
		dispute.assigned_to_id,
	}
	if user.id not in participant_ids:
		return None, Response({"detail": "You are not allowed to access this dispute."}, status=status.HTTP_403_FORBIDDEN)

	return dispute, None


@api_view(["GET"])
def get_dispute_detail(request, dispute_id):
	user, auth_error = _get_authenticated_user(request)
	if auth_error:
		return Response({"detail": auth_error}, status=status.HTTP_401_UNAUTHORIZED)

	dispute, error_response = _get_dispute_for_user(dispute_id=dispute_id, user=user)
	if error_response:
		return error_response

	return Response(DisputeDetailSerializer(dispute).data, status=status.HTTP_200_OK)


@api_view(["POST"])
def post_dispute_message(request, dispute_id):
	user, auth_error = _get_authenticated_user(request)
	if auth_error:
		return Response({"detail": auth_error}, status=status.HTTP_401_UNAUTHORIZED)

	dispute, error_response = _get_dispute_for_user(dispute_id=dispute_id, user=user)
	if error_response:
		return error_response

	message_text = str(request.data.get("message") or "").strip()
	if not message_text:
		return Response({"detail": "message is required."}, status=status.HTTP_400_BAD_REQUEST)

	message = DisputeMessage.objects.create(dispute=dispute, sender=user, message=message_text)
	if dispute.status == Dispute.Status.OPEN:
		dispute.status = Dispute.Status.UNDER_REVIEW
		dispute.save(update_fields=["status"])

	return Response(DisputeMessageSerializer(message).data, status=status.HTTP_201_CREATED)
