from rest_framework import generics, permissions, status
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Mission, UserMission, UserInventory, StreakGoal, League, LeagueGroup
from .serializers import (
    UserMissionSerializer, 
    StreakGoalSerializer, 
    LeagueDataSerializer
)
from progress.models import SubjectProgress
from subjects.models import Subject
import datetime
import random
from django.utils import timezone

# --- ویوهای مربوط به ماموریت و زنجیره (بدون تغییر) ---

class UserMissionListView(APIView):
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = UserMissionSerializer

    def get(self, request, *args, **kwargs):
        user = request.user
        today = datetime.date.today()
        
        # ۱. دریافت مأموریت‌های امروز کاربر (بدون فیلتر درس)
        user_missions = UserMission.objects.filter(user=user, assigned_date=today)
        
        # ۲. اگر مأموریتی برای امروز نداشت، بساز
        if not user_missions.exists():
            active_missions = list(Mission.objects.filter(is_active=True))
            if active_missions:
                num_to_assign = min(len(active_missions), 3)
                missions_to_assign = random.sample(active_missions, num_to_assign)
                
                new_user_missions = []
                for mission in missions_to_assign:
                    user_mission = UserMission.objects.create(
                        user=user, 
                        mission=mission, 
                        assigned_date=today
                    )
                    new_user_missions.append(user_mission)
                user_missions = new_user_missions

        serializer = self.serializer_class(user_missions, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

class ClaimMissionRewardView(APIView):
    permission_classes = [permissions.IsAuthenticated]
    
    def post(self, request, *args, **kwargs):
        user_mission_id = request.data.get('user_mission_id')
        subject_id = request.data.get('subject_id')
        
        if not user_mission_id or not subject_id:
            return Response({'error': 'شناسه‌های user_mission_id و subject_id مورد نیاز است.'}, status=status.HTTP_400_BAD_REQUEST)
        
        try:
            user_mission = UserMission.objects.get(id=user_mission_id, user=request.user)
            
            # ✅ اصلاح شده: استفاده از get_or_create برای جلوگیری از کرش
            subject_progress, _ = SubjectProgress.objects.get_or_create(user=request.user, subject_id=subject_id)
            
        except UserMission.DoesNotExist:
            return Response({'error': 'ماموریت یافت نشد.'}, status=status.HTTP_404_NOT_FOUND)
        
        if user_mission.status != 'COMPLETED':
            return Response({'error': 'این ماموریت تکمیل نشده است.'}, status=status.HTTP_400_BAD_REQUEST)

        mission = user_mission.mission
        
        # دسترسی ایمن به پروفایل
        user_profile, _ = Profile.objects.get_or_create(user=request.user)
        
        # اعمال جوایز
        user_profile.gem += mission.reward_gems
        subject_progress.hearts += mission.reward_hearts
        
        if mission.reward_item:
            inventory_item, created = UserInventory.objects.get_or_create(user=request.user, item=mission.reward_item)
            if not created:
                inventory_item.quantity += 1
            inventory_item.save()
            
        user_mission.status = 'CLAIMED'
        user_mission.save()
        user_profile.save()
        subject_progress.save()
        
        return Response({'status': 'جایزه با موفقیت دریافت شد!'}, status=status.HTTP_200_OK)
        
class StreakGoalListView(generics.ListAPIView):
    queryset = StreakGoal.objects.filter(is_active=True)
    serializer_class = StreakGoalSerializer
    permission_classes = [permissions.IsAuthenticated]

class SelectStreakGoalView(APIView):
    permission_classes = [permissions.IsAuthenticated]
    def post(self, request, *args, **kwargs):
        goal_id = request.data.get('goal_id')
        subject_id = request.data.get('subject_id')
        if not goal_id or not subject_id:
            return Response({'error': 'شناسه‌های goal_id و subject_id مورد نیاز است.'}, status=status.HTTP_400_BAD_REQUEST)
        try:
            goal = StreakGoal.objects.get(id=goal_id, is_active=True)
            subject_progress = SubjectProgress.objects.get(user=request.user, subject_id=subject_id)
        except (StreakGoal.DoesNotExist, SubjectProgress.DoesNotExist):
            return Response({'error': 'هدف یا پیشرفت یافت نشد.'}, status=status.HTTP_404_NOT_FOUND)
        
        subject_progress.active_streak_goal = goal
        subject_progress.save()
        return Response({'status': f'هدف "{goal.title}" با موفقیت برای شما فعال شد.'}, status=status.HTTP_200_OK)


# --- متد کمکی برای محاسبه تاریخ شروع هفته ---
def get_current_week_start_date(today):
    days_since_saturday = (today.weekday() + 2) % 7
    return today - datetime.timedelta(days=days_since_saturday)


# --- ویو اصلی و نهایی برای API لیگ ---
class CurrentLeagueDataView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request, *args, **kwargs):
        subject_id = request.query_params.get('subject_id')
        if not subject_id:
            return Response({'error': 'subject_id parameter is required.'}, status=status.HTTP_400_BAD_REQUEST)

        user = request.user
        today = timezone.now().date()
        week_start = get_current_week_start_date(today)

        user_progress, _ = SubjectProgress.objects.get_or_create(user=user, subject_id=subject_id)
        league_group = user_progress.league_group

        if not league_group or league_group.week_start_date != week_start:
            if league_group:
                current_league = league_group.league
            else:
                current_league = League.objects.filter(level_number=1).first()
                if not current_league:
                    return Response({'error': 'No leagues defined in the system.'}, status=status.HTTP_404_NOT_FOUND)
            
            new_league_group, _ = LeagueGroup.objects.get_or_create(
                league=current_league,
                subject_id=subject_id,
                week_start_date=week_start
            )

            user_progress.league_group = new_league_group
            user_progress.league_group_joined_date = today
            user_progress.save()
            league_group = new_league_group

        if not league_group:
             return Response({'error': 'League group not found.'}, status=status.HTTP_404_NOT_FOUND)

        context_data = {'league_group': league_group, 'user': user}
        serializer = LeagueDataSerializer(context_data)
        return Response(serializer.data, status=status.HTTP_200_OK)

