"""
Test Accounting Integration
Creates a test journal entry manually to verify the system works
"""

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'branch_system.settings')
django.setup()

from accounting.services.integration_service import IntegrationService
from loans.models import Loan
from django.contrib.auth import get_user_model
from accounting.models import JournalEntry, GeneralLedger

User = get_user_model()

def test_integration():
    print("\n" + "="*70)
    print("  TESTING ACCOUNTING INTEGRATION")
    print("="*70 + "\n")
    
    # Get an active loan
    loan = Loan.objects.filter(status='active').first()
    if not loan:
        print("❌ No active loans found to test with")
        return
    
    print(f"Found loan: {loan.loan_number}")
    print(f"Principal: KES {loan.principal_amount:,.2f}")
    print(f"Borrower: {loan.borrower.get_full_name()}")
    
    # Check if journal entry already exists
    existing = JournalEntry.objects.filter(loan=loan, reference_number=f'LOAN-DISB-{loan.loan_number}').first()
    
    if existing:
        print(f"\n✅ Journal entry already exists: {existing.reference_number}")
        print(f"   Status: {existing.status}")
        print(f"   Date: {existing.transaction_date}")
        
        # Show GL entries
        gl_entries = GeneralLedger.objects.filter(journal_entry=existing)
        print(f"\n   General Ledger Entries ({gl_entries.count()}):")
        for gl in gl_entries:
            if gl.debit_amount > 0:
                print(f"   DR: {gl.account.code} - {gl.account.name}: KES {gl.debit_amount:,.2f}")
            else:
                print(f"   CR: {gl.account.code} - {gl.account.name}: KES {gl.credit_amount:,.2f}")
        return
    
    # Get admin user
    admin = User.objects.filter(role='admin').first()
    if not admin:
        admin = User.objects.first()
    
    print(f"\nCreating journal entry...")
    print(f"User: {admin.username if admin else 'None'}")
    
    try:
        # Create the journal entry
        integration_service = IntegrationService()
        journal_entry = integration_service.create_loan_disbursement_entry(loan, admin)
        
        print(f"\n✅ SUCCESS! Journal entry created:")
        print(f"   Reference: {journal_entry.reference_number}")
        print(f"   Status: {journal_entry.status}")
        print(f"   Date: {journal_entry.transaction_date}")
        
        # Show GL entries
        gl_entries = GeneralLedger.objects.filter(journal_entry=journal_entry)
        print(f"\n   General Ledger Entries ({gl_entries.count()}):")
        for gl in gl_entries:
            if gl.debit_amount > 0:
                print(f"   DR: {gl.account.code} - {gl.account.name}: KES {gl.debit_amount:,.2f}")
            else:
                print(f"   CR: {gl.account.code} - {gl.account.name}: KES {gl.credit_amount:,.2f}")
        
        print(f"\n   Balance after posting: KES {gl_entries.last().balance:,.2f}")
        
        print("\n" + "="*70)
        print("  ✅ ACCOUNTING INTEGRATION IS WORKING!")
        print("="*70)
        print("\nFrom now on, all new loans, repayments, and expenses will")
        print("automatically create journal entries like this one.")
        print("\nTo see it in action:")
        print("1. Create a new loan through the admin/interface")
        print("2. Check: /accounting/ or Django admin → Accounting → Journal Entries")
        print("3. You'll see automatic entries being created!")
        
    except Exception as e:
        print(f"\n❌ Error creating journal entry: {e}")
        import traceback
        traceback.print_exc()

if __name__ == '__main__':
    test_integration()
