from collections import defaultdict

from django.core.management.base import BaseCommand

from api.models import TtStudent, TtStudentSetStudent, TtStudentPosModule
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 existing student records to Redis in the same structure used by the student create API.
    def handle(self, *args, **options):
        redis_data = {
            "insert": {},
            "update": {},
        }
        redis_table = "student"

        models = TtStudent.objects.prefetch_related(
            "academic_term",
            "pos",
            "pos_module",
        ).all()

        student_set_ids_map = defaultdict(list)
        for student_id, student_set_id in (
            TtStudentSetStudent.objects
            .values_list("student_id", "student_set_id")
            .all()
        ):
            student_set_ids_map[student_id].append(student_set_id)

        pos_module_map = defaultdict(list)
        for item in (
            TtStudentPosModule.objects
            .select_related(
                "pos_module_group_module",
                "pos_module_group_module__pos_module_group",
                "pos_module_group_module__pos_module_group__pos",
                "pos_module_group_module__module",
            )
            .values(
                "student_id",
                "pos_module_group_module__module_id",
                "pos_module_group_module__pos_module_group__pos_id",
            )
            .all()
        ):
            pos_module_map[item["student_id"]].append({
                "module_id": item["pos_module_group_module__module_id"],
                "pos_id": item["pos_module_group_module__pos_module_group__pos_id"],
            })

        redis_table_data = {}
        for student in models:
            redis_table_data[student.id] = {
                "id": student.id,
                "code": student.code,
                "name": student.name,
                "email": student.email,
                "department_id": student.department_id,
                "academic_term_ids": [term.id for term in student.academic_term.all()],
                "pos_ids": [pos.id for pos in student.pos.all()],
                "pos_module": pos_module_map.get(student.id, []),
                "student_set_ids": student_set_ids_map.get(student.id, []),
                "resource_map": {},
            }

        redis_data["insert"].setdefault(redis_table, []).extend(redis_table_data.values())
        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("Synced to redis - student count:"+str(len(redis_data['insert'].get(redis_table, []))))
        print("Synced to redis - student count:"+str(len(redis_data['update'].get(redis_table, []))))