using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace MaBibli.Api.Data.Migrations
{
    /// <summary>
    /// Ajoute le rang manuel de la liste d'envies (du plus désiré au moins désiré).
    /// </summary>
    /// <remarks>
    /// ⚠️ La colonne seule ne suffit pas : à <c>0</c> partout, l'ordre retomberait sur l'Id,
    /// c'est-à-dire l'ordre d'ajout, et les listes existantes se réordonneraient sous les yeux
    /// de leur propriétaire sans qu'il ait rien demandé. Le remplissage ci-dessous <b>reconduit
    /// exactement l'ordre affiché jusqu'ici</b> — auteurs renseignés d'abord, puis par auteur,
    /// puis par titre — de sorte que la mise à jour ne se voie pas.
    /// <para>
    /// Le rang est <b>personnel</b>, comme toute la table : la numérotation repart de zéro pour
    /// chaque <c>Utilisateur</c>, d'où la corrélation sur cette colonne dans la sous-requête.
    /// </para>
    /// </remarks>
    public partial class RangDesEnvies : Migration
    {
        /// <inheritdoc />
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<int>(
                name: "Rang",
                table: "LivresSouhaites",
                type: "INTEGER",
                nullable: false,
                defaultValue: 0);

            // Row values (a, b) < (c, d) : SQLite les gère depuis la 3.15, et c'est ce qui
            // permet d'exprimer « combien de lignes se classaient avant celle-ci » en une
            // seule comparaison lexicographique. L'Id ferme le tri : sans lui, deux envies
            // de même auteur et même titre recevraient le même rang.
            migrationBuilder.Sql("""
                UPDATE LivresSouhaites SET Rang = (
                    SELECT COUNT(*)
                    FROM LivresSouhaites AS autre
                    WHERE autre.Utilisateur = LivresSouhaites.Utilisateur
                      AND (
                            CASE WHEN autre.AuteurNormalise = '' THEN 1 ELSE 0 END,
                            autre.AuteurNormalise,
                            autre.TitreNormalise,
                            autre.Id
                          ) < (
                            CASE WHEN LivresSouhaites.AuteurNormalise = '' THEN 1 ELSE 0 END,
                            LivresSouhaites.AuteurNormalise,
                            LivresSouhaites.TitreNormalise,
                            LivresSouhaites.Id
                          )
                );
                """);
        }

        /// <inheritdoc />
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "Rang",
                table: "LivresSouhaites");
        }
    }
}
