from django.forms import ValidationError
from rest_framework import serializers
from user_ads_package.models.userpackage import UserPackage
from package_details.models.package_details import PackageDetails
from users.serializers.users_serializer import UserSerializer
from package_details.serializer.package_details_serializer import PackageDetailsSerializer
from package_details.utils import get_object_size_in_mb,get_user_total_space_used
from django.utils import timezone
from datetime import timedelta

from rest_framework.exceptions import ValidationError

class UserPackageSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    # ads_remaining = serializers.SerializerMethodField()
    user = serializers.PrimaryKeyRelatedField(read_only=True)
    user_details = UserSerializer(source="user",read_only=True)
    package_details = PackageDetailsSerializer(source="package",read_only=True)
    package = serializers.PrimaryKeyRelatedField(queryset=PackageDetails.objects.all(),write_only=True)
    used_space = serializers.SerializerMethodField()
    # user = serializers.ReadOnlyField(source='user.id')
    # package_id = serializers.IntegerField(write_only=True)

    class Meta:
        model = UserPackage
        # fields = ['id','user','user_details','package','package_details','total_ads','ads_posted','ads_remaining']
        fields = ['id','user','user_details','package','package_details','total_space','used_space','start_date','end_date']
        read_only_fields = ['id', 'user','user_details','package_details','total_space','used_space','start_date','end_date']

    def get_used_space(self, obj):
        return get_user_total_space_used(obj.user)

    def get_ads_remaining(self, obj):
        return obj.ads_remaining()
    
    def create(self, validated_data):
        request = self.context['request']
        user = request.user
        package = validated_data['package']

        # 1️⃣ Check if it's a free package and user already has an active one
        if package.price == 0:
            existing_package = UserPackage.objects.filter(
                user=user,
                package=package
            ).order_by('-start_date').first()

            if existing_package and not existing_package.is_expired():
                raise serializers.ValidationError(
                    {"error": "You already have this free package active. Try again after it expires in 30 days."}
                )


        # try:
        #     package = PackageDetails.objects.get(id=package_id)
        # except PackageDetails.DoesNotExist:
        #     raise serializers.ValidationError({"package_id":"Package is not found"})
        
        user_package, created = UserPackage.objects.get_or_create(user=user, defaults={
            "package": package,
            "total_ads": package.total_ads,
            "total_space": package.space,
            "start_date": timezone.now(),
            "end_date": timezone.now() + timedelta(days=30)
        })

        # if not created:
        #     user_package.total_ads += package.total_ads
        #     user_package.package = package  # optional update
        #     user_package.save()
        if not created:
            # If same package, extend only if expired, else prevent
            if not user_package.is_expired():
                raise serializers.ValidationError(
                    {"error": "You already have this package active."}
                )
            else:
                # Renew if expired
                user_package.start_date = timezone.now()
                user_package.end_date = timezone.now() + timedelta(days=30)
                user_package.total_ads = package.total_ads
                user_package.total_space = package.space
                user_package.ads_posted = 0
                user_package.used_space = 0
                user_package.save()

        return user_package

    def validate(self, attrs):
        user = self.context['request'].user
        
        # Get the user's current package
        user_package = UserPackage.objects.get(user=user)
        package = user_package.package
        
        # Get total space used by user
        total_used = get_user_total_space_used(user)
        
        # Estimate new post size
        # Note: This assumes get_object_size_in_mb can handle a dict or partial data
        new_post_size = get_object_size_in_mb(attrs)
        
        # Check if adding new content exceeds package limit
        if total_used + new_post_size > float(package.space):
            raise ValidationError({
                "space": "You have reached your package space limit. Please upgrade."
            })
        
        return attrs
