# recharge/Models.py
from django.db import models
from django.utils import timezone

class Operator(models.Model):
    name = models.CharField(max_length=100)
    code = models.CharField(max_length=10)  # 🔓 uniqueness removed e.g., prepaid, postpaid, DTH
    # service_type = models.CharField(max_length=50, default='prepaid')
    service_type = models.CharField(max_length=50, default='unknown')  # e.g., Mobile, DTH, Electricity, PAN
    image_url = models.URLField(blank=True, null=True) 
    source = models.CharField(max_length=50, default='A1Topup')  # ✅ new field

    # NEW (safe, optional):
    number_label = models.CharField(max_length=100, blank=True, null=True)    # from "Number"
    optional1_label = models.CharField(max_length=100, blank=True, null=True) # from "OPTIONAL1"
    state = models.CharField(max_length=100, blank=True, null=True)           # from "STATE"
    
    def __str__(self):
        return self.name

class Circle(models.Model):
    name = models.CharField(max_length=100)
    code = models.CharField(max_length=10)  # 🔓 Uniqueness removed
    source = models.CharField(max_length=50, default='A1Topup')  # ✅ New field

    def __str__(self):
        return self.name


from django.conf import settings
from django.db import models
from django.utils import timezone

# Keep your existing choices
SERVICE_TYPE_CHOICES = [
    ('prepaid', 'Prepaid'),
    ('fastag', 'Fastag'),
    ('dth', 'DTH'),
    ('postpaid', 'Postpaid'),
    ('electricity', 'Electricity'),
    ('landline', 'Landline'),
    ('broadband', 'Broadband'),
    ('lpg', 'LPG'),
    ('gas', 'Gas'),
    ('insurance', 'Insurance'),
    ('water', 'Water'),
    ('loan', 'Loan'),
    ('pan', 'PAN'),
    ('others', 'Others'),
]

# If Operator / Circle are in the same app's models file above,
# you don't need to re-import. Otherwise:
# from recharge.models import Operator, Circle

class RechargeTransaction(models.Model):
    # NEW: owner of the transaction
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="recharge_txns",
        db_index=True,
        null=True,   # keep null=True for backfill; you can toggle later
        blank=True,
    )

    operator = models.ForeignKey('Operator', on_delete=models.CASCADE)
    circle   = models.ForeignKey('Circle', on_delete=models.SET_NULL, null=True, blank=True)

    number = models.CharField(max_length=15)
    amount = models.DecimalField(max_digits=10, decimal_places=2)

    # IDs
    order_id = models.CharField(max_length=100, unique=True)
    client_txn_id = models.CharField(max_length=10, unique=True, null=True, blank=True, db_index=True)
    # Provider extras
    provider_order_id = models.CharField(max_length=100, null=True, blank=True, db_index=True)
    operator_order_id     = models.CharField(max_length=100, blank=True, null=True, db_index=True)  # RefId
    provider_service      = models.CharField(max_length=50, blank=True, null=True)                  # Service
    provider_commission   = models.DecimalField(max_digits=12, decimal_places=3, blank=True, null=True)  # Comi (e.g., 2.990)
    provider_request_time = models.DateTimeField(blank=True, null=True)                            # reqTime
    provider_voucher_code = models.CharField(max_length=100, blank=True, null=True)                # VoucherCode

    # Recharge status
    status = models.CharField(
        max_length=20,
        choices=[
            ('Pending', 'Pending'),
            ('Success', 'Success'),
            ('Failure', 'Failure'),   # legacy-compatible
            ('Error', 'Error'),
        ],
        default='Pending',
    )
    status_message   = models.TextField(null=True, blank=True)
    status_updated_at = models.DateTimeField(null=True, blank=True)
    full_response         = models.JSONField(null=True, blank=True)
    full_response_updated_at = models.DateTimeField(null=True, blank=True)
    # Wallet / gateway usage
    used_ext_wallet     = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    used_viralpe_wallet = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    paid_via_gateway    = models.DecimalField(max_digits=10, decimal_places=2, default=0)

    # Razorpay fields
    razorpay_order_id   = models.CharField(max_length=100, null=True, blank=True)
    razorpay_payment_id = models.CharField(max_length=100, null=True, blank=True)

    # Advanced tracking
    response_data = models.JSONField(null=True, blank=True)
    service_type  = models.CharField(max_length=20, choices=SERVICE_TYPE_CHOICES, default='prepaid')
    created_at    = models.DateTimeField(auto_now_add=True)
    side_effects_done_at = models.DateTimeField(default=timezone.now)

    # Dispute / Refund tracking
    # NEW: canonical boolean going forward
    is_refunded = models.BooleanField(default=False)

    # Legacy (to be removed later) — keep for now so existing code doesn’t break.
    refund_status = models.CharField(
        max_length=20,
        choices=[
            ('None', 'None'),
            ('Requested', 'Requested'),
            ('Processed', 'Processed'),
        ],
        default='None',
        help_text="DEPRECATED: use is_refunded. Will be removed in a future migration.",
    )
    refund_notes = models.TextField(null=True, blank=True)
    refund_reason         = models.CharField(max_length=255, blank=True, null=True)

    # Legacy / optional
    operator_ref_id = models.CharField(max_length=100, blank=True, null=True)
    optional_code   = models.CharField(max_length=100, blank=True, null=True)

    class Meta:
        indexes = [
            models.Index(fields=['number', 'created_at']),
            models.Index(fields=['status', 'created_at']),
        ]

    def __str__(self):
        return f"{self.number} - INR{self.amount} - {self.status}"

    # Keep the boolean in sync when saving rows through the ORM.
    # (Note: queryset .update() bypasses this — do bulk updates explicitly.)
    def save(self, *args, **kwargs):
        # If legacy field present, keep boolean aligned
        self.is_refunded = (self.refund_status == 'Processed')
        super().save(*args, **kwargs)

