from datetime import timedelta

import jwt
from django.conf import settings
from django.utils import timezone
from rest_framework.test import APITestCase

from core.models import User
from escrow.models import Deal

from .models import Dispute


class DisputesApiTests(APITestCase):
	def setUp(self):
		super().setUp()
		self.seller = User.objects.create(phone="+255711000001", role=User.Role.SELLER)
		self.buyer = User.objects.create(phone="+255711000002", role=User.Role.BUYER)
		self.deal = Deal.objects.create(
			seller=self.seller,
			buyer=self.buyer,
			code="DSPT1234",
			title="Camera",
			description="Mirrorless",
			amount="750000.00",
			fee="0.00",
			net_amount="750000.00",
			status=Deal.Status.DISPUTED,
			has_dispute=True,
		)
		self.dispute = Dispute.objects.create(
			deal=self.deal,
			raised_by=self.buyer,
			reason_category="item_not_received",
			reason_detail="Item never arrived",
		)

	def _token_for_user(self, user):
		return jwt.encode(
			{
				"sub": str(user.id),
				"phone": user.phone,
				"role": user.role,
				"type": "access",
				"iat": int(timezone.now().timestamp()),
				"exp": int((timezone.now() + timedelta(minutes=60)).timestamp()),
			},
			settings.JWT_SECRET_KEY,
			algorithm=settings.JWT_ALGORITHM,
		)

	def _auth_headers(self, user):
		return {"HTTP_AUTHORIZATION": f"Bearer {self._token_for_user(user)}"}

	def test_get_dispute_detail_returns_messages(self):
		message_response = self.client.post(
			f"/api/v1/disputes/{self.dispute.id}/message",
			{"message": "Please share shipping proof"},
			format="json",
			**self._auth_headers(self.seller),
		)
		self.assertEqual(message_response.status_code, 201)

		detail_response = self.client.get(
			f"/api/v1/disputes/{self.dispute.id}",
			**self._auth_headers(self.buyer),
		)
		self.assertEqual(detail_response.status_code, 200)
		self.assertEqual(str(detail_response.data["id"]), str(self.dispute.id))
		self.assertEqual(len(detail_response.data["messages"]), 1)

	def test_non_participant_cannot_access_dispute(self):
		outsider = User.objects.create(phone="+255711000099", role=User.Role.BUYER)
		response = self.client.get(
			f"/api/v1/disputes/{self.dispute.id}",
			**self._auth_headers(outsider),
		)
		self.assertEqual(response.status_code, 403)
