<?php

namespace App\Doctor\Command;

use Doctrine\DBAL\Connection;
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;
use Symfony\Component\DependencyInjection\Attribute\Autowire;

/**
 * پاک‌سازی کامل همهٔ پزشکان و داده‌های وابسته — برای ساختِ یک دیتابیس تمیزِ تست.
 *
 * مخرب است: بدون --force فقط تعداد رکوردهای هر جدول را گزارش می‌دهد (dry-run).
 * فقط در dev/test اجرا می‌شود و برای prod هیچ راه فراری ندارد — برخلاف
 * app:doctors:purge-unclaimed که با --i-know-this-is-prod روی prod هم اجرا می‌شود.
 *
 *   php bin/console app:doctors:purge            # فقط گزارش
 *   php bin/console app:doctors:purge --force     # پاک‌سازی
 */
#[AsCommand(
    name: 'app:doctors:purge',
    description: 'Delete ALL doctors and doctor-related data for a clean test DB (dry-run by default; --force to apply)',
)]
class PurgeDoctorsCommand extends Command
{
    /** ترتیب: فرزندان اول، سپس doctors. FK_CHECKS خاموش می‌شود پس ترتیب فقط برای خوانایی است. */
    private const TABLES = [
        'doctor_claim_requests', 'doctor_secretaries', 'doctor_addresses', 'doctor_insurances',
        'doctor_provinces', 'doctor_cities', 'doctor_specialties', 'doctor_expertise',
        'clinic_doctors', 'clinic_doctor_invitations', 'weekly_schedules', 'date_overrides',
        'holidays', 'comments', 'rates', 'appointments', 'doctors',
    ];

    public function __construct(
        private readonly Connection $conn,
        #[Autowire('%kernel.environment%')]
        private readonly string $env,
    ) {
        parent::__construct();
    }

    protected function configure(): void
    {
        $this->addOption('force', null, InputOption::VALUE_NONE, 'Actually delete (otherwise dry-run report)');
    }

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

        // فقط و فقط dev/test. این کامند همهٔ پزشکان + نوبت/نظر/پرداخت را پاک می‌کند و
        // هیچ راه فراری برای prod ندارد. محیط از kernel می‌آید (نه $_ENV) تا اگر APP_ENV
        // از راهی غیر از dotenv ست شده باشد، به اشتباه به dev fallback نشود.
        if (!in_array($this->env, ['dev', 'test'], true)) {
            $io->error(sprintf('این کامند فقط در محیط dev اجرا می‌شود (APP_ENV فعلی: %s).', $this->env));
            return Command::FAILURE;
        }

        $io->section($force ? 'پاک‌سازی پزشکان و داده‌های وابسته' : 'گزارش (dry-run — چیزی حذف نمی‌شود)');

        $rows = [];
        foreach (self::TABLES as $t) {
            $rows[] = [$t, (int) $this->conn->fetchOne("SELECT COUNT(*) FROM {$t}")];
        }
        $io->table(['جدول', 'رکورد'], $rows);

        if (!$force) {
            $io->warning('برای حذف واقعی، دوباره با --force اجرا کن.');
            return Command::SUCCESS;
        }

        $this->conn->executeStatement('SET FOREIGN_KEY_CHECKS=0');
        try {
            foreach (self::TABLES as $t) {
                $n = $this->conn->executeStatement("DELETE FROM {$t}");
                $io->text(sprintf('%s: %d حذف شد', $t, $n));
            }
            // کاربران جانشینِ ایمپورت (imp_..., غیرفعال) که اکنون یتیم‌اند
            $surrogates = $this->conn->executeStatement(
                "DELETE FROM users WHERE mobile_number LIKE 'imp\\_%' AND status = 0"
            );
            $io->text(sprintf('کاربران جانشین: %d حذف شد', $surrogates));
        } finally {
            $this->conn->executeStatement('SET FOREIGN_KEY_CHECKS=1');
        }

        $io->success('دیتابیس پزشکان پاک شد.');

        return Command::SUCCESS;
    }
}
