# serializers.py
from rest_framework import serializers
from .models import City, Category, Place , Advertisement , Booking, ContactUs , User , FavoritePlace , EmergencyNumber , PlaceImage ,SocialMediaLink 
from .utils import get_translated_field
from djoser.serializers import UserCreateSerializer  , TokenCreateSerializer
from rest_framework import serializers
from .models import User
from rest_framework.authtoken.models import Token


# myapp/serializers.py

from djoser.serializers import TokenCreateSerializer
from django.contrib.auth import get_user_model

User = get_user_model()
class CustomTokenCreateSerializer(TokenCreateSerializer):
    user = serializers.SerializerMethodField()

    class Meta:
        fields = ('auth_token', 'user')

    def get_user(self, obj):
        user = obj.user
        return {
            "id": user.id,
            "username": user.username,
            "email": user.email,
            "phone_number": user.phone_number,
            "preferred_language": user.preferred_language,
            "city": user.city,
            "image": user.image.url if user.image else None,
            "created_at": user.created_at,
            "updated_at": user.updated_at,
        }

class CustomUserCreateSerializer(UserCreateSerializer):

    token = serializers.SerializerMethodField(method_name='get_token')
    class Meta(UserCreateSerializer.Meta):
        model = User
        fields = ('id', 'username','password', 'email', 'image',  'phone_number', 'preferred_language', 'city', 'created_at', 'updated_at' ,  'token' )

    def get_token(self, user):
        token_instance, _ = Token.objects.get_or_create(user=user)
        return token_instance.key
    

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'phone_number', 'preferred_language', 'city', 'image', 'created_at', 'updated_at']



class AdSerializer(serializers.ModelSerializer):
    title = serializers.SerializerMethodField()
    text_1  = serializers.SerializerMethodField()
    text_2  = serializers.SerializerMethodField()


    class Meta:
        model = Advertisement
        fields = ['id','title', 'image', 'text_1','text_2',  'link', 'is_active', 'expiry_date', 'created_at', 'updated_at', 'user']

    def get_title(self, obj):
        user = self.context['request'].user
        field_name = get_translated_field(user, 'title')
        return getattr(obj, field_name)

    def get_text_1(self, obj):
        user = self.context['request'].user
        field_name = get_translated_field(user, 'text_1')
        return getattr(obj, field_name)

    def get_text_2(self, obj):
        user = self.context['request'].user
        field_name = get_translated_field(user, 'text_2')
        return getattr(obj, field_name)



    

class CitySerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = City
        fields = ['id','name', 'created_at', 'updated_at']

    def get_name(self, obj):
        user = self.context['request'].user
        field_name = get_translated_field(user, 'name')
        return getattr(obj, field_name)

class CategorySerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = Category
        fields = ['id','name', 'image', 'created_at', 'updated_at']

    def get_name(self, obj):
        user = self.context['request'].user
        field_name = get_translated_field(user, 'name')
        return getattr(obj, field_name)



class PlaceImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = PlaceImage
        fields = ['id','title_ar', 'title_en', 'title_ku', 'image', 'created_at', 'updated_at']

class SocialMediaLinkSerializer(serializers.ModelSerializer):
    class Meta:
        model = SocialMediaLink
        fields = ['id','icon_type', 'link', 'created_at', 'updated_at']



class PlaceSerializer(serializers.ModelSerializer):
    images = PlaceImageSerializer(many=True, read_only=True, source='placeimage_set')
    social_media_links = SocialMediaLinkSerializer(many=True, read_only=True, source='socialmedialink_set')
    name = serializers.SerializerMethodField()
    description = serializers.SerializerMethodField()

    class Meta:
        model = Place
        fields = ['id','name', 'cover_image', 'longitude', 'latitude', 'rating', 'description', 'map_link', 'created_at', 'updated_at' , 'images' , 'social_media_links']

    def get_name(self, obj):
        user = self.context['request'].user
        field_name = get_translated_field(user, 'name')
        return getattr(obj, field_name)

    def get_description(self, obj):
        user = self.context['request'].user
        field_name = get_translated_field(user, 'description')
        return getattr(obj, field_name)





class BookingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Booking
        fields = ['id','place', 'user', 'subject', 'message', 'created_at', 'updated_at']

class ContactUsSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContactUs
        fields = ['id','user_name', 'phone_number', 'email', 'message', 'is_read', 'created_at', 'updated_at']







class EmergencyNumberSerializer(serializers.ModelSerializer):
    class Meta:
        model = EmergencyNumber
        fields = '__all__'




class FavoritePlaceSerializer(serializers.ModelSerializer):
    place = PlaceSerializer(read_only=True)

    class Meta:
        model = FavoritePlace
        fields = ['id', 'user', 'created_at', 'updated_at', 'place']





class FavoritePlaceSerializerCreate(serializers.ModelSerializer):
    class Meta:
        model = FavoritePlace
        fields = ['place']  # Only 'place' field will be provided in the request, user is inferred
