<?php

declare(strict_types=1);

namespace DoctrineMigrations;

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

/**
 * Commercial — deux nouveaux types d'adresse client : Courtier et Distributeur.
 *
 * Ajoute les drapeaux `is_broker` / `is_distributor` sur `client_address`, au
 * meme titre que `is_prospect` / `is_delivery` / `is_billing`. Ce sont des types
 * AUTONOMES (comme la Prospection) : exclusifs de tout autre usage. Deux CHECK
 * Postgres miroitent l'exclusivite applicative (validateExclusiveAddressTypes),
 * en filet de securite (comme chk_client_address_prospect_exclusive).
 *
 * NB Postgres : `ADD COLUMN` ajoute en derniere position physique (pas de clause
 * AFTER) — l'ordre physique est cosmetique, on adresse par nom. Les colonnes sont
 * declarees juste apres isBilling dans l'entite (ERP-119).
 *
 * Migration au namespace racine `DoctrineMigrations` (regle ABSOLUE n°11) : le
 * tri par version garantit son passage apres l'init des tables.
 */
final class Version20260609120000 extends AbstractMigration
{
    public function getDescription(): string
    {
        return 'Commercial : types d\'adresse Courtier / Distributeur (is_broker / is_distributor) sur client_address, exclusifs (CHECK).';
    }

    public function up(Schema $schema): void
    {
        $this->addSql('ALTER TABLE client_address ADD COLUMN is_broker BOOLEAN DEFAULT FALSE NOT NULL');
        $this->addSql('ALTER TABLE client_address ADD COLUMN is_distributor BOOLEAN DEFAULT FALSE NOT NULL');

        // Exclusivite miroir (filet de securite DBAL) : un type autonome interdit
        // tout autre drapeau. Livraison + Facturation restent cumulables entre eux.
        $this->addSql(<<<'SQL'
            ALTER TABLE client_address
            ADD CONSTRAINT chk_client_address_broker_exclusive
                CHECK (NOT (is_broker = TRUE AND (is_prospect = TRUE OR is_delivery = TRUE OR is_billing = TRUE OR is_distributor = TRUE)))
            SQL);
        $this->addSql(<<<'SQL'
            ALTER TABLE client_address
            ADD CONSTRAINT chk_client_address_distributor_exclusive
                CHECK (NOT (is_distributor = TRUE AND (is_prospect = TRUE OR is_delivery = TRUE OR is_billing = TRUE OR is_broker = TRUE)))
            SQL);

        $this->comment('client_address', 'is_broker', 'Adresse Courtier — type autonome exclusif de tout autre usage (chk_client_address_broker_exclusive). Faux par defaut.');
        $this->comment('client_address', 'is_distributor', 'Adresse Distributeur — type autonome exclusif de tout autre usage (chk_client_address_distributor_exclusive). Faux par defaut.');

        // Le commentaire de table mentionnait seulement prospect/livraison/facturation :
        // on y ajoute les types autonomes Courtier / Distributeur (cf. ColumnCommentsCatalog).
        $this->addSql('COMMENT ON TABLE client_address IS $_$Adresses d un client (1:n) — types prospect / livraison / facturation (exclusivites RG-1.06/07/08) + Courtier / Distributeur autonomes (exclusifs de tout autre usage), >= 1 site rattache (RG-1.10).$_$');
    }

    public function down(Schema $schema): void
    {
        $this->addSql('COMMENT ON TABLE client_address IS $_$Adresses d un client (1:n) — prospect exclusif de livraison/facturation (RG-1.06/07/08), >= 1 site rattache (RG-1.10).$_$');
        $this->addSql('ALTER TABLE client_address DROP CONSTRAINT IF EXISTS chk_client_address_broker_exclusive');
        $this->addSql('ALTER TABLE client_address DROP CONSTRAINT IF EXISTS chk_client_address_distributor_exclusive');
        $this->addSql('ALTER TABLE client_address DROP COLUMN is_distributor');
        $this->addSql('ALTER TABLE client_address DROP COLUMN is_broker');
    }

    /**
     * Emet un `COMMENT ON COLUMN` en dollar-quoting Postgres ($_$...$_$) pour
     * eviter tout echappement.
     */
    private function comment(string $table, string $column, string $description): void
    {
        $this->addSql(sprintf(
            'COMMENT ON COLUMN %s.%s IS $_$%s$_$',
            '"'.str_replace('"', '""', $table).'"',
            '"'.str_replace('"', '""', $column).'"',
            $description,
        ));
    }
}