# SERVICE_TYPE_CHOICES = [
#     ('prepaid', 'Prepaid'),
#     ('fastag', 'Fastag'),
#     ('dth', 'DTH'),
#     ('postpaid', 'Postpaid'),
#     ('electricity', 'Electricity'),
#     ('landline', 'Landline'),
#     ('broadband', 'Broadband'),
#     ('lpg', 'LPG'),
#     ('gas', 'Gas'),
#     ('insurance', 'Insurance'),
#     ('water', 'Water'),
#     ('loan', 'Loan'),
#     ('pan', 'PAN'),
#     ('others', 'Others'),
# ]

# from django.conf import settings
# from django.db import models

# class RechargeTransaction(models.Model):
#         # NEW: owner of the transaction
#     user = models.ForeignKey(
#         settings.AUTH_USER_MODEL,
#         on_delete=models.CASCADE,
#         related_name="recharge_txns",
#         db_index=True,
#         null=True,  # set null=True for the migration; you can make it False later after backfill
#         blank=True
#     )
#     operator = models.ForeignKey(Operator, on_delete=models.CASCADE)
#     circle = models.ForeignKey(Circle, on_delete=models.SET_NULL, null=True, blank=True)
#     number = models.CharField(max_length=15)
#     amount = models.DecimalField(max_digits=10, decimal_places=2)
#     order_id = models.CharField(max_length=100, unique=True)



#     # NEW: what we send to provider (<=10 chars), ensure uniqueness
#     client_txn_id = models.CharField(max_length=10, unique=True, null=True, blank=True, db_index=True)

#     # NEW: provider order id (Goter: orderId)
#     provider_order_id = models.CharField(max_length=100, null=True, blank=True, db_index=True)



#     # Recharge status
#     status = models.CharField(
#         max_length=20,
#         choices=[
#             ('Pending', 'Pending'),
#             ('Success', 'Success'),
#             ('Failure', 'Failure'),   # keep for backward compat; code maps FAILED->Failure
#             ('Error', 'Error'),       # optional but handy
#         ],
#         default='Pending'
#     )
#     status_message = models.TextField(null=True, blank=True)  # NEW: longer message body
#     status_updated_at = models.DateTimeField(null=True, blank=True)

#     # Wallet usage
#     used_ext_wallet = models.DecimalField(max_digits=10, decimal_places=2, default=0)
#     used_viralpe_wallet = models.DecimalField(max_digits=10, decimal_places=2, default=0)

#     # Razorpay fields
#     paid_via_gateway = models.DecimalField(max_digits=10, decimal_places=2, default=0)
#     razorpay_order_id = models.CharField(max_length=100, null=True, blank=True)
#     razorpay_payment_id = models.CharField(max_length=100, null=True, blank=True)

#     # Advanced tracking
#     response_data = models.JSONField(null=True, blank=True)
#     service_type = models.CharField(max_length=20, choices=SERVICE_TYPE_CHOICES, default='prepaid')
#     created_at = models.DateTimeField(auto_now_add=True)
#     # side_effects_done_at = models.DateTimeField(auto_now_add=True)
#     side_effects_done_at = models.DateTimeField(default=timezone.now)

#     # Dispute/Refund status
#     refund_status = models.CharField(max_length=20, choices=[
#         ('None', 'None'),
#         ('Requested', 'Requested'),
#         ('Processed', 'Processed'),
#     ], default='None')
#     is_refunded = models.BooleanField(default=False)  # NEW: simple true/false flag
#     refund_notes = models.TextField(null=True, blank=True)

