from django.db.models import Sum
# ایمپورت مدل‌های اپ دیگر (Work) مشکلی ندارد و می‌تواند بالا بماند
from Work.models import WorkLog, Attendance

def calculate_user_period_score(user, start_date, end_date):
    """
    محاسبه امتیاز نهایی یک کاربر در یک بازه زمانی
    """
    # --- تغییر مهم: ایمپورت مدل‌های همین اپ را اینجا (داخل تابع) انجام دهید ---
    from .models import EmployeeLevel, WorkScore 
    # -----------------------------------------------------------------------

    # 1. دریافت اطلاعات کاربر
    try:
        seniority = user.profile.scoring_level.seniority_coefficient
    except:
        seniority = 1.0 # پیش فرض

    # 2. دریافت کارهای انجام شده (Done) در بازه
    logs = WorkLog.objects.filter(
        user=user, 
        status='done',
        end_time__range=(start_date, end_date)
    )

    total_task_value = 0
    total_actual_minutes = 0

    for log in logs:
        # اگر هنوز امتیازدهی نشده، یک امتیاز پیش‌فرض (3 ستاره) برایش بساز
        if not hasattr(log, 'scoring_detail'):
            score_obj = WorkScore.objects.create(work_log=log)
        else:
            score_obj = log.scoring_detail
            
        # جمع امتیازات تسک‌ها
        total_task_value += score_obj.final_task_score
        
        # جمع زمان واقعی
        total_actual_minutes += log.actual_minutes

    # 3. دریافت زمان حضور (Attendance)
    attendances = Attendance.objects.filter(user=user, date__range=(start_date.date(), end_date.date()))
    total_attendance_seconds = attendances.aggregate(Sum('total_seconds'))['total_seconds__sum'] or 0
    total_attendance_minutes = total_attendance_seconds // 60

    # 4. محاسبه زمان بیکاری (Idle Time)
    idle_minutes = max(0, total_attendance_minutes - total_actual_minutes)
    
    # 5. جریمه بیکاری
    PENALTY_PER_MINUTE = 1 
    penalty_score = idle_minutes * PENALTY_PER_MINUTE

    # 6. محاسبه نهایی
    final_score = total_task_value - penalty_score

    return {
        'user': user.get_full_name(),
        'total_task_score': total_task_value,
        'total_attendance_minutes': total_attendance_minutes,
        'total_actual_minutes': total_actual_minutes,
        'idle_minutes': idle_minutes,
        'penalty_score': penalty_score,
        'final_score': max(0, final_score),
        'seniority_used': seniority
    }