from datetime import timedelta
from django.utils import timezone


def calculate_student_risk(student):
    risk_score = 0
    factors = []
    thirty_days_ago = timezone.now().date() - timedelta(days=30)

    # 1. Посещаемость (макс 30)
    attendances = student.attendances.filter(schedule_item__date__gte=thirty_days_ago)
    total = attendances.count()

    if total > 0:
        absents = attendances.filter(status='absent').count()
        lates = attendances.filter(status='late').count()
        effective = absents + (lates * 0.5)
        percent = (effective / total) * 100
        attendance_risk = min(30, (percent / 100) * 30)
        risk_score += attendance_risk
        if absents > 0:
            factors.append(f"Пропуски: {absents} занятий")
        if lates > 0:
            factors.append(f"Опоздания: {lates} раз")

    # 2. Задания (макс 25) - ИСПРАВЛЕНО: используем related_name 'assignment_submissions'
    try:
        submissions = student.assignment_submissions.filter(
            assignment__deadline__gte=thirty_days_ago
        )
        total_sub = submissions.count()

        if total_sub > 0:
            failed = submissions.filter(status__in=['not_submitted', 'late', 'not_accepted']).count()
            percent = (failed / total_sub) * 100
            homework_risk = min(25, (percent / 100) * 25)
            risk_score += homework_risk
            if failed > 0:
                factors.append(f"Не сдано: {failed} из {total_sub} заданий")
    except Exception as e:
        # Если нет связанных заданий, просто пропускаем
        pass

    # 3. Долги (макс 20)
    try:
        debts = student.debts.filter(is_resolved=False)
        if debts.exists():
            debt_risk = min(20, debts.count() * 10)
            risk_score += debt_risk
            factors.append(f"Академические долги: {debts.count()} шт.")
    except Exception:
        pass

    # 4. Стипендия (15)
    if hasattr(student, 'receives_scholarship') and not student.receives_scholarship:
        risk_score += 15
        factors.append("Не получает стипендию")

    # 5. Работа (10)
    if hasattr(student, 'has_job') and student.has_job:
        risk_score += 10
        factors.append("Совмещает с работой")

    # 6. Олимпиады (бонус -10)
    try:
        olympiads = student.olympiads.all()
        if olympiads.exists():
            bonus = min(10, olympiads.count() * 3)
            risk_score -= bonus
            factors.append(f"Участие в олимпиадах: {olympiads.count()} шт.")
    except Exception:
        pass

    risk_score = max(0, min(100, risk_score))

    if risk_score <= 30:
        level = 'low'
        rec = "Риск низкий. Продолжайте обучение."
    elif risk_score <= 60:
        level = 'medium'
        rec = "Риск средний. Рекомендуется усилить контроль."
    elif risk_score <= 85:
        level = 'high'
        rec = "Риск высокий. Требуется вмешательство куратора."
    else:
        level = 'critical'
        rec = "КРИТИЧЕСКИЙ РИСК! Немедленно связаться с родителями."

    factors_text = "; ".join(factors) if factors else "Нет выявленных факторов риска"

    return round(risk_score, 1), level, factors_text, rec