from calendar import monthrange
from datetime import date
from decimal import Decimal

from django.utils import timezone


def _is_last_day(current_date):
    return current_date.day == monthrange(current_date.year, current_date.month)[1]


def create_withdrawal_request(user, enforce_last_day=True):
    """Create a monthly withdrawal request from main wallet's available balance."""
    from apps.business.wallet.models import Wallet
    from apps.business.withdrawals.models import BankAccount
    from apps.business.withdrawals.services.withdrawal_service import create_withdrawal_request as base_create_withdrawal

    wallet, _ = Wallet.objects.get_or_create(user=user)
    available = Decimal(wallet.main_balance) - Decimal(wallet.locked_amount)
    if available <= Decimal('0.00'):
        return None

    primary_bank = (
        BankAccount.objects.filter(user=user, is_active=True, is_verified=True)
        .order_by('-is_primary', '-created_at')
        .first()
    )
    return base_create_withdrawal(user, available, bank_account=primary_bank, enforce_last_day=enforce_last_day)


def monthly_withdrawal_job(run_date=None, force=False):
    """Create one pending withdrawal per eligible user on the last day of month."""
    current_date = run_date or timezone.now().date()
    if not force and not _is_last_day(current_date):
        return {'created': 0, 'skipped': 'not_last_day'}

    from apps.business.wallet.models import Wallet

    created = 0
    for wallet in Wallet.objects.select_related('user').all():
        try:
            result = create_withdrawal_request(wallet.user, enforce_last_day=not force)
            if result is not None:
                created += 1
        except Exception:
            continue

    return {'date': current_date.isoformat(), 'created': created}
