from rest_framework import serializers

from shop_management.models.data.daily_diary import DailyDiaryEntry, DailyDiaryLog
from shop_management.serializers.data.base import DataRootSerializer


class DailyDiaryEntrySerializer(DataRootSerializer):
    shop_details = serializers.SerializerMethodField()
    created_by_name = serializers.SerializerMethodField()

    class Meta:
        model = DailyDiaryEntry
        fields = "__all__"

    def get_shop_details(self, obj):
        if obj.shop:
            return {"id": obj.shop.id, "name": obj.shop.name}
        return None

    def get_created_by_name(self, obj):
        if obj.created_by:
            return obj.created_by.get_full_name() or obj.created_by.username
        return None


class DailyDiaryLogSerializer(DataRootSerializer):
    shop_details = serializers.SerializerMethodField()
    currency_details = serializers.SerializerMethodField()
    created_by_name = serializers.SerializerMethodField()
    activity_type_label = serializers.SerializerMethodField()
    category_label = serializers.SerializerMethodField()

    class Meta:
        model = DailyDiaryLog
        fields = "__all__"
        read_only_fields = ("is_auto", "source_model", "source_id", "category")

    def get_shop_details(self, obj):
        if obj.shop:
            return {"id": obj.shop.id, "name": obj.shop.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_created_by_name(self, obj):
        if obj.created_by:
            return obj.created_by.get_full_name() or obj.created_by.username
        return None

    def get_activity_type_label(self, obj):
        return obj.get_activity_type_display()

    def get_category_label(self, obj):
        return obj.get_category_display()

    def create(self, validated_data):
        validated_data["is_auto"] = False
        activity_type = validated_data.get("activity_type", DailyDiaryLog.ActivityType.MANUAL)
        validated_data.setdefault("activity_type", activity_type)
        validated_data["category"] = DailyDiaryLog.ACTIVITY_CATEGORY.get(
            activity_type, DailyDiaryLog.Category.MANUAL
        )
        if not validated_data.get("title"):
            validated_data["title"] = "Manual Entry"
        return super().create(validated_data)

    def update(self, instance, validated_data):
        if instance.is_auto:
            validated_data = {
                k: v for k, v in validated_data.items()
                if k in ("title", "party", "description")
            }
        return super().update(instance, validated_data)
