from apps.station import models as station_model
from base.serializers import DynamicFieldsModelSerializer


class StationSerializer(DynamicFieldsModelSerializer):
    """
    Serializer for the StationMaster model.

    This serializer handles fields 'id', 'name', and 'description'.
    'id' is read-only.
    """

    class Meta:
        model = station_model.StationMaster
        fields = (
            "id",
            "name",
            "description",
        )
        read_only_fields = ("id",)


class StationRejectionSerializer(DynamicFieldsModelSerializer):
    """
    Serializer for the RejectedStations model.

    This serializer handles fields 'id', 'station', 'user', 'reason', and 'station_data'.
    'id' is read-only.
    'station' is write-only.
    'station_data' is serialized using the StationSerializer.
    """

    # Serializer for related station data
    station_data = StationSerializer(source="station", read_only=True)

    class Meta:
        model = station_model.RejectedStations
        fields = ("id", "station", "user", "reason", "station_data")
        read_only_fields = ("id",)
        extra_kwargs = {
            "station": {"write_only": True},
        }

    def __init__(self, *args, **kwargs):
        """
        Custom initialization method.

        Modifies the queryset of the 'station' field based on the request data.
        """
        super(StationRejectionSerializer, self).__init__(*args, **kwargs)
        if "context" in kwargs and "request" in kwargs["context"]:
            request = kwargs["context"]["request"]
            if "station" in request.data:
                # Filter stations to only those that are not verified
                self.fields[
                    "station"
                ].queryset = station_model.StationMaster.objects.filter(
                    is_verified=False
                )
