"""
DRF Serializers – migrated from Laravel controllers (validation + serialisation logic)

Each serializer corresponds to a Laravel Controller that validates and returns model data.
"""

from rest_framework import serializers
from app_nutzer.models import User, ReuMietV, ReuEigentuemer
from app_real_estate.models import RealEstate, RealEstateUnit
# from app_api.models import ApiUser
from app_verbrauch.models import (
    VISysVerbrauchRahmen, VISysVerbrauchsDS,
    VISysRefVerbrauchRahmen, VISysRefVerbrauchsDS,
)


# ---------------------------------------------------------------------------
# User – API serializer (migrated from UserController API methods)
# ---------------------------------------------------------------------------
class UserApiSerializer(serializers.ModelSerializer):
    last_login_at = serializers.DateTimeField(source='last_login', allow_null=True, read_only=True)

    class Meta:
        model = User
        fields = [
            'PersonenID', 'lastname', 'firstname', 'companyname',
            'email', 'password', 'VISysEMailPreference',
            'SalutationID', 'SaAnschrift', 'SaAnrede', 'SaBriefkopf', 'last_login_at', 'last_login_ip',
        ]
        extra_kwargs = {
            'password': {'write_only': True, 'required': False, 'allow_null': True},
            'PersonenID': {'required': True},
            'email': {'required': True},
        }

    def create(self, validated_data):
        import secrets
        password = validated_data.pop('password', None)
        user = User(**validated_data)
        if password:
            user.set_password(password)
        else:
            user.set_password(secrets.token_hex(16))
        user.save()
        return user

    def update(self, instance, validated_data):
        password = validated_data.pop('password', None)
        for attr, value in validated_data.items():
            setattr(instance, attr, value)
        if password:
            instance.set_password(password)
        instance.save()
        return instance


# # ---------------------------------------------------------------------------
# # ApiUser serializer
# # ---------------------------------------------------------------------------
# class ApiUserSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = ApiUser
#         fields = ['ApiUserID', 'ApiUserName', 'companyname', 'ApiUserEMail', 'VISysEMailPreference']


# ---------------------------------------------------------------------------
# RealEstate – migrated from RealEstateController
# ---------------------------------------------------------------------------
class RealEstateSerializer(serializers.ModelSerializer):
    class Meta:
        model = RealEstate
        fields = ['REID', 'Street', 'HouseNumber', 'PostalCode', 'City']
        extra_kwargs = {
            'REID': {'validators': []}, # Sonst kein Update möglich
            'Street': {'required': True},
            'HouseNumber': {'required': True},
            'City': {'required': True},
            'PostalCode': {'required': True},
        }


# ---------------------------------------------------------------------------
# RealEstateUnit – migrated from REUController (list input)
# ---------------------------------------------------------------------------
class RealEstateUnitSerializer(serializers.ModelSerializer):
    class Meta:
        model = RealEstateUnit
        fields = ['REUID', 'REID', 'REUDesc', 'REUCID']
        extra_kwargs = {
            'REUID': {'validators': []}, # Sonst kein Update möglich
            'REID': {'required': True},
            'REUDesc': {'required': True},
            'REUCID': {'required': True},
        }


# ---------------------------------------------------------------------------
# ReuMietV – migrated from MietVController
# ---------------------------------------------------------------------------
class ReuMietVSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReuMietV
        fields = ['MietVID', 'REUID', 'MieterID', 'ContractValidFrom', 'ContractValidUntil']
        extra_kwargs = {
            'MietVID': {'validators': []}, # Sonst kein Update möglich
            'MieterID': {'required': True},
            'REUID': {'required': True},
            'ContractValidFrom': {'required': True},
        }


