<?php
declare(strict_types=1);

namespace Autogedal\EanTools\Model\Tool;

use Autogedal\EanTools\Model\Normalizer;
use Autogedal\EanTools\Model\ResourceModel\Ean as EanResource;

class EanAudit
{
    public function __construct(
        private readonly EanResource $eanResource,
        private readonly Normalizer $normalizer
    ) {
    }

    public function scan(): array
    {
        $issues = array_fill_keys(array_keys($this->normalizer->getStoredIssueLabels()), 0);
        $total = 0;

        $scanned = $this->eanResource->streamEanValues(
            function (string $value) use (&$issues, &$total): void {
                $issue = $this->normalizer->inspectStored($value)['issue'];
                if ($issue === '') {
                    return;
                }

                $issues[$issue] = ($issues[$issue] ?? 0) + 1;
                $total++;
            }
        );

        return [
            'scanned' => $scanned,
            'total' => $total,
            'issues' => $issues,
        ];
    }

    public function streamInvalid(callable $callback): int
    {
        $found = 0;

        $this->eanResource->streamUsedEans(
            function (array $row) use ($callback, &$found): void {
                $check = $this->normalizer->inspectStored((string)$row['value']);
                if ($check['issue'] === '') {
                    return;
                }

                $callback($row, $check);
                $found++;
            }
        );

        return $found;
    }
}
