<?php

declare(strict_types=1);

namespace DoctrineMigrations;

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

/**
 * کلید طبیعی ایمپورت IRIMC را در سطح دیتابیس یکتا می‌کند.
 *
 * ایندکس قبلی (source, medical_system_code) ساده بود؛ dedup فقط application-level
 * بود و دو درخواست هم‌زمان می‌توانست رکورد تکراری بسازد. MariaDB چند NULL را در
 * ایندکس یکتا مجاز می‌داند، پس پزشکان manual بدون کد تحت تأثیر نیستند.
 *
 * غیرمخرب: اگر دادهٔ تکراری وجود داشته باشد migration متوقف می‌شود (هیچ حذفی
 * انجام نمی‌دهد) — تکراری‌ها باید جداگانه و دستی تعیین تکلیف شوند.
 */
final class Version20260711150000 extends AbstractMigration
{
    public function getDescription(): string
    {
        return 'Unique index on doctors (source, medical_system_code) for concurrency-safe IRIMC import';
    }

    public function up(Schema $schema): void
    {
        $dupes = $this->connection->fetchAllAssociative(<<<'SQL'
            SELECT source, medical_system_code, COUNT(*) c FROM doctors
             WHERE medical_system_code IS NOT NULL AND medical_system_code <> ''
             GROUP BY source, medical_system_code HAVING c > 1
        SQL);
        $this->abortIf(
            $dupes !== [],
            'Duplicate (source, medical_system_code) rows exist — resolve them manually before adding the unique index: '
            . json_encode($dupes, JSON_UNESCAPED_UNICODE)
        );

        $this->addSql('DROP INDEX idx_doctors_source ON doctors');
        $this->addSql('CREATE UNIQUE INDEX uniq_doctors_source_code ON doctors (source, medical_system_code)');
    }

    public function down(Schema $schema): void
    {
        $this->addSql('DROP INDEX uniq_doctors_source_code ON doctors');
        $this->addSql('CREATE INDEX idx_doctors_source ON doctors (source, medical_system_code)');
    }
}
