from rest_framework import serializers
from .models import AppSettings, DeviceMoistureThreshold, Language

class LanguageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Language
        fields = ["id", "code", "name"]  # keep it clean for dropdowns


class DeviceMoistureThresholdSerializer(serializers.ModelSerializer):
    # Convenience read-only fields
    customer_device_id = serializers.IntegerField(source='customer_device.id', read_only=True)
    product_id = serializers.IntegerField(source='customer_device.product.id', read_only=True)
    product_name = serializers.CharField(source='customer_device.product.name', read_only=True)
    product_type = serializers.CharField(source='customer_device.product.product_type', read_only=True)

    class Meta:
        model = DeviceMoistureThreshold
        fields = [
            'id',
            'customer_device',         # writable FK id
            'customer_device_id',      # read-only mirror
            'product_id',
            'product_name',
            'product_type',
            'threshold_value',
            'last_setdatetime',
        ]
        read_only_fields = ['last_setdatetime', 'customer_device_id', 'product_id', 'product_name', 'product_type']

    def validate_threshold_value(self, value):
        if value is None:
            return value
        if value < 0 or value > 100:
            raise serializers.ValidationError("threshold_value must be between 0 and 100.")
        return value

    def validate_customer_device(self, value):
        """
        Enforce that the device belongs to the authenticated customer on create/update.
        """
        request = self.context.get('request')
        cust = getattr(getattr(request, 'user', None), 'customer', None) if request else None
        if cust and value.customer_id != cust.id:
            raise serializers.ValidationError("You do not own this device.")
        return value



class AppSettingsLanguageSerializer(serializers.ModelSerializer):
    language_id = serializers.CharField(write_only=True, required=True)

    class Meta:
        model = AppSettings
        fields = ["language_id", "language"]
        extra_kwargs = {
            "language": {"read_only": True},
        }

    def validate_language_id(self, value):
        try:
            lang = Language.objects.get(code=value)
        except Language.DoesNotExist:
            raise serializers.ValidationError("Invalid language selected.")
        self.context["language_obj"] = lang
        return value

    def update(self, instance, validated_data):
        lang = self.context.get("language_obj")
        instance.language = lang
        instance.save(update_fields=["language"])
        return instance

    def to_representation(self, instance):
        lang = instance.language
        return {
            "language": {
                "id": lang.id if lang else None,
                "code": lang.code if lang else None,
                "name": lang.name if lang else None,
            }
        }