from rest_framework import serializers
from developer.serializers import DeveloperSerializer
from development.models import Development, DevelopmentTranslate, Currency, Flat, FlatTranslate

class CurrencySerializer(serializers.ModelSerializer):
    gbp_rate = serializers.FloatField()
    
    class Meta:
        model = Currency
        fields = ["id", "name", "code", "demonym", "major_single", "major_plural",
                 "iso_num", "symbol", "symbol_native", "minor_single", "minor_plural",
                 "iso_digits", "decimal_digits", "num_to_basic", "gbp_rate"]

class FlatSerializer(serializers.ModelSerializer):
    class Meta:
        model = Flat
        fields = ["bedrooms_num", "is_sold_out", "base_price", "area"]

class MasterDevelopmentSerializer(serializers.ModelSerializer):
    flats = FlatSerializer(many=True, read_only=True)
    developer = DeveloperSerializer()
    country = serializers.SerializerMethodField()
    city = serializers.SerializerMethodField()
    class Meta:
        model = Development
        fields = ['id','title', 'slug', 'country', 'city', "image", "address", "developer", "is_sold_out", "is_ready_to_move","flats"]
        
    def get_country(self, obj):
        return obj.country.name
    
    def get_city(self, obj):
        return obj.city.name
        


class DevelopmentListSerializer(serializers.ModelSerializer):
    title = serializers.CharField(source='development.title')
    slug = serializers.SerializerMethodField()
    area = serializers.SerializerMethodField()
    min_price = serializers.SerializerMethodField()
    max_price = serializers.SerializerMethodField()
    image = serializers.CharField(source='development.image')
    
    class Meta:
        model = DevelopmentTranslate
        fields = ['id', 'title', 'slug', 'area', 'min_price', 'max_price', 
                 'address', 'summary', 'image']

    def get_slug(self, obj):
        return f"property-{obj.development.slug}"

    def get_area(self, obj):
        try:
            return f"{obj.development.area:,.0f}"
        except:
            return "0"
    
    def get_min_price(self, obj):
        try:
            return f"{obj.development.flats.all()[0].base_price:,.0f}"
        except:
            return "0"
    
    def get_max_price(self, obj):
        try:
            return f"{obj.development.flats.all()[-1].base_price:,.0f}"
        except:
            return "0"

class FlatSerializer(serializers.ModelSerializer):
    name = serializers.CharField()
    development = serializers.SerializerMethodField()
    price_history = serializers.SerializerMethodField()
    
    class Meta:
        model = FlatTranslate
        fields = ['id', 'name', 'development', 'area', 'price_per_meter',
                 'base_price', 'bedrooms_num', 'price_history']

    def get_development(self, obj):
        return {
            'title': obj.flat.development.title,
            'slug': f"property-{obj.flat.development.slug}"
        }
