<?php

declare(strict_types=1);

namespace App\Administration\Application\Service\Import;

use App\Administration\Domain\Model\Import\ImportRow;

use function count;
use function sprintf;

/**
 * Rapport d'import généré après validation ou exécution.
 *
 * @see AC5: Rapport affiché : X élèves importés, Y erreurs ignorées
 */
final readonly class ImportReport
{
    /**
     * @param list<ImportRow> $validRows      Lignes valides importées
     * @param list<ImportRow> $errorRows      Lignes en erreur
     * @param list<string>    $createdClasses Classes créées automatiquement
     */
    public function __construct(
        public int $totalRows,
        public int $importedCount,
        public int $errorCount,
        public array $validRows,
        public array $errorRows,
        public array $createdClasses = [],
    ) {
    }

    /**
     * @param list<ImportRow> $rows           Toutes les lignes validées
     * @param list<string>    $createdClasses Classes créées automatiquement
     */
    public static function fromValidatedRows(array $rows, array $createdClasses = []): self
    {
        $valid = [];
        $errors = [];

        foreach ($rows as $row) {
            if ($row->estValide()) {
                $valid[] = $row;
            } else {
                $errors[] = $row;
            }
        }

        return new self(
            totalRows: count($rows),
            importedCount: count($valid),
            errorCount: count($errors),
            validRows: $valid,
            errorRows: $errors,
            createdClasses: $createdClasses,
        );
    }

    /**
     * Génère un résumé texte du rapport.
     *
     * @return list<string> Lignes du rapport
     */
    public function lignesRapport(): array
    {
        $lines = [];
        $lines[] = sprintf('Import terminé : %d élèves importés, %d erreurs', $this->importedCount, $this->errorCount);

        if ($this->createdClasses !== []) {
            $lines[] = sprintf('Classes créées automatiquement : %s', implode(', ', $this->createdClasses));
        }

        foreach ($this->errorRows as $row) {
            foreach ($row->errors as $error) {
                $lines[] = sprintf('Ligne %d, %s', $row->lineNumber, $error);
            }
        }

        return $lines;
    }
}
