from rest_framework import serializers

from shop_management.models.data.quotation import Quotation, QuotationItem
from shop_management.serializers.data.base import DataRootSerializer
from shop_management.serializers.data.organization import branch_profile_details


class QuotationItemSerializer(DataRootSerializer):
    product_details = serializers.SerializerMethodField()
    unit_details = serializers.SerializerMethodField()
    line_total = serializers.SerializerMethodField()

    class Meta:
        model = QuotationItem
        fields = "__all__"

    def get_product_details(self, obj):
        if obj.product:
            return {
                "id": obj.product.id,
                "name": obj.product.name,
                "code": obj.product.code,
            }
        return None

    def get_unit_details(self, obj):
        if obj.unit:
            return {"id": obj.unit.id, "title": obj.unit.title}
        return None

    def get_line_total(self, obj):
        return str((obj.quantity or 0) * (obj.unit_price or 0))


class QuotationSerializer(DataRootSerializer):
    shop_details = serializers.SerializerMethodField()
    customer_details = serializers.SerializerMethodField()
    currency_details = serializers.SerializerMethodField()
    total_amount = serializers.SerializerMethodField()
    effective_total_amount = serializers.SerializerMethodField()
    quotation_items = QuotationItemSerializer(many=True, read_only=True)

    class Meta:
        model = Quotation
        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_customer_details(self, obj):
        if obj.customer:
            return {
                "id": obj.customer.id,
                "name": obj.customer.name,
                "contact": obj.customer.contact,
                "address": obj.customer.address,
                "email": obj.customer.email,
            }
        if obj.visitor_name or obj.visitor_contact:
            return {
                "id": None,
                "name": obj.visitor_name or "Visitor",
                "contact": obj.visitor_contact or "",
                "address": "",
                "email": "",
            }
        return None

    def get_currency_details(self, obj):
        if obj.currency:
            return {"id": obj.currency.id, "title": obj.currency.title}
        return None

    def get_total_amount(self, obj):
        return obj.total_amount

    def get_effective_total_amount(self, obj):
        return obj.effective_total_amount
