from rest_framework import serializers
from .models import (
    ConversionRule,
    MonthlyConversionLog,
    SuperCoinTransaction,
    SuperCoinWallet,
    TDSLedger,
    UserVoucherCode,
    Wallet,
    WalletLedger,
    TWMCoinGrant,
)

class WalletSerializer(serializers.ModelSerializer):
    twm_coins_balance = serializers.DecimalField(source='voucher_balance', max_digits=12, decimal_places=2, read_only=True)

    class Meta:
        model = Wallet
        fields = ['user', 'main_balance', 'repurchase_balance', 'voucher_balance', 'twm_coins_balance', 'locked_amount']
        read_only_fields = ['user', 'main_balance', 'repurchase_balance', 'voucher_balance', 'twm_coins_balance', 'locked_amount']

class WalletLedgerSerializer(serializers.ModelSerializer):
    class Meta:
        model = WalletLedger
        fields = [
            'id', 'user', 'wallet', 'transaction_type', 'wallet_type',
            'source_type', 'amount', 'reference_id', 'remarks', 'metadata', 'created_at'
        ]
        read_only_fields = ['id', 'user', 'wallet', 'created_at']


class UserVoucherCodeSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserVoucherCode
        fields = [
            'id',
            'code',
            'total_value',
            'remaining_value',
            'source_reference_id',
            'expires_at',
            'status',
            'created_at',
            'updated_at',
        ]
        read_only_fields = fields


class TWMCoinGrantSerializer(serializers.ModelSerializer):
    user_name = serializers.SerializerMethodField()
    granted_by_name = serializers.SerializerMethodField()

    class Meta:
        model = TWMCoinGrant
        fields = [
            'id',
            'user',
            'user_name',
            'granted_by',
            'granted_by_name',
            'amount',
            'expiry_days',
            'expires_at',
            'reason',
            'reference_id',
            'created_at',
        ]
        read_only_fields = fields

    def _display_name(self, user):
        if not user:
            return None
        first = (user.first_name or '').strip()
        last = (user.last_name or '').strip()
        name = f"{first} {last}".strip()
        return name or user.mobile or user.email or str(user.id)

    def get_user_name(self, obj):
        return self._display_name(obj.user)

    def get_granted_by_name(self, obj):
        return self._display_name(obj.granted_by)


class SuperCoinWalletSerializer(serializers.ModelSerializer):
    class Meta:
        model = SuperCoinWallet
        fields = ['user', 'balance', 'updated_at']
        read_only_fields = fields


class SuperCoinTransactionSerializer(serializers.ModelSerializer):
    class Meta:
        model = SuperCoinTransaction
        fields = [
            'id',
            'user',
            'wallet',
            'transaction_type',
            'source_type',
            'amount',
            'reference_id',
            'metadata',
            'created_at',
        ]
        read_only_fields = fields


class ConversionRuleSerializer(serializers.ModelSerializer):
    class Meta:
        model = ConversionRule
        fields = [
            'id',
            'user',
            'distributor_id',
            'monthly_limit',
            'conversion_percentage',
            'is_active',
            'created_at',
            'updated_at',
        ]
        read_only_fields = ['id', 'created_at', 'updated_at']


class MonthlyConversionLogSerializer(serializers.ModelSerializer):
    class Meta:
        model = MonthlyConversionLog
        fields = [
            'id',
            'user',
            'distributor_id',
            'total_supercoins',
            'converted_amount',
            'tds_deducted',
            'net_amount',
            'month',
            'reference_id',
            'created_at',
        ]
        read_only_fields = fields


class TDSLedgerSerializer(serializers.ModelSerializer):
    class Meta:
        model = TDSLedger
        fields = [
            'id',
            'user',
            'distributor_id',
            'context',
            'gross_amount',
            'tds_percent',
            'tds_amount',
            'reference_id',
            'month',
            'metadata',
            'created_at',
        ]
        read_only_fields = fields
