<?php declare(strict_types = 1);

namespace MailPoet\Migrations\Db;

if (!defined('ABSPATH')) exit;


use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Migrator\DbMigration;

class Migration_20260428_120000 extends DbMigration {
  public function run(): void {
    $tableName = $this->getTableName(StatisticsUnsubscribeEntity::class);

    // Combine into a single ALTER TABLE so large `statistics_unsubscribes` tables only get one
    // metadata-lock acquisition. Column placement is left to MySQL (no AFTER clauses) so MySQL 8.0+
    // can use the INSTANT algorithm for the column adds.
    $alterations = [];
    if (!$this->columnExists($tableName, 'reason')) {
      $alterations[] = 'ADD COLUMN `reason` varchar(80) NULL DEFAULT NULL';
    }
    if (!$this->columnExists($tableName, 'reason_text')) {
      $alterations[] = 'ADD COLUMN `reason_text` text NULL DEFAULT NULL';
    }
    if (!$this->columnExists($tableName, 'reason_submitted_at')) {
      $alterations[] = 'ADD COLUMN `reason_submitted_at` timestamp NULL DEFAULT NULL';
    }
    if (!$this->indexExists($tableName, 'newsletter_id_reason')) {
      $alterations[] = 'ADD INDEX `newsletter_id_reason` (`newsletter_id`, `reason`)';
    }

    if ($alterations === []) {
      return;
    }

    $this->connection->executeStatement(
      "ALTER TABLE `{$tableName}` " . implode(', ', $alterations)
    );
  }
}
