# yourapp/helpers/receipts.py

from datetime import datetime


def get_receipt_type_mapping(transaction_type: str):
    """Maps transaction types to ReceiptConfig types."""
    mapping = {
        'deposit': 'DEPOSIT_RECEIPT',
        'withdrawal': 'WITHDRAWAL_RECEIPT',
        'share': 'SHARE_PURCHASE_RECEIPT',
    }
    return mapping.get(transaction_type)


def format_receipt_number(config):
    """Applies formatting rules defined in ReceiptConfig."""
    num = str(config.current_number).zfill(len(str(config.start_number)))

    receipt = config.format \
        .replace('{prefix}', config.prefix) \
        .replace('{number}', num)

    if config.include_date:
        receipt = receipt.replace('{date}', datetime.now().strftime('%Y%m%d'))

    if config.include_time:
        receipt = receipt.replace('{time}', datetime.now().strftime('%H%M%S'))

    # NOTE: Replace these placeholder values later:
    if config.include_branch_code:
        receipt = receipt.replace('{branch_code}', 'BR001')

    if config.include_org_code:
        receipt = receipt.replace('{org_code}', 'ORG001')

    return receipt


def generate_receipt_number_for_transaction(transaction):
    """
    Generates the receipt number using ReceiptConfig.
    Returns None if no config exists.
    """
    from vas.models import ReceiptConfig

    receipt_type = get_receipt_type_mapping(transaction.transaction_type)
    if not receipt_type:
        return None

    config = ReceiptConfig.objects.filter(
        receipt_type=receipt_type,
        is_active=True
    ).first()

    if not config:
        return None

    # Increase sequence
    config.current_number += config.increment_by
    config.save()

    # Build final receipt number
    return format_receipt_number(config)
