<?php
declare(strict_types=1);

namespace Autogedal\StockSourceRouter\Block\Adminhtml\Form\Field;

use Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray;
use Magento\Framework\DataObject;

class RoutingRules extends AbstractFieldArray
{
    private ?SourceSelect $primaryRenderer = null;
    private ?SourceSelect $fallbackRenderer = null;

    protected function _prepareToRender(): void
    {
        $this->addColumn('primary_source', [
            'label'    => __('Primary Source'),
            'renderer' => $this->getPrimaryRenderer(),
        ]);
        $this->addColumn('skus', [
            'label' => __('SKUs (comma separated)'),
            'style' => 'width:320px',
        ]);
        $this->addColumn('fallback_source', [
            'label'    => __('Fallback Source (stock = 0)'),
            'renderer' => $this->getFallbackRenderer(),
        ]);

        $this->_addAfter       = false;
        $this->_addButtonLabel = __('Add Rule');
    }

    protected function _prepareArrayRow(DataObject $row): void
    {
        $options = [];

        $primary = $row->getData('primary_source');
        if ($primary) {
            $options['option_' . $this->getPrimaryRenderer()->calcOptionHash($primary)] = 'selected="selected"';
        }

        $fallback = $row->getData('fallback_source');
        if ($fallback) {
            $options['option_' . $this->getFallbackRenderer()->calcOptionHash($fallback)] = 'selected="selected"';
        }

        $row->setData('option_extra_attrs', $options);
    }

    private function getPrimaryRenderer(): SourceSelect
    {
        if (!$this->primaryRenderer) {
            $this->primaryRenderer = $this->getLayout()->createBlock(
                SourceSelect::class,
                '',
                ['data' => ['is_render_to_js_template' => true]]
            );
        }
        return $this->primaryRenderer;
    }

    private function getFallbackRenderer(): SourceSelect
    {
        if (!$this->fallbackRenderer) {
            $this->fallbackRenderer = $this->getLayout()->createBlock(
                SourceSelect::class,
                '',
                ['data' => ['is_render_to_js_template' => true]]
            );
        }
        return $this->fallbackRenderer;
    }
}
