<?php

namespace App\ClinicInvitation\Command;

use App\ClinicInvitation\Entity\ClinicDoctorInvitation;
use App\ClinicInvitation\Repository\ClinicDoctorInvitationRepository;
use App\ClinicInvitation\Service\ClinicInvitationService;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

/**
 * دعوت‌نامه‌های پذیرفته‌شده‌ای که قبل از رفع باگ بدون پروفایل پزشک مانده‌اند را ترمیم می‌کند:
 * کاربر و پروفایل پزشک را می‌سازد و پزشک را به کلینیک متصل می‌کند.
 */
#[AsCommand(name: 'app:invitations:repair', description: 'ترمیم دعوت‌نامه‌های پذیرفته‌شده بدون پروفایل پزشک')]
class RepairAcceptedInvitationsCommand extends Command
{
    public function __construct(
        private readonly ClinicDoctorInvitationRepository $invRepo,
        private readonly ClinicInvitationService          $invitationService,
    ) {
        parent::__construct();
    }

    protected function configure(): void
    {
        $this->addOption('dry-run', null, InputOption::VALUE_NONE, 'فقط گزارش بده، چیزی را تغییر نده');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io     = new SymfonyStyle($input, $output);
        $dryRun = (bool) $input->getOption('dry-run');

        $orphans = $this->invRepo->createQueryBuilder('i')
            ->where('i.status = :status')
            ->andWhere('i.doctor IS NULL')
            ->setParameter('status', ClinicDoctorInvitation::STATUS_ACCEPTED)
            ->getQuery()
            ->getResult();

        if ($orphans === []) {
            $io->success('دعوت‌نامه‌ی ناقصی یافت نشد.');

            return Command::SUCCESS;
        }

        $io->writeln(sprintf('%d دعوت‌نامه ناقص یافت شد.', count($orphans)));

        $repaired = 0;
        foreach ($orphans as $inv) {
            $io->writeln(sprintf(
                ' - %s (%s) → کلینیک %s',
                $inv->getMobile(),
                $inv->getInvitedName() ?? '—',
                $inv->getClinic()->getName() ?? $inv->getClinic()->getUuid(),
            ));

            if ($dryRun) {
                continue;
            }

            $this->invitationService->repairAccepted($inv);
            $repaired++;
        }

        $io->success($dryRun ? 'حالت آزمایشی — چیزی تغییر نکرد.' : sprintf('%d دعوت‌نامه ترمیم شد.', $repaired));

        return Command::SUCCESS;
    }
}
