from app import db

from app.scodoc import sco_groups
import app.scodoc.notesdb as ndb


def clone_partitions_and_groups(
    orig_formsemestre_id: int, formsemestre_id: int, inscrit_etuds=False
):
    """Crée dans le semestre formsemestre_id les mêmes partitions et groupes que ceux
    de orig_formsemestre_id.
    Si inscrit_etuds, inscrit les mêmes étudiants (rarement souhaité).
    """
    list_groups_per_part = []
    list_groups = []
    groups_old2new = {}  # old group_id : new_group_id
    # Création des partitions:
    for part in sco_groups.get_partitions_list(orig_formsemestre_id):
        if part["partition_name"] is not None:
            partname = part["partition_name"]
            new_partition_id = sco_groups.partition_create(
                formsemestre_id,
                partition_name=partname,
                numero=part["numero"],
                redirect=False,
            )
            for group in sco_groups.get_partition_groups(part):
                if group["group_name"] != None:
                    list_groups.append(group)
            list_groups_per_part.append([new_partition_id, list_groups])
            list_groups = []

    # Création des groupes dans les nouvelles partitions:
    for newpart in sco_groups.get_partitions_list(formsemestre_id):
        for (new_partition_id, list_groups) in list_groups_per_part:
            if newpart["partition_id"] == new_partition_id:
                for group in list_groups:
                    new_group = sco_groups.create_group(
                        new_partition_id, group_name=group["group_name"]
                    )
                    groups_old2new[group["group_id"]] = new_group.id
    #
    if inscrit_etuds:
        cnx = ndb.GetDBConnexion()
        cursor = cnx.cursor()
        for old_group_id, new_group.id in groups_old2new.items():
            cursor.execute(
                """
                WITH etuds AS (
                    SELECT gm.etudid
                    FROM group_membership gm, notes_formsemestre_inscription ins
                    WHERE ins.etudid = gm.etudid
                    AND ins.formsemestre_id = %(orig_formsemestre_id)s
                    AND gm.group_id=%(old_group_id)s
                    )
                INSERT INTO group_membership (etudid, group_id)
                SELECT *, %(new_group_id)s FROM etuds
                ON CONFLICT DO NOTHING
                """,
                {
                    "orig_formsemestre_id": orig_formsemestre_id,
                    "old_group_id": old_group_id,
                    "new_group_id": new_group.id,
                },
            )
        cnx.commit()