from django.contrib.auth import get_user_model
from django.core.mail import send_mail
from django.conf import settings
from package_details.utils import get_user_total_space_used
from user_ads_package.models.userpackage import UserPackage

User = get_user_model()

def check_and_notify_low_space_users(user=None):
    users = [user] if user else User.objects.filter(is_active=True)

    for user in users:
        user_package = (
            UserPackage.objects.select_related("package")
            .filter(user=user)
            .order_by("-end_date", "-id")
            .first()
        )
        if not user_package or not user_package.package:
            continue

        used = get_user_total_space_used(user)
        limit = float(user_package.total_space or user_package.package.space or 0)
        if limit <= 0:
            continue

        percent = (used / limit) * 100
        if percent < 80:
            continue

        if percent >= 100:
            subject = "Storage Limit Reached - Upgrade Required"
            message = (
                f"Dear {user.username},\n\n"
                f"You have reached your package storage limit. "
                f"You are currently using {used:.2f} MB of {limit:.2f} MB.\n\n"
                "New uploads may now be blocked until you upgrade your package or remove existing files.\n\n"
                "Best regards,\nYour Platform Team"
            )
        else:
            subject = "Low Storage Space Alert"
            message = (
                f"Dear {user.username},\n\n"
                f"You have used {percent:.2f}% ({used:.2f} MB of {limit:.2f} MB) of your available space.\n"
                "Please consider upgrading your package soon to continue posting without interruption.\n\n"
                "Best regards,\nYour Platform Team"
            )

        send_mail(
            subject,
            message,
            settings.DEFAULT_FROM_EMAIL,
            [user.email],
            fail_silently=False,
        )
