<?php

namespace Leadlion\StockUpdates\Block\Adminhtml\Form\Field;

use Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray;
use Magento\Framework\DataObject;
use Magento\Framework\Exception\LocalizedException;
use Leadlion\StockUpdates\Block\Adminhtml\Form\Field\ManufacturerRenderer;
use Leadlion\StockUpdates\Block\Adminhtml\Form\Field\ComparisonRenderer;
use Leadlion\StockUpdates\Block\Adminhtml\Form\Field\AlwaysInStock;

class DeliveryTermSmartbill extends AbstractFieldArray
{
    /**
     * @var ManufacturerRenderer
     */
    private $manufacturerRenderer;

    /**
     * @var ComparisonRenderer
     */
    private $comparisonRenderer;

    /**
     * @var AlwaysInStock
     */
    private $alwaysInStockRenderer;

    /**
     * Prepare rendering the new field by adding all the needed columns
     */
    protected function _prepareToRender()
    {
        $this->addColumn('manufacturer', [
            'label' => __('Manufacturer'),
            'renderer' => $this->getManufacturerRenderer()
        ]);
        $this->addColumn('comparison', [
            'label' => __('Comparison'),
            'renderer' => $this->getComparisonRenderer()
        ]);
        $this->addColumn('qty', ['label' => __('Qty')]);
        $this->addColumn('delivery_text', ['label' => __('Delivery Term Text')]);
        $this->addColumn('always_in_stock', [
            'label' => __('Always In Stock'),
            'renderer' => $this->getAlwaysInStockRenderer()
        ]);
        
        $this->_addAfter = false;
        $this->_addButtonLabel = __('Add');
    }

    /**
     * Prepare existing row data object
     *
     * @param DataObject $row
     * @throws LocalizedException
     */
    protected function _prepareArrayRow(DataObject $row): void
    {
        $options = [];

        $tax = $row->getTax();
        if ($tax !== null) {
            $options['option_' . $this->getCategoryRenderer()->calcOptionHash($tax)] = 'selected="selected"';
        }

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

    /**
     * @return ManufacturerRenderer
     * @throws LocalizedException
     */
    private function getManufacturerRenderer()
    {
        if (!$this->manufacturerRenderer) {
            $this->manufacturerRenderer = $this->getLayout()->createBlock(
                ManufacturerRenderer::class,
                '',
                ['data' => ['is_render_to_js_template' => true]]
            );
        }
        return $this->manufacturerRenderer;
    }

    /**
     * @return ComparisonRenderer
     * @throws LocalizedException
     */
    private function getComparisonRenderer()
    {
        if (!$this->comparisonRenderer) {
            $this->comparisonRenderer = $this->getLayout()->createBlock(
                ComparisonRenderer::class,
                '',
                ['data' => ['is_render_to_js_template' => true]]
            );
        }
        return $this->comparisonRenderer;
    }

    /**
     * @return AlwaysInStock
     * @throws LocalizedException
     */
    private function getAlwaysInStockRenderer()
    {
        if (!$this->alwaysInStockRenderer) {
            $this->alwaysInStockRenderer = $this->getLayout()->createBlock(
                AlwaysInStock::class,
                '',
                ['data' => ['is_render_to_js_template' => true]]
            );
        }
        return $this->alwaysInStockRenderer;
    }
}
