<?php

namespace App\Billing\Command;

use App\Billing\Repository\InvoiceRepository;
use App\Billing\Service\ClaimService;
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;

/**
 * صورتحساب‌های نهایی‌شده‌ی بیمه‌داری که مطالبه‌شان ساخته نشده را جبران می‌کند.
 *
 * تا پیش از رویداد InvoiceFinalized، مطالبه فقط در مسیر «ثبت مراجعه» ساخته می‌شد؛
 * صورتحسابی که از صفحه‌ی صورتحساب یا با ویرایش بعدی نهایی شده بود بدون مطالبه می‌ماند
 * و در داشبورد مطالبات اصلاً دیده نمی‌شد.
 *
 *   ddev exec php bin/console app:billing:backfill-claims --dry-run
 */
#[AsCommand(
    name: 'app:billing:backfill-claims',
    description: 'Create the missing claims of already finalized, insured invoices',
)]
class BackfillMissingClaimsCommand extends Command
{
    public function __construct(
        private readonly InvoiceRepository $invoiceRepo,
        private readonly ClaimService      $claimService,
    ) {
        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');

        $invoices = $this->invoiceRepo->findFinalizedInsuredWithoutClaims();
        if ($invoices === []) {
            $io->success('همه‌ی صورتحساب‌های بیمه‌دار مطالبه دارند.');
            return Command::SUCCESS;
        }

        $rows    = [];
        $created = 0;
        foreach ($invoices as $invoice) {
            $claims = $dryRun ? [] : $this->claimService->syncFromInvoice($invoice);
            $created += count($claims);

            $rows[] = [
                $invoice->getUuid(),
                $invoice->getEntityType() . '#' . $invoice->getEntityId(),
                number_format($invoice->getTotalRials()),
                number_format($invoice->getTotalRials() - $invoice->getPatientRials()),
                $dryRun ? '—' : count($claims),
            ];
        }

        $io->table(['صورتحساب', 'محیط', 'کل', 'سهم بیمه', 'مطالبهٔ ساخته‌شده'], $rows);
        $io->success($dryRun
            ? sprintf('%d صورتحساب بدون مطالبه پیدا شد (dry-run).', count($invoices))
            : sprintf('%d مطالبه برای %d صورتحساب ساخته شد.', $created, count($invoices)));

        return Command::SUCCESS;
    }
}
