"""validation niveaux inferieurs

Revision ID: c701224fa255
Revises: d84bc592584e
Create Date: 2023-06-11 11:08:05.553898

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker  # added by ev

# revision identifiers, used by Alembic.
revision = "c701224fa255"
down_revision = "d84bc592584e"
branch_labels = None
depends_on = None

Session = sessionmaker()


def upgrade():
    # Ajoute la colonne formation_id, nullable, la peuple puis la rend non nullable
    op.add_column(
        "apc_validation_annee", sa.Column("formation_id", sa.Integer(), nullable=True)
    )
    op.create_foreign_key(
        "apc_validation_annee_formation_id_fkey",
        "apc_validation_annee",
        "notes_formations",
        ["formation_id"],
        ["id"],
    )

    # Affecte la formation des anciennes validations
    bind = op.get_bind()
    session = Session(bind=bind)
    session.execute(
        sa.text(
            """
        UPDATE apc_validation_annee AS a
        SET formation_id = (
            SELECT f.id
            FROM notes_formations f
            JOIN notes_formsemestre s ON f.id = s.formation_id
            WHERE s.id = a.formsemestre_id
        )
        WHERE a.formsemestre_id IS NOT NULL;
        """
        )
    )
    op.alter_column(
        "apc_validation_annee",
        "formation_id",
        nullable=False,
    )


def downgrade():
    with op.batch_alter_table("apc_validation_annee", schema=None) as batch_op:
        batch_op.drop_constraint(
            "apc_validation_annee_formation_id_fkey", type_="foreignkey"
        )
        batch_op.drop_column("formation_id")