from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
from subjects.models import Subject, ConceptLevel, Skill, Exercise, PathNode
from gamification.models import StreakGoal, LeagueGroup
from users.models import AppSettings


def _safe_default_hearts() -> int:
    try:
        settings = AppSettings.load()
        return getattr(settings, 'default_hearts', 5)
    except Exception:
        return 5


class SubjectProgress(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='subject_progress')
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, related_name='user_progress')

    total_xp = models.PositiveIntegerField(default=0, verbose_name="امتیاز کل")
    weekly_xp = models.PositiveIntegerField(default=0, verbose_name="امتیاز هفتگی")

    hearts = models.IntegerField(default=5, help_text="تعداد قلب‌های فعلی در این موضوع")
    streak = models.PositiveIntegerField(default=0, verbose_name="طول زنجیره روزانه")
    is_streak_frozen = models.BooleanField(default=False, verbose_name="فریز بودن زنجیره")
    last_activity_date = models.DateField(null=True, blank=True, verbose_name="آخرین تاریخ فعالیت")

    active_streak_goal = models.ForeignKey(
        'gamification.StreakGoal',
        on_delete=models.SET_NULL,
        null=True, blank=True,
        verbose_name="هدف زنجیرهٔ فعال"
    )

    league_group = models.ForeignKey(
        'gamification.LeagueGroup',
        on_delete=models.SET_NULL,
        null=True, blank=True,
        related_name='members',
        verbose_name="گروه لیگ"
    )
    league_group_joined_date = models.DateField(null=True, blank=True, verbose_name="تاریخ ورود به گروه لیگ")

    # ✅ برای اضافه شدن روی جدول موجود بدون پرامپت
    created_at = models.DateTimeField(default=timezone.now, editable=False)
    updated_at = models.DateTimeField(auto_now=True, null=True, blank=True)


    class Meta:
        unique_together = ('user', 'subject')
        verbose_name = "پیشرفت کاربر در موضوع"
        verbose_name_plural = "پیشرفت‌های کاربران در موضوعات"

    def __str__(self):
        return f"{self.user.username} · {self.subject.title}"

    def get_default_hearts(self) -> int:
        return _safe_default_hearts()


class ConceptLevelMastery(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='concept_level_mastery')
    concept_level = models.ForeignKey(ConceptLevel, on_delete=models.CASCADE, related_name='mastery')
    score = models.PositiveIntegerField(default=0)

    class Meta:
        unique_together = ('user', 'concept_level')
        verbose_name = "تسلط سطح مفهوم"
        verbose_name_plural = "تسلط سطوح مفاهیم"

    def __str__(self):
        return f"{self.user.username} · {self.concept_level}"

    @property
    def mastery_score(self):
        return self.score


class SkillMastery(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='skill_mastery')
    skill = models.ForeignKey(Skill, on_delete=models.CASCADE, related_name='user_mastery')
    score = models.PositiveIntegerField(default=0)

    class Meta:
        unique_together = ('user', 'skill')
        verbose_name = "تسلط مهارت"
        verbose_name_plural = "تسلط مهارت‌ها"

    def __str__(self):
        return f"{self.user.username} · {self.skill.name}"

    @property
    def mastery_score(self):
        return self.score


class ExerciseAttempt(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='exercise_attempts')
    exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, related_name='attempts')
    was_correct = models.BooleanField(default=False)
    xp_earned = models.PositiveIntegerField(default=0)

    # ✅ به‌جای auto_now_add
    created_at = models.DateTimeField(default=timezone.now, editable=False)

    class Meta:
        ordering = ['-created_at']
        verbose_name = "تلاش تمرین"
        verbose_name_plural = "تلاش‌های تمرین"

    def __str__(self):
        return f"Attempt #{self.id} · {self.user.username} · {'✓' if self.was_correct else '✗'}"


class UserNodeProgress(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='node_progress')
    node = models.ForeignKey(PathNode, on_delete=models.CASCADE, related_name='user_progress')
    completed_stages = models.PositiveIntegerField(default=0)
    chest_claimed = models.BooleanField(default=False)

    # ✅ به‌جای auto_now
    last_played_at = models.DateTimeField(default=timezone.now)

    class Meta:
        unique_together = ('user', 'node')
        verbose_name = "پیشرفت کاربر در نود"
        verbose_name_plural = "پیشرفت کاربران در نودها"

    def __str__(self):
        return f"{self.user.username} · node:{self.node_id} · stages:{self.completed_stages}"
