<?php

declare(strict_types=1);

namespace App\Services\Reports;

use App\Models\ReportJob;
use App\Services\Reports\Formatters\CsvFormatter;
use App\Services\Reports\Formatters\JsonFormatter;
use App\Services\Reports\Formatters\PdfStubFormatter;
use App\Services\Reports\Formatters\ReportFormatter;
use App\Services\Reports\Formatters\XlsxFormatter;
use App\Services\Reports\Providers\DealsExportProvider;
use App\Services\Reports\Providers\ReportDataProvider;
use InvalidArgumentException;

/**
 * Резолвит ReportDataProvider по `type` и ReportFormatter по `format`.
 *
 * Этап 2 (текущий): 1 provider × 4 formatter = 4 комбинации
 *   (deals_export × csv|xlsx|json|pdf-stub).
 *
 * Этап 2b расширит до 4 × 4 = 16 (managers_summary, sources_summary,
 * billing_summary). Для PDF на MVP — stub, fallback'ит в RuntimeException.
 */
class ReportGeneratorRegistry
{
    public function __construct(
        private readonly DealsExportProvider $dealsExport,
        private readonly CsvFormatter $csv,
        private readonly XlsxFormatter $xlsx,
        private readonly JsonFormatter $json,
        private readonly PdfStubFormatter $pdf,
    ) {}

    public function provider(string $type): ReportDataProvider
    {
        return match ($type) {
            'deals_export' => $this->dealsExport,
            default => throw new InvalidArgumentException("Тип отчёта не реализован: {$type}"),
        };
    }

    public function formatter(string $format): ReportFormatter
    {
        return match ($format) {
            'csv' => $this->csv,
            'xlsx' => $this->xlsx,
            'json' => $this->json,
            'pdf' => $this->pdf,
            default => throw new InvalidArgumentException("Формат не поддерживается: {$format}"),
        };
    }

    public function isSupported(string $type, string $format): bool
    {
        if (! in_array($type, ReportJob::TYPES, true) || ! in_array($format, ReportJob::FORMATS, true)) {
            return false;
        }

        // Этап 2: только deals_export (этап 2b добавит остальные).
        $supportedTypes = ['deals_export'];
        if (! in_array($type, $supportedTypes, true)) {
            return false;
        }

        // PDF — stub: validates, но генерация даёт failed-job (intended).
        // Считаем «поддерживается» — пусть GenerateReportJob сам catch'ит RuntimeException.
        return true;
    }
}
