<?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;

/**
 * پاک‌سازی کامل همهٔ پزشکان و داده‌های وابسته — برای ساختِ یک دیتابیس تمیزِ تست.
 *
 * مخرب است: بدون --force فقط تعداد رکوردهای هر جدول را گزارش می‌دهد (dry-run).
 * روی prod نیازمند --i-know-this-is-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)
    {
        parent::__construct();
    }

    protected function configure(): void
    {
        $this->addOption('force', null, InputOption::VALUE_NONE, 'Actually delete (otherwise dry-run report)');
        $this->addOption('i-know-this-is-prod', null, InputOption::VALUE_NONE, 'Required to run against APP_ENV=prod');
    }

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

        if (($_ENV['APP_ENV'] ?? 'dev') === 'prod' && !$input->getOption('i-know-this-is-prod')) {
            $io->error('روی prod بدون --i-know-this-is-prod اجرا نمی‌شود. این عمل داده‌های واقعی (نوبت/نظر/پرداخت) را حذف می‌کند.');
            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;
    }
}
