from rest_framework import serializers
from .models import *
from vehiclehub.models import Vehicle,VehicleType

class LocationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Location
        fields = '__all__'

class RideSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ride
        fields = '__all__'

class SharedRideSerializer(serializers.ModelSerializer):
    class Meta:
        model = SharedRide
        fields = '__all__'

    def to_representation(self, instance):
        ride_representation = super().to_representation(instance)
        ride_representation['participants'] = [
            {
                'participant': participant,
                'device_token': participant.device_token,
                'pickup_location': participant.pickup_location,
                'dropoff_location': participant.dropoff_location,
                'pickup_name': participant.pickup_name,
                'dropoff_name': participant.dropoff_name,
                'seats_required': participant.seats_required,
                'joined_at': participant.joined_at
            } for participant in instance.participants.all()
        ]
        return ride_representation
        
class RoutePointSerializer(serializers.ModelSerializer):
    class Meta:
        model = RoutePoint
        fields = ['name', 'latitude', 'longitude']

class RouteSerializer(serializers.ModelSerializer):
    pickup_point = RoutePointSerializer()
    dropoff_point = RoutePointSerializer()
    intermediate_points = serializers.SerializerMethodField()

    class Meta:
        model = Route
        fields = ['id','name', 'description', 'pickup_point', 'dropoff_point', 'intermediate_points']

    def get_intermediate_points(self, obj):
        intermediate_points_qs = obj.sequences.order_by('order').values_list('point', flat=True)
        intermediate_points = RoutePoint.objects.filter(pk__in=intermediate_points_qs)
        intermediate_points_serialized = RoutePointSerializer(intermediate_points, many=True).data
        return intermediate_points_serialized


class ScheduledRideMasterSerializer(serializers.ModelSerializer):
    class Meta:
        model = ScheduledRideMaster
        fields = '__all__'

class SRMRoutePointSerializer(serializers.ModelSerializer):
    class Meta:
        model = RoutePoint
        fields = ['name', 'latitude', 'longitude']

class SRMVehicleTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = VehicleType
        fields = ['id', 'vehicle_type', 'seating_capacity']

class SRMVehicleSerializer(serializers.ModelSerializer):
    vehicle_type = SRMVehicleTypeSerializer()

    class Meta:
        model = Vehicle
        fields = ['id', 'plate_number', 'vehicle_type']


class ScheduledRideMobileSerializer(serializers.ModelSerializer):
    route = RouteSerializer()
    vehicle = SRMVehicleSerializer()
    distance_to_start = serializers.FloatField()


    class Meta:
        model = ScheduledRideMaster
        fields = ['id', 'name', 'starting_time', 'ending_time', 'route', 'vehicle', 'distance_to_start']
