from collections import defaultdict

from django.core.management.base import BaseCommand

from api.models import TtStudent, TtStudentSetStudent, TtStudentPosModule, TtStudentResourceMap, TtWeek, TtSetting
from api.utils import bulk_sync_to_redis, import_get_resource_map_redis_data
from backend.redis_client import redis_client


class Command(BaseCommand):
    # Sync all students with academic terms to Redis and calculate their resource maps by academic term week
    # will be enhance after allocation those done
    def handle(self, *args, **options):
        settings = TtSetting.get_multiple_setting({"slot_per_week"})
        slot_per_week = int(settings["slot_per_week"])
        default_resource_map_pattern = "0" * slot_per_week

        redis_data = {
            "insert": {},
            "update": {},
        }
        redis_table = "student"

        models = TtStudent.objects.filter(academic_term__isnull=False).prefetch_related(
            "academic_term",
            "pos",
            "pos_module",
        ).distinct()

        student_ids = list(models.values_list("id", flat=True))

        student_resource_map_rows = []
        redis_table_data = {}
        for student in models:
            academic_term_ids = [term.id for term in student.academic_term.all()]
            weeks_data = TtWeek.objects.filter(ttacademicterm__id__in=academic_term_ids).order_by("week").distinct()
            resource_map_redis_data = {}

            for week in weeks_data:
                student_resource_map_rows.append({
                    "student_id": student.id,
                    "week_id": week.id,
                    "pattern": default_resource_map_pattern,
                })
                redis_week = int(week.week) - 1
                resource_map_redis_data[redis_week] = default_resource_map_pattern

            redis_table_data[student.id] = {
                "resource_map": resource_map_redis_data,
            }

        if student_resource_map_rows:
            bulk_rows = [
                TtStudentResourceMap(
                    student_id=row["student_id"],
                    week_id=row["week_id"],
                    pattern=row["pattern"],
                )
                for row in student_resource_map_rows
            ]
            TtStudentResourceMap.objects.bulk_create(bulk_rows, ignore_conflicts=True)

        redis_data["update"][redis_table] = import_get_resource_map_redis_data("student", list(redis_table_data.keys()))

        bulk_sync_to_redis(redis_client, redis_data)
        print(f"Synced student resource maps for {len(redis_table_data)} students to Redis.")