"""
VAS (Value Added Services) utility functions for Transaction Receipts
"""
from .models import TransactionReceipt
from django.contrib.auth import get_user_model

User = get_user_model()

def create_transaction_receipt(transaction_type, member_number, reference_number=None, generated_by=None, amount=None, customer_name=None, branch_name=None, transaction_date=None, receipt_data=None):
    """
    Create a transaction receipt for any transaction type
    
    Args:
        transaction_type (str): 'deposit', 'withdrawal', or 'share'
        member_number (str): Customer member number
        reference_number (str, optional): Transaction reference number
        generated_by (User, optional): User who generated the receipt
        amount (Decimal, optional): Transaction amount
        customer_name (str, optional): Customer name
        branch_name (str, optional): Branch name
        transaction_date (datetime, optional): Transaction date
        receipt_data (dict, optional): Complete receipt data as JSON
    
    Returns:
        TransactionReceipt: The created receipt object
    """
    try:
        receipt = TransactionReceipt.objects.create(
            transaction_type=transaction_type,
            member_number=member_number,
            reference_number=reference_number,
            generated_by=generated_by,
            amount=amount,
            customer_name=customer_name,
            branch_name=branch_name,
            transaction_date=transaction_date,
            receipt_data=receipt_data or {}
        )
        return receipt
    except Exception as e:
        # Log the error but don't break the main transaction flow
        print(f"Error creating transaction receipt: {e}")
        return None

def create_savings_receipt(transaction_type, customer_account, reference_number=None, generated_by=None, amount=None, branch_name=None, transaction_date=None):
    """
    Create a receipt for savings transactions (deposits/withdrawals)
    
    Args:
        transaction_type (str): 'deposit' or 'withdrawal'
        customer_account: SavingAccount object
        reference_number (str, optional): Transaction reference number
        generated_by (User, optional): User who generated the receipt
        amount (Decimal, optional): Transaction amount
        branch_name (str, optional): Branch name
        transaction_date (datetime, optional): Transaction date
    
    Returns:
        TransactionReceipt: The created receipt object
    """
    member_number = customer_account.account_customer.member_number
    customer_name = customer_account.account_customer.name
    
    # Create comprehensive receipt data
    receipt_data = {
        'account_number': customer_account.account_no,
        'product_name': customer_account.account_product.product_name if customer_account.account_product else None,
        'customer_id': customer_account.account_customer.id,
        'account_id': customer_account.id,
        'transaction_type': transaction_type,
        'amount': float(amount) if amount else None,
        'timestamp': transaction_date.isoformat() if transaction_date else None
    }
    
    return create_transaction_receipt(
        transaction_type=transaction_type,
        member_number=member_number,
        reference_number=reference_number,
        generated_by=generated_by,
        amount=amount,
        customer_name=customer_name,
        branch_name=branch_name,
        transaction_date=transaction_date,
        receipt_data=receipt_data
    )

def create_shares_receipt(transaction_type, shareholder, reference_number=None, generated_by=None):
    """
    Create a receipt for shares transactions
    
    Args:
        transaction_type (str): 'share'
        shareholder: ShareHolders object
        reference_number (str, optional): Transaction reference number
        generated_by (User, optional): User who generated the receipt
    
    Returns:
        TransactionReceipt: The created receipt object
    """
    member_number = shareholder.customer.member_number
    return create_transaction_receipt(
        transaction_type=transaction_type,
        member_number=member_number,
        reference_number=reference_number,
        generated_by=generated_by
    )
