<?php
declare(strict_types=1);

namespace Autogedal\Manufacturers\Setup\Patch\Data;

use Autogedal\Manufacturers\Model\Config;
use Autogedal\Manufacturers\Model\Config\Source\Manufacturers;
use Magento\Framework\App\Config\ReinitableConfigInterface;
use Magento\Framework\App\Config\Storage\WriterInterface;
use Magento\Framework\File\Csv;
use Magento\Framework\Module\Dir\Reader as ModuleReader;
use Magento\Framework\Setup\Patch\DataPatchInterface;

class SeedInactiveManufacturers implements DataPatchInterface
{
    public function __construct(
        private readonly ModuleReader $moduleReader,
        private readonly Csv $csvReader,
        private readonly Manufacturers $manufacturers,
        private readonly WriterInterface $configWriter,
        private readonly ReinitableConfigInterface $reinitableConfig
    ) {
    }

    public function apply(): self
    {
        $moduleDir = $this->moduleReader->getModuleDir('', 'Autogedal_Manufacturers');
        $rows = $this->csvReader->getData($moduleDir . '/fixtures/inactive_manufacturers.csv');
        $inactiveNames = array_map($this->normalizeName(...), array_column($rows, 0));

        $inactiveIds = [];
        foreach ($this->manufacturers->toOptionArray() as $option) {
            if (in_array($this->normalizeName((string)$option['label']), $inactiveNames, true)) {
                $inactiveIds[] = (int)$option['value'];
            }
        }

        sort($inactiveIds);
        $this->configWriter->save(Config::XML_PATH_INACTIVE_MANUFACTURERS, implode(',', $inactiveIds));
        $this->reinitableConfig->reinit();

        return $this;
    }

    public static function getDependencies(): array
    {
        return [];
    }

    public function getAliases(): array
    {
        return [];
    }

    private function normalizeName(?string $name): string
    {
        return mb_strtolower(preg_replace('/\s+/', '', (string)$name) ?? '');
    }
}
