import logging
import traceback

from django.db.models.signals import post_save
from django.dispatch import receiver

from payments.gateways import AbstractGateway
from payments.models import Balance, Transaction
from payments.utils.emailing import balance_deposit_email
from vibes_auth.models import User

logger = logging.getLogger("django")


@receiver(post_save, sender=User)
def create_balance_on_user_creation_signal(instance, created, **_kwargs):
    if created:
        Balance.objects.create(user=instance)


@receiver(post_save, sender=Transaction)
def process_transaction_changes(instance, created, **_kwargs):
    if created:
        try:
            match instance.process.get("gateway", "default"):
                case "gateway":
                    gateway = AbstractGateway()
                case "default":
                    gateway = AbstractGateway()
                case _:
                    gateway = AbstractGateway()
            gateway.process_transaction(instance)
        except Exception as e:
            instance.process = {"status": "ERRORED", "error": str(e)}
            logger.error(f"Error processing transaction {instance.uuid}: {e}\n{traceback.format_exc()}")
    if not created:
        status = str(instance.process.get("status", "")).lower()
        success = instance.process.get("success", False)

        if ("success" in status or success) and (instance.process.get("notify", False)):
            balance_deposit_email.delay(instance.uuid)
