from rest_framework import serializers
from decimal import Decimal
from product.models import *
from order.models import *
from product.serializers import *
from address.serializers import *
from django.db import transaction
from dateutil.relativedelta import relativedelta


class PlanPurchaseSerializer(serializers.ModelSerializer):
    duration_months = serializers.IntegerField(required=False)
    transaction_id = serializers.CharField(required=False, allow_null=True)  
    tx_ref = serializers.CharField(required=False)  
    amount = serializers.DecimalField(max_digits=16, decimal_places=2, required=False, allow_null=True)
    start_date = serializers.DateField(required=False)
    end_date = serializers.DateField(required=False)
    main_category = serializers.PrimaryKeyRelatedField(queryset=MainCategory.objects.all(), required=False)
    categories_plan = serializers.PrimaryKeyRelatedField(queryset=CategoriesPlan.objects.all(), required=False)
    plan_duration = serializers.PrimaryKeyRelatedField(queryset=CategoriesPlanDuration.objects.all(), required=False)
    # price = serializers.PrimaryKeyRelatedField(queryset=DurationPrice.objects.all(), required=False)
    subscription_name = serializers.CharField(source="categories_plan.name", read_only=True)

    class Meta:
        model = PlanPurchase
        fields = [
            'id', 'vendor', 'main_category', 'categories_plan', 'subscription_name', 'plan_duration', 'duration_months',
            'amount', "product_limit", 'start_date', 'end_date', 'payment_status', 'payment_method', 'tx_ref', 'transaction_id', 
            'status','products_added', 'created_at'
        ]
        extra_kwargs = {
            'vendor': {'write_only': True},  
            'main_category': {'write_only': True},  
        }

    def get_plan_duration(self, obj):
        return obj.plan_duration.id if obj.plan_duration else None

    # def get_price(self, obj):
    #     return str(obj.price.amount) if obj.price else "0.00"

    def validate(self, data):
        user = data.get('vendor')
        main_category = data.get('main_category')

        if not User.objects.filter(id=user.id).exists():
            raise serializers.ValidationError({"vendor": "Invalid user ID."})

        if not MainCategory.objects.filter(id=main_category.id).exists():
            raise serializers.ValidationError({"main_category": "Invalid category ID."})

        return data

# class PlanPurchaseSerializer(serializers.ModelSerializer):
#     main_category = serializers.IntegerField(write_only=True)
#     plan_duration = serializers.SerializerMethodField()
#     duration_months = serializers.IntegerField(read_only=True)
#     price = serializers.SerializerMethodField()
#     amount = serializers.DecimalField(max_digits=16, decimal_places=2, read_only=True)
#     start_date = serializers.DateField(read_only=True)
#     end_date = serializers.DateField(read_only=True)
#     categories_plan = serializers.DateField(required=False)

#     class Meta:
#         model = PlanPurchase
#         fields = [
#             'id', 'vendor', 'categories_plan', 'main_category', 'plan_duration', 'duration_months',
#             'price', 'amount', 'start_date', 'end_date', 'payment_status', 'payment_method', 'status'
#         ]
#         extra_kwargs = {
#             'vendor': {'write_only': True},  
#             'main_category': {'write_only': True},  

#         }

#     def get_main_category(self, obj):
#         return obj.main_category if obj.main_category else None
#         # return obj.vendor.main_category.id if obj.vendor.main_category else None

#     def get_plan_duration(self, obj):
#         return obj.plan_duration.id if obj.plan_duration else None

#     def get_price(self, obj):
#         return str(obj.price.amount) if obj.price else "0.00"

#     def validate(self, data):
#         user = data.get('vendor')
#         main_category = data.get('main_category')
#         if not User.objects.filter(id=user.id).exists():
#             raise serializers.ValidationError({"vendor": "Invalid user ID."})
        
#         if not MainCategory.objects.filter(id=main_category).exists():
#             raise serializers.ValidationError({"main_category": "Invalida category ID ."})

#         return data

#     # def create(self, validated_data):
        
#     #     print('----------', validated_data)
#     #     vendor = validated_data['vendor']
#     #     main_category = validated_data['main_category']
      
#     #     categories_plan = CategoriesPlan.objects.filter(main_category=main_category, name='FREE').first()
#     #     main_category = MainCategory.objects.filter(id=main_category).first()
       
#     #     amount = 0.00
#     #     # amount = price.amount if price else 0.00

#     #     start_date = now().date()
#     #     end_date = start_date + relativedelta(months=12)

#     #     return PlanPurchase.objects.create(
#     #         vendor=vendor,
#     #         main_category=main_category,
#     #         categories_plan=categories_plan,
            
#     #         amount=amount,
#     #         start_date=start_date,
#     #         end_date=end_date,
#     #         payment_status='successful',
#     #         payment_method='credit_card',
#     #         status='active'
#     #     )

class PlanPurchaseListingSerializer(serializers.ModelSerializer):

    vendor = serializers.CharField(source="vendor.full_name", read_only=True)
    vendor_email = serializers.CharField(source="vendor.email", read_only=True)
    categories_plan = serializers.CharField(source="categories_plan.name", read_only=True)
    main_category_name = serializers.CharField(source="main_category.name", read_only=True)
    payment_status = serializers.ChoiceField(choices=PlanPurchase.PaymentStatus.choices, source="get_payment_status_display")
    payment_method = serializers.ChoiceField(choices=PlanPurchase.PaymentMethod.choices, source="get_payment_method_display")
    status = serializers.ChoiceField(choices=PlanPurchase.Status.choices, source="get_status_display")

   
    class Meta:
        model = PlanPurchase
        fields = ['id', 'vendor', 'vendor_email', 'main_category', 'main_category_name', 'categories_plan', 'plan_duration', 'duration_months', 'price', 'amount', 'transaction_id', 'start_date', 'end_date', 'product_limit', 'products_added', 'payment_status', 'payment_status', 'payment_method', 'status']


class ActiveSubscriptionSerializer(PlanPurchaseSerializer):
    category_details = MainCategoryListingSerializer(source='main_category', read_only=True)  
    total_product = serializers.SerializerMethodField()

    def get_total_product(self, obj):
        product_count = Product.objects.filter(user=obj.vendor).count()
        return product_count

    class Meta(PlanPurchaseSerializer.Meta):
        fields = PlanPurchaseSerializer.Meta.fields + ['category_details', 'total_product']

