from rest_framework import serializers
from .models import Governorate, Category, Amenity, Place


class GovernorateSerializer(serializers.ModelSerializer):
    """Governorate Serializer"""
    class Meta:
        model = Governorate
        fields = ['id', 'name_ar', 'name_ku', 'name_en', 'code']


class CategorySerializer(serializers.ModelSerializer):
    """Category Serializer"""
    class Meta:
        model = Category
        fields = ['id', 'name_ar', 'name_ku', 'name_en', 'slug', 'icon', 'image', 'is_active']


class AmenitySerializer(serializers.ModelSerializer):
    """Amenity Serializer"""
    class Meta:
        model = Amenity
        fields = ['id', 'name_ar', 'name_ku', 'name_en', 'icon']


class PlaceListSerializer(serializers.ModelSerializer):
    """Place List Serializer (for list views)"""
    category = CategorySerializer(read_only=True)
    distance_km = serializers.SerializerMethodField()
    
    class Meta:
        model = Place
        fields = ['id', 'name', 'slug', 'category', 'image', 'address', 'latitude', 'longitude',
                  'rating', 'reviews_count', 'is_open', 'has_booking', 'distance_km']
    
    def get_distance_km(self, obj):
        # Calculate distance if user location is provided
        request = self.context.get('request')
        if request:
            lat = request.query_params.get('lat')
            lng = request.query_params.get('lng')
            if lat and lng:
                try:
                    from .utils import calculate_distance
                    distance = calculate_distance(
                        float(lat), float(lng),
                        float(obj.latitude), float(obj.longitude)
                    )
                    return round(distance, 2)
                except (ValueError, TypeError):
                    return None
        return None


class PlaceDetailSerializer(serializers.ModelSerializer):
    """Place Detail Serializer (for detail views)"""
    category = CategorySerializer(read_only=True)
    governorate = GovernorateSerializer(read_only=True)
    amenities = AmenitySerializer(many=True, read_only=True)
    is_favorite = serializers.SerializerMethodField()
    
    class Meta:
        model = Place
        fields = ['id', 'name', 'slug', 'category', 'governorate', 'description', 'address',
                  'latitude', 'longitude', 'phone', 'website', 'email', 'image', 'gallery',
                  'working_hours', 'amenities', 'price_range', 'is_open', 'has_booking',
                  'rating', 'reviews_count', 'is_verified', 'is_favorite', 'created_at']
        read_only_fields = ['rating', 'reviews_count', 'is_verified', 'created_at']
    
    def get_is_favorite(self, obj):
        request = self.context.get('request')
        if request and request.user.is_authenticated:
            return obj.favorited_by.filter(user=request.user).exists()
        return False


class PlaceCreateUpdateSerializer(serializers.ModelSerializer):
    """Place Create/Update Serializer"""
    class Meta:
        model = Place
        fields = ['name', 'category', 'governorate', 'description', 'address', 'latitude', 'longitude',
                  'phone', 'website', 'email', 'image', 'gallery', 'working_hours', 'amenities',
                  'price_range', 'is_open', 'has_booking']
    
    def create(self, validated_data):
        validated_data['owner'] = self.context['request'].user
        return super().create(validated_data)

