from rest_framework import serializers
from .models import Event, EventCategory, EventReservation
from users.serializers import PartnerSerializer, UserSerializer
from .models import WILAYA_CHOICES  # Import WILAYA_CHOICES from models

# Define EventCategorySerializer first
class EventCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = EventCategory
        fields = ['id', 'name', 'description', 'icon']

# Then use it in EventSerializer
class EventSerializer(serializers.ModelSerializer):
    formatted_date = serializers.SerializerMethodField()
    partner = PartnerSerializer(read_only=True)
    wilaya_name = serializers.SerializerMethodField()
    category = EventCategorySerializer(read_only=True)
    reservation_count = serializers.ReadOnlyField()
    confirmed_reservation_count = serializers.ReadOnlyField()
    # Add category_id field for write operations
    category_id = serializers.PrimaryKeyRelatedField(
        queryset=EventCategory.objects.all(),
        source='category',
        write_only=True,
        required=False
    )
    # Make image field optional
    image = serializers.ImageField(required=False)

    class Meta:
        model = Event
        fields = [
            'id', 'title', 'description', 'date', 'time', 'location', 'wilaya', 'wilaya_name',
            'image', 'is_featured', 'price', 'partner', 'formatted_date',
            'available_seats', 'is_sold_out', 'registration_closed', 'category', 'category_id', 'is_past',
            'reservation_count', 'confirmed_reservation_count'
        ]
    
    def get_formatted_date(self, obj):
        return obj.formatted_date
    
    def get_wilaya_name(self, obj):
        # Return the human-readable wilaya name
        return dict(WILAYA_CHOICES).get(obj.wilaya, '')
        
    def validate(self, data):
        # Add custom validation for image field
        if self.context['request'].method == 'POST' and 'image' not in data:
            raise serializers.ValidationError({'image': 'An image is required when creating a new event'})
        return data

# Add the EventReservationSerializer last
class EventReservationSerializer(serializers.ModelSerializer):
    event = EventSerializer(read_only=True)
    user = UserSerializer(read_only=True)
    event_id = serializers.PrimaryKeyRelatedField(
        queryset=Event.objects.all(), 
        write_only=True, 
        source='event'
    )
    name = serializers.CharField(required=True)
    phone = serializers.CharField(required=True)
    reserved_seats = serializers.IntegerField(default=1, min_value=1)
    amount = serializers.SerializerMethodField()
    
    class Meta:
        model = EventReservation
        fields = [
            'id', 'event', 'user', 'event_id', 'name', 'phone', 
            'reserved_seats', 'medical_information', 'reservation_date', 
            'status', 'amount'
        ]
        read_only_fields = ['reservation_date', 'amount']
    
    def get_amount(self, obj):
        # Calculate amount based on seats and event price
        if obj.event.price:
            return float(obj.event.price) * obj.reserved_seats
        return 0
    
    def create(self, validated_data):
        # Get the current user from the request
        user = self.context['request'].user
        validated_data['user'] = user
        return super().create(validated_data)