from django.core.management.base import BaseCommand

from api.models import TtAcademicTerm, TtActivity, TtSetting
from api.utils import convert_to_redis_week, bulk_sync_to_redis, recalculate_resource_map, get_resource_map_redis_data
from backend.redis_client import redis_client

class Command(BaseCommand):
    def handle(self, *args, **options):
        redis_data={
            "update":{},
        }
        redis_table = "activity"
        redis_student_set_table = "student_set"

        setting_params = {
            "slot_per_week",
        }
        settings = TtSetting.get_multiple_setting(setting_params)
        slot_per_week = int(settings["slot_per_week"])

        ids = [
            45416,
            45417,
            45718,
            46306,
            46307,
            46314,
            46315,
            46317,
            46318,
            46340,
            46341,
            46343,
            46395,
            46396,
            46397,
            46431,
            46432,
            46461,
            46712,
            46841,
            48266,
            48267,
            48556,
            48558,
            48559,
            48560
        ]
        models = TtActivity.objects.filter(
            id__in=ids,
            is_jta=1,
            jta_parent_id__isnull=True,
        ).prefetch_related("student_set","week","week_pattern__week").all()

        total = 0
        student_set_with_affected_week = {}
        scheduled_student_set_ids = set()
        for val in models:
            total += 1
            parent_activities = TtActivity.objects.filter(jta_parent_id=val.id).prefetch_related("student_set")
            student_set_ids = set()
            if val.week_pattern:
                week_ids = [aw.id for aw in val.week_pattern.week.all()]
            else:
                week_ids = [aw.id for aw in val.week.all()]

            for parent_activity in parent_activities:
                parent_student_set_ids = {ss.id for ss in parent_activity.student_set.all()}
                for student_set_id in parent_student_set_ids:
                    student_set_with_affected_week.setdefault(student_set_id, set()).update(week_ids)
                scheduled_student_set_ids.update(parent_student_set_ids)
                student_set_ids.update(parent_student_set_ids)
            val.student_set.set(list(student_set_ids))
            redis_data["update"].setdefault(redis_table, []).append({"id": val.id, "student_sets": list(student_set_ids)})
        student_set_with_affected_week = {k: v for k, v in student_set_with_affected_week.items() if v}
        # if activity already scheduled, ned update the resource map for all student set inside this activity
        if student_set_with_affected_week:
            recalculate_resource_map("student_set", student_set_with_affected_week, slot_per_week)
            redis_data["update"][redis_student_set_table] = get_resource_map_redis_data("student_set",scheduled_student_set_ids)
        bulk_sync_to_redis(redis_client, redis_data)
        print("activity count:"+str(total))

