from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from django.db import transaction
from apps.credits.models import CreditProduct, LoanApplication, Loan
from apps.members.models import Member
from apps.banking.models import Account

class Command(BaseCommand):
    help = 'Initializes basic credits data: creates a credit product, loan application, loan, and repayment.'

    def handle(self, *args, **options):
        User = get_user_model()

        self.stdout.write(self.style.SUCCESS('--- Initializing Credits Data ---'))

        try:
            regular_user = User.objects.get(email='user@example.com')
            superuser = User.objects.get(email='admin@example.com')
            member = regular_user.customer.member
            member_current_account = Account.objects.get(owner=regular_user, type=Account.AccountType.CURRENT)
            coop_loan_fund_account = Account.objects.get(owner=superuser, type=Account.AccountType.LOAN_FUND)
        except (User.DoesNotExist, Member.DoesNotExist, Account.DoesNotExist):
            self.stdout.write(self.style.ERROR('Required users, member, or accounts not found. Please run init_auth_data, init_customers_data, init_members_data, and init_banking_data first.'))
            return

        with transaction.atomic():
            # Create CreditProduct
            credit_product_name = 'Prêt Personnel Standard'
            credit_product, created = CreditProduct.objects.get_or_create(
                name=credit_product_name,
                defaults={
                    'description': 'Prêt à la consommation pour les membres.',
                    'min_amount': 1000.00,
                    'max_amount': 10000.00,
                    'interest_rate': 5.00,
                    'max_duration_months': 12,
                    'created_by': superuser
                }
            )
            if created:
                self.stdout.write(self.style.SUCCESS(f'CreditProduct "{credit_product_name}" created.'))
            else:
                self.stdout.write(self.style.WARNING(f'CreditProduct "{credit_product_name}" already exists.'))

            # Create LoanApplication
            loan_application_amount = 5000.00
            loan_application_duration = 6
            loan_application, created = LoanApplication.objects.get_or_create(
                member=member,
                credit_product=credit_product,
                requested_amount=loan_application_amount,
                requested_duration_months=loan_application_duration,
                defaults={'created_by': regular_user}
            )
            if created:
                self.stdout.write(self.style.SUCCESS(f'LoanApplication for {member.user.email} created.'))
            else:
                self.stdout.write(self.style.WARNING(f'LoanApplication for {member.user.email} already exists.'))

            # Approve LoanApplication
            if loan_application.status == LoanApplication.ApplicationStatus.PENDING:
                self.stdout.write(f'Approving LoanApplication for {member.user.email}...')
                try:
                    loan_application.approve(by_user=superuser)
                    self.stdout.write(self.style.SUCCESS('LoanApplication approved.'))
                except ValueError as e:
                    self.stdout.write(self.style.ERROR(f'Error approving LoanApplication: {e}'))
            else:
                self.stdout.write(self.style.WARNING(f'LoanApplication for {member.user.email} is already {loan_application.get_status_display()}. '))

            # Disburse Loan (assuming it's approved and not yet disbursed)
            if loan_application.status == LoanApplication.ApplicationStatus.APPROVED and not hasattr(loan_application, 'loan_instance'):
                self.stdout.write(f'Disbursing Loan for {member.user.email}...')
                try:
                    loan = Loan.objects.create(
                        loan_application=loan_application,
                        member=member,
                        credit_product=credit_product,
                        disbursed_amount=loan_application.approved_amount,
                        interest_rate=credit_product.interest_rate,
                        duration_months=loan_application.approved_duration_months,
                        created_by=superuser
                    )
                    loan.disburse(by_user=superuser, from_account=coop_loan_fund_account)
                    self.stdout.write(self.style.SUCCESS('Loan disbursed.'))
                except ValueError as e:
                    self.stdout.write(self.style.ERROR(f'Error disbursing Loan: {e}'))
            else:
                self.stdout.write(self.style.WARNING(f'Loan for {member.user.email} is already disbursed or not approved.'))

            # Make a Repayment (assuming loan exists and is active)
            if hasattr(loan_application, 'loan_instance') and loan_application.loan_instance.status == Loan.LoanStatus.ACTIVE:
                loan = loan_application.loan_instance
                repayment_amount = loan.disbursed_amount / loan.duration_months # Simple monthly repayment
                if loan.total_repaid < loan.disbursed_amount:
                    self.stdout.write(f'Making Repayment for Loan {loan.id}...')
                    try:
                        loan.make_repayment(
                            amount=repayment_amount,
                            by_user=regular_user,
                            from_account=member_current_account,
                            to_account=coop_loan_fund_account # Assuming loan fund account receives repayments
                        )
                        self.stdout.write(self.style.SUCCESS('Repayment made successfully.'))
                    except ValueError as e:
                        self.stdout.write(self.style.ERROR(f'Error making Repayment: {e}'))
                else:
                    self.stdout.write(self.style.WARNING(f'Loan {loan.id} is already fully repaid.'))
            else:
                self.stdout.write(self.style.WARNING(f'Loan for {member.user.email} is not active or does not exist for repayment.'))

        self.stdout.write(self.style.SUCCESS('--- Credits Data Initialization Complete ---'))
