<?php

namespace App\Doctor\Service\Repair;

use App\Auth\Entity\User;
use App\Doctor\Entity\Doctor;
use App\Doctor\Service\DoctorImportService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

/**
 * کاربران جانشینِ ایمپورت (موبایل با پیشوند imp_، غیرفعال، متصل به پزشک unclaimed)
 * که پیش از افزودن نقش marker ساخته شده‌اند، ROLE_UNCLAIMED_DOCTOR می‌گیرند.
 * بدون این نقش، جریان «تصاحب پروفایل» آن‌ها را نمی‌شناسد.
 */
final class BackfillSurrogateRoleStep implements DoctorRepairStep
{
    public function __construct(private readonly EntityManagerInterface $em)
    {
    }

    public function name(): string
    {
        return 'surrogate-role';
    }

    public function description(): string
    {
        return 'افزودن ROLE_UNCLAIMED_DOCTOR به کاربران جانشین ایمپورت';
    }

    public function run(RepairOptions $options, SymfonyStyle $io): RepairResult
    {
        /** @var User[] $surrogates */
        $surrogates = $this->em->createQueryBuilder()
            ->select('u')
            ->from(User::class, 'u')
            ->join(Doctor::class, 'd', 'WITH', 'd.user = u')
            ->where("u.mobileNumber LIKE 'imp\\_%'")
            ->andWhere('u.status = 0')
            ->andWhere("d.ownerStatus = 'unclaimed'")
            ->getQuery()
            ->getResult();

        $changed = 0;
        foreach ($surrogates as $user) {
            if ($user->hasRole(DoctorImportService::ROLE_UNCLAIMED_DOCTOR)) {
                continue;
            }

            $io->text(sprintf('  %s', $user->getMobileNumber()));
            if (!$options->dryRun) {
                $user->addRole(DoctorImportService::ROLE_UNCLAIMED_DOCTOR);
            }
            $changed++;
        }

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