<?php
namespace Leadlion\AutoRelated\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\AutoRelated\Block\Adminhtml\Form\Field\CategoriesColumn;
use Leadlion\AutoRelated\Block\Adminhtml\Form\Field\ProductsCatColumn;
use Leadlion\AutoRelated\Block\Adminhtml\Form\Field\PriceFilterColumn;
use Leadlion\AutoRelated\Block\Adminhtml\Form\Field\AttrComparisonColumn;

class AdvancedAutoRel extends AbstractFieldArray
{
    /**
     * @var AttrComparisonColumn
     */
    private $attrComparisonRenderer;

    /**
     * @var PriceFilterColumn
     */
    private $priceFilterRenderer;

    /**
     * @var ProductsCatColumn
     */
    private $productsCatRenderer;

    /**
     * @var CategoriesColumn
     */
    private $categoryRenderer;

    /**
     * Prepare rendering the new field by adding all the needed columns
     */
    protected function _prepareToRender()
    {
        $this->addColumn('category', [
            'label' => __('Category'),
            'renderer' => $this->getCategoryRenderer()
        ]);
        $this->addColumn('products_cat', [
            'label' => __('Products Filter'),
            'renderer' => $this->getProductsCatRenderer()
        ]);
        $this->addColumn('filters', ['label' => __('Filters')]);
        $this->addColumn('price_filter', [
            'label' => __('Price Filter'),
            'renderer' => $this->getPriceFilterRenderer()
        ]);
        $this->addColumn('comparison_value', ['label' => __('Comparison Value')]);
        $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 CategoriesColumn
     * @throws LocalizedException
     */
    private function getCategoryRenderer()
    {
        if (!$this->categoryRenderer) {
            $this->categoryRenderer = $this->getLayout()->createBlock(
                CategoriesColumn::class,
                '',
                ['data' => ['is_render_to_js_template' => true]]
            );
        }
        return $this->categoryRenderer;
    }

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

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

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