from django.db import models
from members.models import Member


class ContributionType(models.Model):
    name = models.CharField(max_length=50, unique=True)

    # Keywords used in Paybill Account Number
    # e.g. "tithe", "offering", "seed"
    keyword = models.CharField(
        max_length=50, blank=True,
        help_text='Paybill account keyword e.g. tithe'
    )

    class Meta:
        verbose_name_plural = 'Contribution Types'

    def __str__(self):
        return self.name


class PaymentMethod(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def __str__(self):
        return self.name


class Contribution(models.Model):
    SOURCE_CHOICES = [
        ('STK', 'M-Pesa STK Push'),
        ('C2B', 'M-Pesa Paybill'),
        ('CASH', 'Cash'),
        ('OTHER', 'Other'),
    ]
    STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('completed', 'Completed'),
        ('failed', 'Failed'),
    ]

    member = models.ForeignKey(
        Member, on_delete=models.SET_NULL,
        null=True, blank=True,
        related_name='contributions'
    )
    amount = models.DecimalField(max_digits=12, decimal_places=2)
    contribution_type = models.ForeignKey(
        ContributionType, on_delete=models.PROTECT,
        null=True, blank=True
    )
    payment_method = models.ForeignKey(
        PaymentMethod, on_delete=models.PROTECT,
        null=True, blank=True
    )
    source = models.CharField(
        max_length=10, choices=SOURCE_CHOICES, default='CASH'
    )
    status = models.CharField(
        max_length=10, choices=STATUS_CHOICES, default='completed'
    )

    # M-Pesa specific
    mpesa_receipt = models.CharField(
        max_length=50, blank=True, null=True, unique=True
    )
    phone_number = models.CharField(max_length=15, blank=True)
    checkout_request_id = models.CharField(max_length=100, blank=True)
    bill_ref_number = models.CharField(
        max_length=100, blank=True,
        help_text='Account number used in Paybill'
    )

    date = models.DateField()
    reference_number = models.CharField(max_length=100, blank=True)
    notes = models.TextField(blank=True)
    sms_sent = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-date', '-created_at']

    def __str__(self):
        name = self.member.full_name if self.member else 'Unknown'
        return f"{name} - KES {self.amount} ({self.source})"


class MpesaTransaction(models.Model):
    """Raw log of every M-Pesa callback received"""
    transaction_type = models.CharField(max_length=10)
    receipt_number = models.CharField(max_length=50, unique=True)
    phone_number = models.CharField(max_length=15)
    amount = models.DecimalField(max_digits=12, decimal_places=2)
    bill_ref_number = models.CharField(max_length=100, blank=True)
    raw_payload = models.JSONField()
    contribution = models.OneToOneField(
        Contribution, null=True, blank=True,
        on_delete=models.SET_NULL,
        related_name='mpesa_transaction'
    )
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.receipt_number} - KES {self.amount}"