from rest_framework import serializers
from shop_management.serializers.data.base import DataRootSerializer
from shop_management.models.data.purchase import Purchase, PurchaseItem
from shop_management.serializers.data.purchase_payment import PurchasePaymentSerializer
from shop_management.serializers.data.organization import branch_profile_details


class PurchaseItemSerializer(DataRootSerializer):
    product_details = serializers.SerializerMethodField()
    unit_details = serializers.SerializerMethodField()

    class Meta:
        model = PurchaseItem
        fields = '__all__'

    def get_product_details(self, obj):
        if obj.product:
            return {"id": obj.product.id, "name": obj.product.name}
        return None

    def get_unit_details(self, obj):
        if obj.unit:
            return {"id": obj.unit.id, "title": obj.unit.title}
        return None

class PurchaseSerializer(DataRootSerializer):
    shop_details = serializers.SerializerMethodField()
    supplier_details = serializers.SerializerMethodField()
    currency_details = serializers.SerializerMethodField()
    purchase_items = PurchaseItemSerializer(many=True, read_only=True)
    payments = PurchasePaymentSerializer(many=True, read_only=True)
    total_price = serializers.SerializerMethodField()
    total_paid = serializers.SerializerMethodField()
    total_remained_amount = serializers.SerializerMethodField()
    warehouse_details = serializers.SerializerMethodField()
    document_status_display = serializers.CharField(
        source="get_document_status_display", read_only=True
    )

    class Meta:
        model = Purchase
        fields = '__all__'

    def get_shop_details(self, obj):
        if obj.shop:
            return {
                "id": obj.shop.id,
                "name": obj.shop.name,
                "profile": branch_profile_details(obj.shop),
            }
        return None

    def get_supplier_details(self, obj):
        if obj.supplier:
            return {"id": obj.supplier.id, "name": obj.supplier.name}
        return None

    def get_currency_details(self, obj):
        if obj.currency:
            return {"id": obj.currency.id, "title": obj.currency.title}
        return None

    def get_warehouse_details(self, obj):
        if not obj.warehouse:
            return None
        return {
            "id": obj.warehouse_id,
            "code": obj.warehouse.code,
            "name": obj.warehouse.name,
        }

    def get_total_price(self, obj):
        return obj.total_price

    def get_total_paid(self, obj):
        return obj.total_paid

    def get_total_remained_amount(self, obj):
        return obj.total_remained_amount
