<?php

declare(strict_types=1);

namespace App\Administration\Application\Service\Import;

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

use function mb_strtolower;
use function trim;

/**
 * Détecte les doublons parmi les lignes d'import enseignants :
 * - contre les enseignants existants en base (par email)
 * - au sein du fichier lui-même (lignes avec le même email).
 */
final readonly class TeacherDuplicateDetector
{
    /**
     * @param list<ImportRow>                                                 $rows
     * @param list<array{firstName: string, lastName: string, email: string}> $existingTeachers
     *
     * @return list<ImportRow>
     */
    public function detecter(array $rows, array $existingTeachers): array
    {
        /** @var array<string, true> $byEmail */
        $byEmail = [];

        foreach ($existingTeachers as $teacher) {
            if (trim($teacher['email']) !== '') {
                $byEmail[mb_strtolower(trim($teacher['email']))] = true;
            }
        }

        $result = [];

        foreach ($rows as $row) {
            $email = $row->mappedData[TeacherImportField::EMAIL->value] ?? null;

            if ($email !== null && trim($email) !== '') {
                $normalized = mb_strtolower(trim($email));

                if (isset($byEmail[$normalized])) {
                    $row = $row->avecErreurs(new ImportRowError(
                        '_duplicate',
                        'Cet enseignant existe déjà (correspondance : email).',
                    ));
                } else {
                    $byEmail[$normalized] = true;
                }
            }

            $result[] = $row;
        }

        return $result;
    }
}
