<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

/**
 * Upgrade steps for local_kid.
 *
 * @package    local_kid
 */

defined('MOODLE_INTERNAL') || die();

function xmldb_local_kid_upgrade($oldversion) {
    global $DB;

    if ($oldversion < 2026071501) {
        // Migration 11 -> 16 capacités (par domaine : evaluate_evaluation/
        // stage/capp, publish_evaluation/stage/capp, manage_evaluation/
        // stage/capp, + sync_moodle, export_adesi, selectpromotion dédiées ;
        // view/viewany renommant viewdashboard/viewall ; validate/reopen/
        // import fusionnées dans les evaluate_* de domaine ; managecohorts
        // fusionnée dans manage). Environnement de test au moment de la
        // migration : aucune affectation des 3 anciens rôles à préserver.
        //
        // update_capabilities() doit être appelé explicitement ici (avant
        // la création des rôles) : Moodle ne l'exécute automatiquement
        // qu'APRÈS xmldb_local_kid_upgrade(), donc assign_capability() sur
        // une des 16 nouvelles capacités échouerait sinon avec
        // "Capability ... was not found". Idempotent, donc l'appel
        // automatique que Moodle fait ensuite est un no-op sûr. Ce même
        // appel supprime aussi, via delete_capability(), les 11 anciennes
        // capacités qui ne sont plus dans db/access.php (et purge leurs
        // lignes role_capabilities), évitant des capacités orphelines.
        update_capabilities('local_kid');

        \local_kid\local\role_setup::remove_legacy_roles();
        \local_kid\local\role_setup::create_functional_roles();

        upgrade_plugin_savepoint(true, 2026071501, 'local', 'kid');
    }

    if ($oldversion < 2026071601) {
        // Commentaire global du stage (un seul champ par dossier stage×élève,
        // en complément du commentaire par compétence de local_kid_stage_result
        // qui n'est pas touché) — même mécanisme que appreciationglobale sur
        // local_kid_capp_entry.
        $dbman = $DB->get_manager();
        $table = new xmldb_table('local_kid_stage_entry');
        $field = new xmldb_field('commentaireglobal', XMLDB_TYPE_TEXT, null, null, null, null, null, 'publishedby');

        if (!$dbman->field_exists($table, $field)) {
            $dbman->add_field($table, $field);
        }

        upgrade_plugin_savepoint(true, 2026071601, 'local', 'kid');
    }

    if ($oldversion < 2026081300) {
        // Onglet Journal (audit trail append-only) : nouvelle table dédiée
        // alimentée par un observateur unique sur les événements
        // local_kid\event\* existants (db/events.php), jamais le log store
        // core Moodle — voir plans/kind-leaping-bear.md. Capacité
        // local/kid:viewjournal ajoutée en même temps, accordée à
        // Scolarité + Admin pour l'instant (Stages/CAPP : décision ouverte).
        $dbman = $DB->get_manager();

        $table = new xmldb_table('local_kid_journal');
        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
        $table->add_field('action', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null);
        $table->add_field('domain', XMLDB_TYPE_CHAR, '10', null, null, null, null);
        $table->add_field('promotionid', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
        $table->add_field('studentid', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
        $table->add_field('entryid', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
        $table->add_field('competencyid', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
        $table->add_field('oldvalue', XMLDB_TYPE_TEXT, null, null, null, null, null);
        $table->add_field('newvalue', XMLDB_TYPE_TEXT, null, null, null, null, null);
        $table->add_field('context', XMLDB_TYPE_TEXT, null, null, null, null, null);
        $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
        $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']);
        $table->add_key('userid_fk', XMLDB_KEY_FOREIGN, ['userid'], 'user', ['id']);
        $table->add_key('promotionid_fk', XMLDB_KEY_FOREIGN, ['promotionid'], 'local_kid_promotion', ['id']);
        $table->add_key('studentid_fk', XMLDB_KEY_FOREIGN, ['studentid'], 'local_kid_student', ['id']);
        $table->add_index('domain', XMLDB_INDEX_NOTUNIQUE, ['domain']);
        $table->add_index('action', XMLDB_INDEX_NOTUNIQUE, ['action']);
        $table->add_index('timecreated', XMLDB_INDEX_NOTUNIQUE, ['timecreated']);
        $table->add_index('promotionid_timecreated', XMLDB_INDEX_NOTUNIQUE, ['promotionid', 'timecreated']);

        if (!$dbman->table_exists($table)) {
            $dbman->create_table($table);
        }

        update_capabilities('local_kid');
        \local_kid\local\role_setup::create_functional_roles();

        upgrade_plugin_savepoint(true, 2026081300, 'local', 'kid');
    }

    if ($oldversion < 2026081302) {
        // Comparateur de bilans : tableaux de bord favoris (filtres mémorisés
        // par utilisateur, jamais partagés). Capacité
        // local/kid:managedashboardfavourites ajoutée en même temps, accordée
        // aux 4 rôles fonctionnels + teacher (même périmètre que
        // viewjournal/viewannuaire).
        $dbman = $DB->get_manager();

        $table = new xmldb_table('local_kid_dashboard_favori');
        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
        $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
        $table->add_field('config', XMLDB_TYPE_TEXT, null, null, XMLDB_NOTNULL, null, null);
        $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
        $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
        $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']);
        $table->add_key('userid_fk', XMLDB_KEY_FOREIGN, ['userid'], 'user', ['id']);

        if (!$dbman->table_exists($table)) {
            $dbman->create_table($table);
        }

        update_capabilities('local_kid');
        \local_kid\local\role_setup::create_functional_roles();

        upgrade_plugin_savepoint(true, 2026081302, 'local', 'kid');
    }

    return true;
}
