# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from django.db import transaction
from rest_framework import serializers
from note.api.serializers import SpecialTransactionSerializer

from ..models import Invoice, Product, RemittanceType, Remittance, SogeCredit


class ProductSerializer(serializers.ModelSerializer):
    """
    REST API Serializer for Product types.
    The djangorestframework plugin will analyse the model `Product` and parse all fields in the API.
    """

    class Meta:
        model = Product
        fields = '__all__'


class InvoiceSerializer(serializers.ModelSerializer):
    """
    REST API Serializer for Invoice types.
    The djangorestframework plugin will analyse the model `Invoice` and parse all fields in the API.
    """
    class Meta:
        model = Invoice
        fields = '__all__'
        read_only_fields = ('bde',)

    products = serializers.SerializerMethodField()

    def get_products(self, obj):
        return serializers.ListSerializer(child=ProductSerializer())\
            .to_representation(Product.objects.filter(invoice=obj).all())


class RemittanceTypeSerializer(serializers.ModelSerializer):
    """
    REST API Serializer for RemittanceType types.
    The djangorestframework plugin will analyse the model `RemittanceType` and parse all fields in the API.
    """

    class Meta:
        model = RemittanceType
        fields = '__all__'


class RemittanceSerializer(serializers.ModelSerializer):
    """
    REST API Serializer for Remittance types.
    The djangorestframework plugin will analyse the model `Remittance` and parse all fields in the API.
    """

    transactions = serializers.SerializerMethodField()

    class Meta:
        model = Remittance
        fields = '__all__'

    def get_transactions(self, obj):
        return serializers.ListSerializer(child=SpecialTransactionSerializer()).to_representation(obj.transactions)


class SogeCreditSerializer(serializers.ModelSerializer):
    """
    REST API Serializer for SogeCredit types.
    The djangorestframework plugin will analyse the model `SogeCredit` and parse all fields in the API.
    """

    @transaction.atomic
    def save(self, **kwargs):
        # Update soge transactions after creating a credit
        instance = super().save(**kwargs)
        instance.update_transactions()
        instance.save()
        return instance

    class Meta:
        model = SogeCredit
        fields = '__all__'
