<?php

namespace App\Doctor\Service\Repair;

use App\Doctor\Entity\Doctor;
use App\Shared\Util\PersianText;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

/**
 * نام پزشک هرگز نباید پیشوند «دکتر» داشته باشد؛ لایهٔ نمایش خودش تصمیم می‌گیرد
 * چطور نشانش دهد. نظام پزشکی نام‌ها را با عنوان می‌دهد و مسیرهای ثبت‌نام قدیمی
 * هم آن را پاک نمی‌کردند، پس «دکتر دکتر حامد حسینی» رندر می‌شد.
 */
final class StripNameTitleStep implements DoctorRepairStep
{
    public function __construct(private readonly EntityManagerInterface $em)
    {
    }

    public function name(): string
    {
        return 'names';
    }

    public function description(): string
    {
        return 'حذف پیشوند «دکتر» از نام پزشکان';
    }

    public function run(RepairOptions $options, SymfonyStyle $io): RepairResult
    {
        $qb = $this->em->getRepository(Doctor::class)->createQueryBuilder('d');
        if (!$options->allSources) {
            $qb->andWhere('d.source = :src')->setParameter('src', 'irimc');
        }
        /** @var Doctor[] $doctors */
        $doctors = $qb->getQuery()->getResult();

        $changed = 0;
        foreach ($doctors as $doctor) {
            $clean = PersianText::stripDoctorTitle((string) $doctor->getName());
            if ($clean === '' || $clean === $doctor->getName()) {
                continue;
            }

            $io->text(sprintf('  #%d «%s» → «%s»', $doctor->getId(), $doctor->getName(), $clean));
            if (!$options->dryRun) {
                $doctor->setName($clean);
            }
            $changed++;
        }

        return new RepairResult(scanned: count($doctors), changed: $changed);
    }
}
