<?php

declare(strict_types=1);

namespace DoctrineMigrations;

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

/**
 * Module Sites - Ticket 2/4 : restructuration de l'adresse.
 *
 * Splitte la colonne `site.full_address` (TEXT NOT NULL, multi-lignes) en
 * deux champs structures :
 *  - `street` (VARCHAR(255) NOT NULL) : numero + voie ;
 *  - `complement` (VARCHAR(255) DEFAULT NULL) : batiment, escalier, BP...
 *
 * L'adresse complete affichable est desormais reconstituee cote applicatif
 * par Site::getFullAddress() (concatenation multi-lignes street\n[complement\n]CP ville)
 * et exposee en lecture API via le groupe `site:read` + `me:read`. Plus de
 * colonne DB redondante.
 *
 * Strategie de backfill (entre creation des nouvelles colonnes et drop de
 * l'ancienne) :
 *  - `street` recoit la totalite de l'ancien `full_address` pour ne perdre
 *    aucune donnee. C'est imparfait pour les adresses multi-lignes mais
 *    safe : aucun risque de tronquage si l'ancienne adresse depasse 255
 *    chars (PostgreSQL leve une erreur explicite ; charge a l'admin de
 *    nettoyer manuellement si necessaire).
 *  - `complement` reste null : pas d'heuristique fiable pour decouper une
 *    adresse libre en street/complement.
 *
 * Cette migration evite un `make db-reset` force pour les developpeurs
 * ayant deja joue Version20260417120000 dans son etat initial (table site
 * avec full_address). Les fixtures sont mises a jour en parallele.
 */
final class Version20260420130000 extends AbstractMigration
{
    public function getDescription(): string
    {
        return 'Module Sites : split full_address en street + complement (getter computed cote applicatif).';
    }

    public function up(Schema $schema): void
    {
        // 1) Ajout des nouvelles colonnes en mode permissif :
        //    - `street` nullable temporairement pour permettre le backfill.
        //    - `complement` definitivement nullable.
        $this->addSql('ALTER TABLE site ADD street VARCHAR(255) DEFAULT NULL');
        $this->addSql('ALTER TABLE site ADD complement VARCHAR(255) DEFAULT NULL');

        // 2) Backfill : recopier full_address dans street pour ne pas perdre
        //    les donnees existantes. Les retours a la ligne sont preserves
        //    (PostgreSQL VARCHAR accepte \n) ; un admin pourra reformater
        //    apres coup si besoin. Cas d'adresse > 255 chars : la migration
        //    echoue cleanly (pas de tronquage silencieux).
        $this->addSql('UPDATE site SET street = full_address');

        // 3) Bascule street en NOT NULL une fois le backfill applique.
        $this->addSql('ALTER TABLE site ALTER COLUMN street SET NOT NULL');

        // 4) Drop de l'ancienne colonne full_address.
        $this->addSql('ALTER TABLE site DROP full_address');
    }

    public function down(Schema $schema): void
    {
        // Recreation de full_address (NOT NULL via DEFAULT '' pour eviter
        // un crash si la table a deja des lignes), puis backfill inverse,
        // puis drop des nouvelles colonnes.
        $this->addSql("ALTER TABLE site ADD full_address TEXT NOT NULL DEFAULT ''");
        $this->addSql("UPDATE site SET full_address = street || COALESCE(E'\\n' || complement, '')");
        $this->addSql('ALTER TABLE site ALTER COLUMN full_address DROP DEFAULT');

        $this->addSql('ALTER TABLE site DROP street');
        $this->addSql('ALTER TABLE site DROP complement');
    }
}
