from django.core.management.base import BaseCommand
from django.db import transaction
from decimal import Decimal
from apps.banking.models import Account, Transaction
from apps.authentication.models import User


class Command(BaseCommand):
    help = "Test les signaux de mise à jour automatique des soldes dans le backend"

    def handle(self, *args, **options):
        self.stdout.write("🧪 TEST DES SIGNAUX DJANGO - Backend COOP-CA AMIFOND")
        self.stdout.write("=" * 60)

        # Trouver deux comptes pour faire un test de transaction
        accounts = Account.objects.all()[:2]

        if len(accounts) < 2:
            self.stdout.write(
                self.style.ERROR("❌ Au moins 2 comptes requis pour le test")
            )
            return

        from_account = accounts[0]
        to_account = accounts[1]

        self.stdout.write(f"🏦 Compte source: {from_account.name}")
        self.stdout.write(f"💰 Solde initial source: {from_account.balance} FCFA")
        self.stdout.write(f"🏦 Compte destination: {to_account.name}")
        self.stdout.write(f"💰 Solde initial destination: {to_account.balance} FCFA")

        # Test: Créer une transaction entre les deux comptes
        self.stdout.write(f"\n🧪 TEST: Création d'une transaction...")

        initial_balance_source = from_account.balance
        initial_balance_dest = to_account.balance
        test_amount = Decimal("5000.00")

        self.stdout.write(f"   💰 Montant: {test_amount} FCFA")
        self.stdout.write(f"   📊 Source initial: {initial_balance_source} FCFA")
        self.stdout.write(f"   📊 Destination initial: {initial_balance_dest} FCFA")

        try:
            with transaction.atomic():
                # Créer une transaction de test (structure backend: from_account/to_account)
                test_transaction = Transaction.objects.create(
                    from_account=from_account,
                    to_account=to_account,
                    amount=test_amount,
                    description=f"Test signal automatique backend",
                    category="TEST",
                )

                self.stdout.write(f"   ✅ Transaction créée: ID {test_transaction.id}")

                # Recharger les comptes depuis la DB
                from_account.refresh_from_db()
                to_account.refresh_from_db()

                new_balance_source = from_account.balance
                new_balance_dest = to_account.balance
                expected_balance_source = initial_balance_source - test_amount
                expected_balance_dest = initial_balance_dest + test_amount

                self.stdout.write(
                    f"   💰 Nouveau solde source: {new_balance_source} FCFA"
                )
                self.stdout.write(
                    f"   💰 Nouveau solde destination: {new_balance_dest} FCFA"
                )
                self.stdout.write(
                    f"   📊 Attendu source: {expected_balance_source} FCFA"
                )
                self.stdout.write(
                    f"   📊 Attendu destination: {expected_balance_dest} FCFA"
                )

                source_correct = new_balance_source == expected_balance_source
                dest_correct = new_balance_dest == expected_balance_dest

                if source_correct and dest_correct:
                    self.stdout.write(
                        self.style.SUCCESS(
                            "   ✅ SIGNAUX FONCTIONNENT ! Les soldes ont été mis à jour automatiquement"
                        )
                    )
                    success = True
                else:
                    self.stdout.write(
                        self.style.ERROR(
                            "   ❌ SIGNAUX NE FONCTIONNENT PAS CORRECTEMENT"
                        )
                    )
                    if not source_correct:
                        self.stdout.write(
                            f"      ❌ Source: différence {new_balance_source - expected_balance_source}"
                        )
                    if not dest_correct:
                        self.stdout.write(
                            f"      ❌ Destination: différence {new_balance_dest - expected_balance_dest}"
                        )
                    success = False

                # Nettoyer - supprimer la transaction de test et restaurer les soldes
                test_transaction.delete()
                Account.objects.filter(id=from_account.id).update(
                    balance=initial_balance_source
                )
                Account.objects.filter(id=to_account.id).update(
                    balance=initial_balance_dest
                )
                self.stdout.write(
                    "   🧹 Transaction de test supprimée et soldes restaurés"
                )

                if success:
                    self.stdout.write(
                        self.style.SUCCESS(
                            "\n✅ Les signaux du backend fonctionnent correctement !"
                        )
                    )
                else:
                    self.stdout.write(
                        self.style.ERROR(
                            "\n❌ Les signaux du backend ne fonctionnent pas correctement"
                        )
                    )
                    self.stdout.write("💡 Vérifiez que:")
                    self.stdout.write(
                        "   - Le module apps.banking.signals est importé dans apps.py"
                    )
                    self.stdout.write(
                        "   - Les signaux @receiver sont correctement configurés"
                    )
                    self.stdout.write(
                        "   - Django a redémarré pour charger les nouveaux signaux"
                    )

        except Exception as e:
            self.stdout.write(self.style.ERROR(f"   ❌ Erreur lors du test: {e}"))
            import traceback

            self.stdout.write(traceback.format_exc())