# ---------------------------------------------------------------------------
# ReuEigentuemer – Gegenstueck zu ReuMietV fuer Eigentumsverhaeltnisse
# Quelle in xin: tblREUOwnerLinker (REUOwnerLinker)
# ---------------------------------------------------------------------------
class ReuEigentuemerSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReuEigentuemer
        fields = ['EigentumID', 'REUID', 'EigentuemerID', 'ValidFrom', 'ValidUntil']
        extra_kwargs = {
            'EigentumID': {'validators': []},  # Sonst kein Update möglich
            'EigentuemerID': {'required': True},
            'REUID': {'required': True},
            'ValidFrom': {'required': True},
            # ValidUntil bleibt optional: ein Eigentumsverhältnis hat in der
            # Regel kein Enddatum.
        }


# ---------------------------------------------------------------------------
# VISysRefVerbrauchRahmen – migrated from RefVerRahmenController
# ---------------------------------------------------------------------------
class VISysRefVerbrauchRahmenSerializer(serializers.ModelSerializer):
    class Meta:
        model = VISysRefVerbrauchRahmen
        fields = ['VISysRefVerbrID', 'REID', 'Jahr', 'VISysVerbrauchsArtID']
        extra_kwargs = {
            'VISysRefVerbrID': {'validators': [], 'read_only': False}, # Sonst kein Update möglich
            'REID': {'required': True},
            'Jahr': {'required': True},
            'VISysVerbrauchsArtID': {'required': True},
        }


# ---------------------------------------------------------------------------
# VISysRefVerbrauchsDS – migrated from RefVerDatenController (list input)
# ---------------------------------------------------------------------------
class VISysRefVerbrauchsDSSerializer(serializers.ModelSerializer):
    class Meta:
        model = VISysRefVerbrauchsDS
        fields = ['RefVerBrDatID', 'RefVerBrSD', 'RefVerBrED', 'RefVerBrWert', 'RefVerBrID', 'RefVerBrWertNormA']
        extra_kwargs = {
            'RefVerBrDatID': {'validators': []}, # Sonst kein Update möglich
            'RefVerBrSD': {'required': True},
            'RefVerBrED': {'required': True},
            'RefVerBrWert': {'required': True},
            'RefVerBrID': {'required': True},
        }


# ---------------------------------------------------------------------------
# VISysVerbrauchRahmen – migrated from VerRahmenController (list input)
# ---------------------------------------------------------------------------
class VISysVerbrauchRahmenSerializer(serializers.ModelSerializer):
    class Meta:
        model = VISysVerbrauchRahmen
        fields = ['VISysVerbrauchsID', 'MietVID', 'PersonenID', 'REUID', 'Jahr', 'VISysVerbrauchsArtID']
        extra_kwargs = {
            'VISysVerbrauchsID': {'validators': [], 'read_only': False}, # Sonst kein Update möglich
            'MietVID': {'required': False},
            'PersonenID': {'required': False, 'allow_null': True},
            'REUID': {'required': False, 'allow_null': True},
            'Jahr': {'required': True},
            'VISysVerbrauchsArtID': {'required': True},
        }

    def validate(self, attrs):
        # Absicherung gegen alte Sync Methode api_runner
        personen_id = attrs.get('PersonenID')
        reuid = attrs.get('REUID')
        if (personen_id is None) != (reuid is None):
            raise serializers.ValidationError(
                'PersonenID and REUID must either both be set or both be null.'
            )
        return attrs





# ---------------------------------------------------------------------------
# VISysVerbrauchsDS – migrated from VerDatenController (list input)
# ---------------------------------------------------------------------------
class VISysVerbrauchsDSSerializer(serializers.ModelSerializer):
    class Meta:
        model = VISysVerbrauchsDS
        fields = ['VerBrDatID', 'VerBrSD', 'VerBrED', 'VerBrWert', 'VerBrID', 'VerBrWertNormA']
        extra_kwargs = {
            'VerBrDatID': {'validators': []}, # Sonst kein Update möglich
            'VerBrSD': {'required': True},
            'VerBrED': {'required': True},
            'VerBrWert': {'required': True},
            'VerBrID': {'required': True},
        }
