from rest_framework import serializers

from admin_panel.models import User
from admin_panel.serializers import BalanceSheetSerializer
from .models import BusinessAccountant


class BusinessAccountantSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source="user.username", read_only=True)
    email = serializers.EmailField(source="user.email", read_only=True)
    first_name = serializers.CharField(source="user.first_name", read_only=True)
    last_name = serializers.CharField(source="user.last_name", read_only=True)
    phone = serializers.CharField(source="user.phone", read_only=True)
    image = serializers.SerializerMethodField()
    is_active = serializers.BooleanField(source="user.is_active", read_only=True)
    login_password_display = serializers.CharField(
        source="user.admin_visible_password", read_only=True
    )
    identity_details = serializers.SerializerMethodField()
    identity_files = serializers.SerializerMethodField()

    class Meta:
        model = BusinessAccountant
        fields = (
            "id",
            "username",
            "email",
            "first_name",
            "last_name",
            "phone",
            "image",
            "is_active",
            "login_password_display",
            "identity_details",
            "identity_files",
            "created_at",
        )

    def get_image(self, obj):
        request = self.context.get("request")
        image = getattr(obj.user, "image", None)
        if not image:
            return None
        try:
            return request.build_absolute_uri(image.url) if request else image.url
        except Exception:
            return None

    def get_identity_details(self, obj):
        return list(
            obj.user.accountant_detail_fields.values("id", "key", "value")
        )

    def get_identity_files(self, obj):
        request = self.context.get("request")
        result = []
        for item in obj.user.accountant_documents.all():
            try:
                url = request.build_absolute_uri(item.file.url) if request else item.file.url
            except Exception:
                url = None
            result.append({
                "id": item.id,
                "title": item.title,
                "file": url,
                "created_at": item.created_at,
            })
        return result


# Re-export the existing balance-sheet serializer so the Business Accountant
# uses exactly the same Balance Sheet field definitions and calculated totals.
__all__ = ["BusinessAccountantSerializer", "BalanceSheetSerializer"]
