from django.db import models
from uuid import uuid4


class Deal(models.Model):
	class Status(models.TextChoices):
		DRAFT = "draft", "Draft"
		AWAITING_PAYMENT = "awaiting_payment", "Awaiting Payment"
		FUNDED = "funded", "Funded"
		IN_TRANSIT = "in_transit", "In Transit"
		CONFIRMING = "confirming", "Confirming"
		COMPLETED = "completed", "Completed"
		DISPUTED = "disputed", "Disputed"
		CANCELLED = "cancelled", "Cancelled"
		REFUNDED = "refunded", "Refunded"

	id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
	code = models.CharField(max_length=10, unique=True, db_index=True)
	title = models.CharField(max_length=200)
	description = models.TextField()
	amount = models.DecimalField(max_digits=15, decimal_places=2)
	fee = models.DecimalField(max_digits=15, decimal_places=2)
	net_amount = models.DecimalField(max_digits=15, decimal_places=2)
	status = models.CharField(max_length=20, choices=Status.choices, db_index=True)
	inspection_window_hours = models.PositiveSmallIntegerField(default=72)

	seller = models.ForeignKey(
		"core.User",
		on_delete=models.CASCADE,
		related_name="seller_deals",
	)
	buyer = models.ForeignKey(
		"core.User",
		on_delete=models.SET_NULL,
		related_name="buyer_deals",
		null=True,
		blank=True,
	)

	funded_at = models.DateTimeField(null=True, blank=True)
	shipped_at = models.DateTimeField(null=True, blank=True)
	confirmed_at = models.DateTimeField(null=True, blank=True)
	auto_release_at = models.DateTimeField(null=True, blank=True)
	tracking_info = models.CharField(max_length=100, null=True, blank=True)
	has_dispute = models.BooleanField(default=False)

	class Meta:
		db_table = "deals"

	def __str__(self):
		return self.code


class Transaction(models.Model):
	class EventType(models.TextChoices):
		DEAL_CREATED = "deal_created", "Deal Created"
		PAYMENT_RECEIVED = "payment_received", "Payment Received"
		FEE_CHARGED = "fee_charged", "Fee Charged"
		PAYOUT_RELEASED = "payout_released", "Payout Released"
		REFUND_ISSUED = "refund_issued", "Refund Issued"

	id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
	deal = models.ForeignKey("escrow.Deal", on_delete=models.CASCADE, related_name="transactions")
	user = models.ForeignKey("core.User", on_delete=models.SET_NULL, related_name="transactions", null=True, blank=True)
	amount = models.DecimalField(max_digits=15, decimal_places=2)
	currency = models.CharField(max_length=3, default="TZS")
	event_type = models.CharField(max_length=32, choices=EventType.choices, db_index=True)
	reference = models.CharField(max_length=120, unique=True)
	metadata = models.JSONField(default=dict, blank=True)
	created_at = models.DateTimeField(auto_now_add=True)

	class Meta:
		db_table = "transactions"

	def __str__(self):
		return self.reference
