from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

from package_details.utils import get_user_total_space_used
from user_ads_package.models.userpackage import UserPackage

class StorageUsageView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = request.user

        # Find user's package record
        user_package = (
            UserPackage.objects.select_related("package")
            .filter(user=user)
            .first()
        )

        if not user_package:
            return Response(
                {"error": "User does not have an assigned package."},
                status=400
            )

        # Calculate space used
        used = get_user_total_space_used(user)

        # Determine the space limit (user-level or from package)
        limit = float(
            user_package.total_space or user_package.package.space or 5.0
        )

        # Calculate percentage used
        percent = round((used / limit) * 100, 2) if limit > 0 else 0
        remaining = max(round(limit - used, 4), 0)

        if percent >= 100:
            status_value = "critical"
            message = (
                "You have reached your package storage limit. "
                "Upgrade your package to continue uploading."
            )
        elif percent >= 80:
            status_value = "warning"
            message = (
                "Your storage is running low. "
                "Consider upgrading before your uploads are blocked."
            )
        else:
            status_value = "ok"
            message = "Your package storage is in a healthy range."

        # Update record in DB
        user_package.used_space = used
        user_package.save(update_fields=["used_space"])

        return Response({
            "user": user.full_name,
            "used_space_mb": used,
            "limit_mb": limit,
            "remaining_space_mb": remaining,
            "usage_percent": percent,
            "status": status_value,
            "message": message,
        })
