from rest_framework import serializers
from ..models import Customer
from django.contrib.auth import get_user_model
from apps.core.models import Document
from django.db import transaction


class CustomerSerializer(serializers.ModelSerializer):
    user_email = serializers.ReadOnlyField(source="user.email")
    user_full_name = serializers.ReadOnlyField(source="user.get_full_name")
    email = serializers.EmailField(write_only=True)
    password = serializers.CharField(write_only=True, min_length=8)
    first_name = serializers.CharField(write_only=True, required=False)
    last_name = serializers.CharField(write_only=True, required=False)
    identity_documents = serializers.PrimaryKeyRelatedField(
        many=True, queryset=Document.objects.all(), required=False
    )

    class Meta:
        model = Customer
        fields = [
            "id",
            "user_email",
            "user_full_name",
            "email",
            "password",
            "first_name",
            "last_name",
            "address",
            "id_card_number",
            "phone_number",
            "birth_date",
            "is_member",
            "identity_documents",
            "created_at",
            "updated_at",
        ]
        read_only_fields = [
            "id",
            "user_email",
            "user_full_name",
            "is_member",
            "created_at",
            "updated_at",
        ]

    @transaction.atomic
    def create(self, validated_data):
        user_model = get_user_model()
        email = validated_data.pop("email")
        password = validated_data.pop("password")
        first_name = validated_data.pop("first_name", "")
        last_name = validated_data.pop("last_name", "")
        identity_documents_data = validated_data.pop("identity_documents", [])

        # Créer l'utilisateur avec tous les champs
        user = user_model.objects.create_user(
            email=email, password=password, first_name=first_name, last_name=last_name
        )

        # Créer le customer lié à l'utilisateur
        customer = Customer.objects.create(user=user, **validated_data)

        # Associer les documents d'identité si fournis
        if identity_documents_data:
            customer.identity_documents.set(identity_documents_data)

        return customer

    def update(self, instance, validated_data):
        identity_documents_data = validated_data.pop("identity_documents", None)

        instance = super().update(instance, validated_data)

        if identity_documents_data is not None:
            instance.identity_documents.set(identity_documents_data)

        return instance
