"""
Serializers for the binary_tree app.

Used by web API views and admin views to validate responses and
enable future DRF browsable API / OpenAPI schema generation.
"""

from rest_framework import serializers

from .models import (
    BinaryLevelSnapshot,
    BinaryPlacementLog,
    BinaryTreeMetrics,
    PowerStreamForfeitureLog,
)


class BinaryTreeMetricsSerializer(serializers.ModelSerializer):
    distributor_id = serializers.UUIDField(source='distributor.id', read_only=True)
    distributor_code = serializers.CharField(source='distributor.distributor_code', read_only=True)

    class Meta:
        model = BinaryTreeMetrics
        fields = (
            'distributor_id',
            'distributor_code',
            'left_volume',
            'right_volume',
            'subtree_total',
            'direct_left_count',
            'direct_right_count',
            'tree_depth',
            'weak_leg',
            'strong_leg',
            'imbalance_ratio',
            'updated_at',
        )


class BinaryLevelSnapshotSerializer(serializers.ModelSerializer):
    distributor_id = serializers.UUIDField(source='distributor.id', read_only=True)

    class Meta:
        model = BinaryLevelSnapshot
        fields = (
            'distributor_id',
            'subtree_total',
            'left_volume',
            'right_volume',
            'current_level',
            'last_completed_level',
            'next_level_threshold',
            'progress_percent',
            'updated_at',
        )


class BinaryPlacementLogSerializer(serializers.ModelSerializer):
    placed_distributor_id = serializers.UUIDField(source='placed_distributor.id', read_only=True)
    parent_distributor_id = serializers.UUIDField(source='parent_distributor.id', read_only=True)
    placed_by_id = serializers.UUIDField(source='placed_by.id', read_only=True, allow_null=True)

    class Meta:
        model = BinaryPlacementLog
        fields = (
            'id',
            'placed_distributor_id',
            'parent_distributor_id',
            'position',
            'placement_type',
            'placed_by_id',
            'notes',
            'created_at',
        )


class PowerStreamForfeitureLogSerializer(serializers.ModelSerializer):
    user_id = serializers.UUIDField(source='user.id', read_only=True)
    user_email = serializers.EmailField(source='user.email', read_only=True)

    class Meta:
        model = PowerStreamForfeitureLog
        fields = (
            'id',
            'user_id',
            'user_email',
            'gross_amount',
            'net_amount',
            'reason',
            'grace_expired',
            'forfeited_at',
            'created_at',
        )


# ── Composite summary used by /binary-analysis/ ───────────────────────────

class BinaryDashboardSerializer(serializers.Serializer):
    """Read-only composite for get_binary_dashboard_data() output."""
    distributor_id = serializers.UUIDField()
    distributor_code = serializers.CharField()
    binary_parent_id = serializers.UUIDField(allow_null=True)
    binary_position = serializers.CharField(allow_null=True)
    metrics = BinaryTreeMetricsSerializer(allow_null=True)
    level_snapshot = BinaryLevelSnapshotSerializer(allow_null=True)
    hint = serializers.CharField(allow_null=True)
