# gamification/serializers.py

from rest_framework import serializers
from .models import UserInventory, Mission, UserMission, StreakGoal, League, LeagueGroup
from store.serializers import StoreItemSerializer
from django.contrib.auth.models import User
from django.utils import timezone
import datetime

# --- کدهای قبلی شما بدون تغییر باقی می‌مانند ---

class UserInventorySerializer(serializers.ModelSerializer):
    item_name = serializers.CharField(source='item.name', read_only=True)
    class Meta:
        model = UserInventory
        fields = ['item', 'item_name', 'quantity']

class MissionSerializer(serializers.ModelSerializer):
    reward_item = StoreItemSerializer(read_only=True)
    class Meta:
        model = Mission
        fields = [
            'id', 'title', 'description', 'mission_type',
            'goal_value', 'reward_gems', 'reward_hearts', 'reward_item'
        ]

class UserMissionSerializer(serializers.ModelSerializer):
    mission = MissionSerializer(read_only=True)
    class Meta:
        model = UserMission
        fields = ['id', 'mission', 'status', 'current_progress', 'assigned_date']

class StreakGoalSerializer(serializers.ModelSerializer):
    class Meta:
        model = StreakGoal
        fields = ['id', 'title', 'duration_days', 'reward_gems']


# --- کدهای مربوط به API لیگ از اینجا شروع می‌شود ---

class LeagueInfoSerializer(serializers.ModelSerializer):
    """ سریالایزر برای اطلاعات پایه لیگ (معادل LeagueInfo در فلاتر) """
    class Meta:
        model = League
        fields = [
            'level_number', 
            'name', 
            'icon', 
            'card_image_url', 
            'promotion_spots', 
            'demotion_spots'
        ]


class LeagueMemberSerializer(serializers.Serializer):
    """ سریالایزر برای اعضای لیگ (معادل LeagueMember در فلاتر) """
    user_id = serializers.IntegerField()
    display_name = serializers.CharField()
    weekly_xp = serializers.IntegerField()
    rank = serializers.IntegerField()


class LeagueDataSerializer(serializers.Serializer):
    """
    سریالایزر اصلی که ساختار نهایی JSON را برای اپلیکیشن فلاتر می‌سازد.
    """
    league_end_time = serializers.SerializerMethodField()
    league_info = serializers.SerializerMethodField()
    group_members = serializers.SerializerMethodField()
    hall_of_fame = serializers.SerializerMethodField()
    current_user_rank_info = serializers.SerializerMethodField()

    def get_league_end_time(self, obj):
        league_group = obj['league_group']
        start_datetime = datetime.datetime.combine(
            league_group.week_start_date,
            datetime.time.min,
            tzinfo=timezone.get_current_timezone()
        )
        end_datetime = start_datetime + datetime.timedelta(days=7, seconds=-1)
        return end_datetime.isoformat()

    def get_league_info(self, obj):
        league_group = obj['league_group']
        serializer = LeagueInfoSerializer(league_group.league)
        return serializer.data

    def _get_ranked_members(self, obj):
        """
        ✅ **منطق کاملاً بازنویسی شده برای حل مشکل**
        حالا تمام کاربران سیستم در نظر گرفته می‌شوند، نه فقط آنهایی که پیشرفت دارند.
        """
        if hasattr(self, '_cached_members'):
             return self._cached_members

        league_group = obj['league_group']
        subject = league_group.subject
        
        from progress.models import SubjectProgress
        from users.models import Profile

        # ۱. تمام کاربران فعال سیستم را دریافت می‌کنیم.
        all_users = User.objects.filter(is_active=True).select_related('profile')
        
        # ۲. تمام رکوردهای پیشرفت برای درس فعلی را در یک دیکشنری ذخیره می‌کنیم تا دسترسی سریع باشد.
        progress_map = {
            p.user_id: p for p in SubjectProgress.objects.filter(
                subject=subject, user__in=all_users
            )
        }

        # ۳. لیست اعضا را با در نظر گرفتن تمام کاربران می‌سازیم.
        members_data = []
        for user in all_users:
            user_progress = progress_map.get(user.id)
            weekly_xp = user_progress.weekly_xp if user_progress else 0
            
            # اطمینان از وجود پروفایل برای جلوگیری از کرش
            display_name = user.profile.display_name if hasattr(user, 'profile') and user.profile.display_name else user.username
            
            members_data.append({
                'user_id': user.id,
                'display_name': display_name,
                'weekly_xp': weekly_xp,
            })
        
        # ۴. اعضا را بر اساس امتیاز هفتگی مرتب‌سازی کرده و به آنها رتبه می‌دهیم.
        members_data.sort(key=lambda x: x['weekly_xp'], reverse=True)
        
        ranked_members = []
        for i, member in enumerate(members_data):
            member['rank'] = i + 1
            ranked_members.append(member)
        
        self._cached_members = ranked_members
        return ranked_members

    def get_group_members(self, obj):
        all_members = self._get_ranked_members(obj)
        serializer = LeagueMemberSerializer(all_members, many=True)
        return serializer.data

    def get_hall_of_fame(self, obj):
        # این بخش فعلاً پیاده‌سازی نشده است.
        return []

    def get_current_user_rank_info(self, obj):
        user = obj['user']
        all_members = self._get_ranked_members(obj)
        current_user_data = next((member for member in all_members if member['user_id'] == user.id), None)
        
        if current_user_data:
            serializer = LeagueMemberSerializer(current_user_data)
            return serializer.data
        return None
