<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

final class Version20260502115535 extends AbstractMigration
{
    public function getDescription(): string
    {
        return 'Add multi-parcours inscription and student assignment tables';
    }

    public function up(Schema $schema): void
    {
        $this->addSql('CREATE TABLE inscription_parcours (id INT AUTO_INCREMENT NOT NULL, ecole_id INT NOT NULL, inscription_id INT NOT NULL, annee_scolaire_id INT DEFAULT NULL, section_souhaitee_id INT DEFAULT NULL, niveau_souhaite_id INT DEFAULT NULL, classe_souhaitee_id INT DEFAULT NULL, section_finale_id INT DEFAULT NULL, niveau_final_id INT DEFAULT NULL, classe_finale_id INT DEFAULT NULL, langue_souhaitee VARCHAR(40) DEFAULT NULL, mode_souhaite VARCHAR(40) DEFAULT NULL, tarif_propose NUMERIC(10, 2) DEFAULT NULL, ordre INT DEFAULT 1 NOT NULL, principal TINYINT DEFAULT 0 NOT NULL, actif TINYINT DEFAULT 1 NOT NULL, observation LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', updated_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', INDEX IDX_INSCRIPTION_PARCOURS_ECOLE (ecole_id), INDEX IDX_INSCRIPTION_PARCOURS_INSCRIPTION (inscription_id), INDEX IDX_INSCRIPTION_PARCOURS_ANNEE (annee_scolaire_id), INDEX IDX_INSCRIPTION_PARCOURS_SECTION_SOUHAITEE (section_souhaitee_id), INDEX IDX_INSCRIPTION_PARCOURS_NIVEAU_SOUHAITE (niveau_souhaite_id), INDEX IDX_INSCRIPTION_PARCOURS_CLASSE_SOUHAITEE (classe_souhaitee_id), INDEX IDX_INSCRIPTION_PARCOURS_SECTION_FINALE (section_finale_id), INDEX IDX_INSCRIPTION_PARCOURS_NIVEAU_FINAL (niveau_final_id), INDEX IDX_INSCRIPTION_PARCOURS_CLASSE_FINALE (classe_finale_id), INDEX IDX_INSCRIPTION_PARCOURS_ACTIVE_ORDER (inscription_id, actif, principal, ordre), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4');
        $this->addSql('CREATE TABLE parcours_etudiant (id INT AUTO_INCREMENT NOT NULL, ecole_id INT NOT NULL, etudiant_id INT NOT NULL, annee_scolaire_id INT DEFAULT NULL, section_id INT DEFAULT NULL, niveau_id INT DEFAULT NULL, classe_id INT DEFAULT NULL, inscription_id INT DEFAULT NULL, inscription_parcours_id INT DEFAULT NULL, langue VARCHAR(40) DEFAULT NULL, mode VARCHAR(40) DEFAULT NULL, tarif_applique NUMERIC(10, 2) DEFAULT NULL, statut VARCHAR(30) DEFAULT \'ACTIF\' NOT NULL, principal TINYINT DEFAULT 0 NOT NULL, actif TINYINT DEFAULT 1 NOT NULL, date_debut DATE DEFAULT NULL, date_fin DATE DEFAULT NULL, observation LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', updated_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', INDEX IDX_PARCOURS_ETUDIANT_ECOLE (ecole_id), INDEX IDX_PARCOURS_ETUDIANT_ETUDIANT (etudiant_id), INDEX IDX_PARCOURS_ETUDIANT_ANNEE (annee_scolaire_id), INDEX IDX_PARCOURS_ETUDIANT_SECTION (section_id), INDEX IDX_PARCOURS_ETUDIANT_NIVEAU (niveau_id), INDEX IDX_PARCOURS_ETUDIANT_CLASSE (classe_id), INDEX IDX_PARCOURS_ETUDIANT_INSCRIPTION (inscription_id), INDEX IDX_PARCOURS_ETUDIANT_INSCRIPTION_PARCOURS (inscription_parcours_id), INDEX IDX_PARCOURS_ETUDIANT_ACTIVE_CLASS (etudiant_id, annee_scolaire_id, classe_id, actif, statut), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4');

        $this->addSql('ALTER TABLE inscription_parcours ADD CONSTRAINT FK_INSCRIPTION_PARCOURS_ECOLE FOREIGN KEY (ecole_id) REFERENCES ecoles (id) ON DELETE CASCADE');
        $this->addSql('ALTER TABLE inscription_parcours ADD CONSTRAINT FK_INSCRIPTION_PARCOURS_INSCRIPTION FOREIGN KEY (inscription_id) REFERENCES inscriptions (id) ON DELETE CASCADE');
        $this->addSql('ALTER TABLE inscription_parcours ADD CONSTRAINT FK_INSCRIPTION_PARCOURS_ANNEE FOREIGN KEY (annee_scolaire_id) REFERENCES annees_scolaires (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE inscription_parcours ADD CONSTRAINT FK_INSCRIPTION_PARCOURS_SECTION_SOUHAITEE FOREIGN KEY (section_souhaitee_id) REFERENCES sections (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE inscription_parcours ADD CONSTRAINT FK_INSCRIPTION_PARCOURS_NIVEAU_SOUHAITE FOREIGN KEY (niveau_souhaite_id) REFERENCES niveaux (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE inscription_parcours ADD CONSTRAINT FK_INSCRIPTION_PARCOURS_CLASSE_SOUHAITEE FOREIGN KEY (classe_souhaitee_id) REFERENCES classes (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE inscription_parcours ADD CONSTRAINT FK_INSCRIPTION_PARCOURS_SECTION_FINALE FOREIGN KEY (section_finale_id) REFERENCES sections (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE inscription_parcours ADD CONSTRAINT FK_INSCRIPTION_PARCOURS_NIVEAU_FINAL FOREIGN KEY (niveau_final_id) REFERENCES niveaux (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE inscription_parcours ADD CONSTRAINT FK_INSCRIPTION_PARCOURS_CLASSE_FINALE FOREIGN KEY (classe_finale_id) REFERENCES classes (id) ON DELETE SET NULL');

        $this->addSql('ALTER TABLE parcours_etudiant ADD CONSTRAINT FK_PARCOURS_ETUDIANT_ECOLE FOREIGN KEY (ecole_id) REFERENCES ecoles (id) ON DELETE CASCADE');
        $this->addSql('ALTER TABLE parcours_etudiant ADD CONSTRAINT FK_PARCOURS_ETUDIANT_ETUDIANT FOREIGN KEY (etudiant_id) REFERENCES etudiants (id) ON DELETE CASCADE');
        $this->addSql('ALTER TABLE parcours_etudiant ADD CONSTRAINT FK_PARCOURS_ETUDIANT_ANNEE FOREIGN KEY (annee_scolaire_id) REFERENCES annees_scolaires (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE parcours_etudiant ADD CONSTRAINT FK_PARCOURS_ETUDIANT_SECTION FOREIGN KEY (section_id) REFERENCES sections (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE parcours_etudiant ADD CONSTRAINT FK_PARCOURS_ETUDIANT_NIVEAU FOREIGN KEY (niveau_id) REFERENCES niveaux (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE parcours_etudiant ADD CONSTRAINT FK_PARCOURS_ETUDIANT_CLASSE FOREIGN KEY (classe_id) REFERENCES classes (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE parcours_etudiant ADD CONSTRAINT FK_PARCOURS_ETUDIANT_INSCRIPTION FOREIGN KEY (inscription_id) REFERENCES inscriptions (id) ON DELETE SET NULL');
        $this->addSql('ALTER TABLE parcours_etudiant ADD CONSTRAINT FK_PARCOURS_ETUDIANT_INSCRIPTION_PARCOURS FOREIGN KEY (inscription_parcours_id) REFERENCES inscription_parcours (id) ON DELETE SET NULL');

        $this->addSql('INSERT INTO inscription_parcours (ecole_id, inscription_id, annee_scolaire_id, section_souhaitee_id, niveau_souhaite_id, classe_souhaitee_id, section_finale_id, niveau_final_id, classe_finale_id, langue_souhaitee, mode_souhaite, tarif_propose, ordre, principal, actif, observation, created_at, updated_at) SELECT ecole_id, id, annee_scolaire_id, section_souhaitee_id, niveau_souhaite_id, classe_souhaitee_id, COALESCE(section_finale_id, section_souhaitee_id), COALESCE(niveau_final_id, niveau_souhaite_id), COALESCE(classe_finale_id, classe_souhaitee_id), langue_souhaitee, mode_souhaite, NULL, 1, 1, 1, observation_admin, NOW(), NOW() FROM inscriptions WHERE section_souhaitee_id IS NOT NULL OR niveau_souhaite_id IS NOT NULL OR classe_souhaitee_id IS NOT NULL OR section_finale_id IS NOT NULL OR niveau_final_id IS NOT NULL OR classe_finale_id IS NOT NULL OR langue_souhaitee IS NOT NULL OR mode_souhaite IS NOT NULL');
        $this->addSql('INSERT INTO parcours_etudiant (ecole_id, etudiant_id, annee_scolaire_id, section_id, niveau_id, classe_id, inscription_id, inscription_parcours_id, langue, mode, tarif_applique, statut, principal, actif, date_debut, date_fin, observation, created_at, updated_at) SELECT etudiants.ecole_id, etudiants.id, etudiants.annee_scolaire_id, etudiants.section_id, etudiants.niveau_id, etudiants.classe_id, NULL, NULL, NULL, NULL, classes.tarif_defaut, \'ACTIF\', 1, etudiants.actif, NULL, NULL, NULL, NOW(), NOW() FROM etudiants LEFT JOIN classes ON classes.id = etudiants.classe_id WHERE etudiants.section_id IS NOT NULL OR etudiants.niveau_id IS NOT NULL OR etudiants.classe_id IS NOT NULL');
    }

