from django.db import transaction
from django.utils import timezone

from apps.business.orders.models import Order
from apps.business.orders.services.order_service import _record_part_payment_log


def process_elapsed_part_payment_orders(limit=200):
    """
    Convert elapsed part-payment orders after cooling period.

    Returns summary dict with converted and failed counts.
    """
    now = timezone.now()
    scope = (
        Order.objects
        .select_related('part_payment_conversion_product')
        .filter(
            payment_mode='PART',
            ownership_status='PARTIAL_OWNED',
            is_availability_blocked=True,
            part_pending_amount__gt=0,
            part_payment_due_at__isnull=False,
            part_payment_due_at__lte=now,
        )
        .order_by('part_payment_due_at')[:limit]
    )

    converted = 0
    failed = 0

    for order in scope:
        try:
            with transaction.atomic():
                _record_part_payment_log(
                    order,
                    'COOLING_ELAPSED',
                    metadata={
                        'due_at': order.part_payment_due_at.isoformat() if order.part_payment_due_at else None,
                        'pending_amount': str(order.part_pending_amount),
                    },
                )

                if order.part_payment_conversion_product_id:
                    order.ownership_status = 'CONVERTED'
                    order.part_payment_converted_at = now
                    order.is_availability_blocked = False
                    order.part_payment_conversion_notes = (
                        f"Converted to {order.part_payment_conversion_product.name} after cooling elapsed."
                    )
                    order.save(update_fields=[
                        'ownership_status',
                        'part_payment_converted_at',
                        'is_availability_blocked',
                        'part_payment_conversion_notes',
                        'updated_at',
                    ])
                    _record_part_payment_log(
                        order,
                        'CONVERTED',
                        metadata={
                            'conversion_product_id': str(order.part_payment_conversion_product_id),
                            'conversion_product_name': order.part_payment_conversion_product.name,
                        },
                    )
                    converted += 1
                else:
                    order.ownership_status = 'CONVERTED'
                    order.part_payment_converted_at = now
                    order.part_payment_conversion_notes = (
                        'Cooling elapsed but no conversion product configured.'
                    )
                    order.save(update_fields=[
                        'ownership_status',
                        'part_payment_converted_at',
                        'part_payment_conversion_notes',
                        'updated_at',
                    ])
                    _record_part_payment_log(
                        order,
                        'CONVERSION_FAILED',
                        metadata={'reason': 'No conversion product configured'},
                    )
                    failed += 1
        except Exception as exc:
            failed += 1
            _record_part_payment_log(
                order,
                'CONVERSION_FAILED',
                metadata={'reason': str(exc)},
            )

    return {
        'scanned': len(scope),
        'converted': converted,
        'failed': failed,
    }