#     # Legacy / optional
#     operator_ref_id = models.CharField(max_length=100, blank=True, null=True)
#     optional_code = models.CharField(max_length=100, blank=True, null=True)

#     class Meta:
#         indexes = [
#             models.Index(fields=['number', 'created_at']),
#             models.Index(fields=['status', 'created_at']),
#         ]

#     def __str__(self):
#         return f"{self.number} - INR{self.amount} - {self.status}"

# recharge/models.py
class RechargePlan(models.Model):
    operator = models.ForeignKey(Operator, on_delete=models.CASCADE)
    circle = models.ForeignKey(Circle, on_delete=models.CASCADE)
    group_name = models.CharField(max_length=100)  # e.g., Popular, Top Up
    plan_type = models.CharField(max_length=100, blank=True, null=True)  # Optional field
    data = models.CharField(max_length=50, blank=True, null=True)
    validity = models.CharField(max_length=50, blank=True, null=True)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)

    source = models.CharField(max_length=50, default='A1Topup')  # Helpful if importing from different vendors
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.group_name} - INR{self.price}"

    class Meta:
        unique_together = ('operator', 'circle', 'group_name','price')


class PlanCache(models.Model):
    """
    Caches the raw plans response for (provider_source, operator_code, circle_code).
    We store the provider payload as-is in JSON, along with a normalized
    'status' and an extracted 'plans' array for fast reads.
    """
    provider_source = models.CharField(max_length=50, db_index=True)  # e.g., "Goter"
    operator_code   = models.CharField(max_length=20, db_index=True)  # e.g., "AT"
    circle_code     = models.CharField(max_length=20, db_index=True)  # e.g., "1"
    status          = models.CharField(max_length=20, blank=True, null=True)
    plans           = models.JSONField(default=list, blank=True)      # normalized list
    raw_payload     = models.JSONField(default=dict, blank=True)      # original provider JSON

    fetched_at      = models.DateTimeField(auto_now_add=True)
    updated_at      = models.DateTimeField(auto_now=True)

    class Meta:
        unique_together = ("provider_source", "operator_code", "circle_code")
        indexes = [
            models.Index(fields=["provider_source", "operator_code", "circle_code"]),
        ]

    def __str__(self):
        return f"{self.provider_source}:{self.operator_code}:{self.circle_code}"

class MobileInfoMap(models.Model):
    mobile           = models.CharField(max_length=10, unique=True, db_index=True)
    provider_source  = models.CharField(max_length=32, default="Goter", db_index=True)

    operator_code    = models.CharField(max_length=20, db_index=True)
    circle_code      = models.CharField(max_length=20, db_index=True)

    operator_name    = models.CharField(max_length=100, blank=True, null=True)
    circle_name      = models.CharField(max_length=100, blank=True, null=True)

    last_payload     = models.JSONField(blank=True, null=True)   # optional audit/debug
    lookups          = models.PositiveIntegerField(default=0)

    first_seen       = models.DateTimeField(auto_now_add=True)
    last_seen        = models.DateTimeField(auto_now=True)

    class Meta:
        indexes = [
            models.Index(fields=["provider_source", "operator_code"]),
            models.Index(fields=["provider_source", "circle_code"]),
        ]

    def __str__(self):
        return f"{self.mobile} → {self.operator_code}/{self.circle_code}"


class ROfferCache(models.Model):
    provider_source = models.CharField(max_length=20, default="Goter")
    operator_code   = models.CharField(max_length=10, db_index=True)
    number          = models.CharField(max_length=30, db_index=True)  # mobile
    offers          = models.JSONField(null=True, blank=True)         # normalized list if available
    last_payload    = models.JSONField(null=True, blank=True)         # raw provider JSON
    lookups         = models.PositiveIntegerField(default=0)
    updated_at      = models.DateTimeField(auto_now=True)

    class Meta:
        unique_together = ("operator_code", "number")


class DTHInfoMap(models.Model):
    provider_source = models.CharField(max_length=20, default="Goter")
    operator_code   = models.CharField(max_length=10, db_index=True)   # e.g., AD
    number          = models.CharField(max_length=30, db_index=True)   # subscriber ID / VC / card
    account_name    = models.CharField(max_length=120, null=True, blank=True)
    status_message  = models.CharField(max_length=200, null=True, blank=True)
    last_payload    = models.JSONField(null=True, blank=True)
    lookups         = models.PositiveIntegerField(default=0)
    updated_at      = models.DateTimeField(auto_now=True)

    class Meta:
        unique_together = ("operator_code", "number")