    public function down(Schema $schema): void
    {
        $this->addSql('ALTER TABLE parcours_etudiant DROP FOREIGN KEY FK_PARCOURS_ETUDIANT_INSCRIPTION_PARCOURS');
        $this->addSql('ALTER TABLE parcours_etudiant DROP FOREIGN KEY FK_PARCOURS_ETUDIANT_INSCRIPTION');
        $this->addSql('ALTER TABLE parcours_etudiant DROP FOREIGN KEY FK_PARCOURS_ETUDIANT_CLASSE');
        $this->addSql('ALTER TABLE parcours_etudiant DROP FOREIGN KEY FK_PARCOURS_ETUDIANT_NIVEAU');
        $this->addSql('ALTER TABLE parcours_etudiant DROP FOREIGN KEY FK_PARCOURS_ETUDIANT_SECTION');
        $this->addSql('ALTER TABLE parcours_etudiant DROP FOREIGN KEY FK_PARCOURS_ETUDIANT_ANNEE');
        $this->addSql('ALTER TABLE parcours_etudiant DROP FOREIGN KEY FK_PARCOURS_ETUDIANT_ETUDIANT');
        $this->addSql('ALTER TABLE parcours_etudiant DROP FOREIGN KEY FK_PARCOURS_ETUDIANT_ECOLE');
        $this->addSql('ALTER TABLE inscription_parcours DROP FOREIGN KEY FK_INSCRIPTION_PARCOURS_CLASSE_FINALE');
        $this->addSql('ALTER TABLE inscription_parcours DROP FOREIGN KEY FK_INSCRIPTION_PARCOURS_NIVEAU_FINAL');
        $this->addSql('ALTER TABLE inscription_parcours DROP FOREIGN KEY FK_INSCRIPTION_PARCOURS_SECTION_FINALE');
        $this->addSql('ALTER TABLE inscription_parcours DROP FOREIGN KEY FK_INSCRIPTION_PARCOURS_CLASSE_SOUHAITEE');
        $this->addSql('ALTER TABLE inscription_parcours DROP FOREIGN KEY FK_INSCRIPTION_PARCOURS_NIVEAU_SOUHAITE');
        $this->addSql('ALTER TABLE inscription_parcours DROP FOREIGN KEY FK_INSCRIPTION_PARCOURS_SECTION_SOUHAITEE');
        $this->addSql('ALTER TABLE inscription_parcours DROP FOREIGN KEY FK_INSCRIPTION_PARCOURS_ANNEE');
        $this->addSql('ALTER TABLE inscription_parcours DROP FOREIGN KEY FK_INSCRIPTION_PARCOURS_INSCRIPTION');
        $this->addSql('ALTER TABLE inscription_parcours DROP FOREIGN KEY FK_INSCRIPTION_PARCOURS_ECOLE');
        $this->addSql('DROP TABLE parcours_etudiant');
        $this->addSql('DROP TABLE inscription_parcours');
    }
}
