<?xml version="1.0"?>
<!--
/**
 * @author Amasty Team
 * @copyright Copyright (c) Amasty (https://www.amasty.com)
 * @package Advanced Permissions for Magento 2
 */-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool">
        <arguments>
            <argument name="modifiers" xsi:type="array">
                <item name="amasty_advanced_permissions" xsi:type="array">
                    <item name="class" xsi:type="string">Amasty\Rolepermissions\Ui\DataProvider\Product\Form\Modifier\Owner</item>
                    <item name="sortOrder" xsi:type="number">200</item>
                </item>
            </argument>
        </arguments>
    </virtualType>
    <type name="Amasty\Rolepermissions\Observer\Admin\CollectionLoadBeforeObserver">
        <arguments>
            <argument name="helper" xsi:type="object">Amasty\Rolepermissions\Helper\Data\Proxy</argument>
        </arguments>
    </type>
    <type name="Amasty\Rolepermissions\Plugin\Framework\Data\Collection\CollectionLoadBeforeObserver">
        <arguments>
            <argument name="helper" xsi:type="object">Amasty\Rolepermissions\Helper\Data\Proxy</argument>
        </arguments>
    </type>
    <type name="Magento\Catalog\Ui\Component\ColumnFactory">
        <plugin name="Amasty_Rolepermissions::Catalog_Ui_Component_ColumnFactory" type="Amasty\Rolepermissions\Plugin\Catalog\Ui\Component\ColumnFactory"/>
    </type>
    <type name="Magento\Customer\Block\Adminhtml\Edit\GenericButton">
        <plugin name="Amasty_Rolepermissions::CustomerButtons" type="Amasty\Rolepermissions\Plugin\Customer\Block\Adminhtml\Edit\GenericButton"/>
    </type>
    <type name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\General">
        <plugin name="Amasty_Rolepermissions::ProductAttributesMeta" type="Amasty\Rolepermissions\Plugin\Catalog\Ui\DataProvider\Product\Form\Modifier\General"/>
    </type>
    <type name="Magento\Catalog\Ui\Component\Listing\Columns">
        <plugin name="Amasty_Rolepermissions::ProductAttributesMeta" type="Amasty\Rolepermissions\Plugin\Catalog\Ui\Component\Listing\Columns"/>
    </type>
    <type name="Amasty\Pgrid\Ui\Component\Listing\Columns">
        <plugin name="Amasty_Rolepermissions::PgridProductAttributesRestrict" type="Amasty\Rolepermissions\Plugin\Catalog\Ui\Component\Listing\Columns" />
    </type>
    <type name="Magento\Catalog\Ui\DataProvider\Product\Form\ProductDataProvider">
        <plugin name="Amasty_Rolepermissions::ProductDataProvider" type="Amasty\Rolepermissions\Plugin\Catalog\Ui\DataProvider\Product\Form\ProductDataProvider"/>
    </type>
    <type name="Magento\CatalogRule\Block\Adminhtml\Edit\GenericButton">
        <plugin name="Amasty_Rolepermissions::CatalogRuleButtons" type="Amasty\Rolepermissions\Plugin\CatalogRule\Block\Adminhtml\Edit\GenericButton"/>
    </type>
    <type name="Magento\SalesRule\Block\Adminhtml\Promo\Quote\Edit\GenericButton">
        <plugin name="Amasty_Rolepermissions::CartRuleButtons" type="Amasty\Rolepermissions\Plugin\SalesRule\Block\Adminhtml\Promo\Quote\Edit\GenericButton"/>
    </type>
    <type name="Magento\Rule\Model\Condition\Combine">
        <plugin name="Amasty_Rolepermissions::CatalogRuleCombine" type="Amasty\Rolepermissions\Plugin\Rule\Model\Condition\Combine"/>
    </type>
    <type name="Magento\Eav\Model\Entity\AbstractEntity">
        <plugin name="Amasty_Rolepermissions::EavAbstractEntity" type="Amasty\Rolepermissions\Plugin\Eav\Model\Entity\AbstractEntity"/>
    </type>
    <type name="Magento\Framework\Data\Collection\AbstractDb">
        <plugin name="Amasty_Rolepermissions::AbstractDb" type="Amasty\Rolepermissions\Plugin\Framework\Data\Collection\AbstractDb"/>
    </type>
    <type name="Magento\CatalogInventory\Ui\DataProvider\Product\Form\Modifier\AdvancedInventory">
        <plugin name="Amasty_Rolepermissions::AdvancedInventory" type="Amasty\Rolepermissions\Plugin\CatalogInventory\Ui\DataProvider\Product\Form\Modifier\AdvancedInventory"/>
    </type>
    <!-- for fixing fatal Call to undefined method Magento\Customer\Model\Indexer\Source::addAttributeToSelect() -->
    <type name="Magento\Framework\Indexer\Handler\AttributeHandler">
        <plugin name="Amasty_Rolepermissions::CustomerAttributeValidation" type="Amasty\Rolepermissions\Plugin\Framework\Indexer\Handler\AttributeHandler"/>
    </type>
    <type name="Magento\Store\Model\Website">
        <plugin name="Amasty_Rolepernissions::DefaultStore" type="Amasty\Rolepermissions\Plugin\Store\Model\Website"/>
    </type>
    <type name="Magento\Store\Model\StoreManager">
        <plugin name="Amasty_Rolepermissions::Store_Manager" type="Amasty\Rolepermissions\Plugin\StoreManager"/>
    </type>
    <type name="Magento\Store\Model\WebsiteRepository">
        <plugin name="Amasty_Rolepermissions::WebsiteRepository" type="Amasty\Rolepermissions\Plugin\Store\Model\WebsiteRepository"/>
    </type>
    <type name="Magento\Authorization\Model\ResourceModel\Role\Collection">
        <plugin name="amastyRolepermissionsCollection" type="Amasty\Rolepermissions\Plugin\Autorization\Model\ResourceModel\Role\CollectionPlugin"/>
    </type>
    <type name="Magento\User\Model\ResourceModel\User\Collection">
        <plugin name="amastyRolepermissionsCollection" type="Amasty\Rolepermissions\Plugin\User\Model\ResourceModel\User\CollectionPlugin"/>
    </type>
    <type name="Magento\User\Controller\Adminhtml\User\Edit">
        <plugin name="amastyRolepermissionsEdit" type="Amasty\Rolepermissions\Plugin\User\Controller\Adminhtml\User\EditPlugin"/>
    </type>
    <type name="Magento\User\Model\ResourceModel\User">
        <plugin name="amastyRolepermissionsUser" type="Amasty\Rolepermissions\Plugin\User\Model\ResourceModel\UserPlugin"/>
    </type>
    <type name="Magento\Framework\App\CacheInterface">
        <plugin name="Amasty_Rolepermissions::Cache" type="Amasty\Rolepermissions\Plugin\Framework\App\Cache"/>
    </type>
    <type name="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Button\Save">
        <plugin name="Amasty_Rolepermissions::ButtonSave" type="Amasty\Rolepermissions\Plugin\ConfigurableProduct\Block\Adminhtml\Product\Edit\Button\Save"/>
    </type>
    <type name="Magento\Catalog\Block\Adminhtml\Product\Attribute">
        <plugin name="Amasty_Rolepermissions::ButtonAddAttr" type="Amasty\Rolepermissions\Plugin\Catalog\Block\Adminhtml\Product\Attribute"/>
    </type>
    <!-- compatibility with magento EE AdminGws module -->
    <type name="Magento\AdminGws\Model\Collections">
        <plugin name="Amasty_Rolepermissions::addStoreFilter" type="Amasty\Rolepermissions\Plugin\AdminGws\Model\Collections\AddFilter"/>
    </type>
    <!-- compatibility with magento B2B Magento_Company module -->
    <type name="Magento\SharedCatalog\Plugin\Company\Model\ResourceModel\Company\Grid\CollectionPlugin">
        <plugin name="Amasty_Rolepermissions::getItems" type="Amasty\Rolepermissions\Plugin\Company\Grid\Collection"/>
    </type>
    <type name="Magento\Theme\Model\Indexer\Design\Config">
        <plugin name="Amasty_Rolepermissions::reindexDesignConfig" type="Amasty\Rolepermissions\Plugin\Model\Indexer\Design\Config"/>
    </type>
    <type name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Categories">
        <plugin name="Amasty_Rolepermissions::CategoryFormModifier" type="Amasty\Rolepermissions\Plugin\Catalog\Ui\DataProvider\Product\Form\Modifier\Categories"/>
    </type>
    <type name="Magento\Customer\Model\ResourceModel\Grid\Collection">
        <plugin name="Amasty_Rolepermissions::CustomerGridFilterModifier" type="Amasty\Rolepermissions\Plugin\Customer\Model\ResourceModel\Grid\CollectionPlugin"/>
    </type>
    <type name="Magento\Cms\Ui\Component\Listing\Column\Cms\Options">
        <plugin name="Amasty_Rolepermissions::RestrictAllStores" type="Amasty\Rolepermissions\Plugin\Cms\Ui\Component\Listing\Column\Cms\Options\RestrictAllStores"/>
    </type>
    <type name="Magento\Ui\Component\Form\Element\MultiSelect">
        <plugin name="Amasty_Rolepermissions::UpdateStoreDefaultValue"
                type="Amasty\Rolepermissions\Plugin\Adminhtml\Ui\Component\Form\Element\MultiSelect\UpdateStoreDefaultValue"/>
    </type>

    <type name="Magento\Ui\Component\Filters\Type\Select">
        <plugin name="Amasty_Rolepermissions::RestrictFilterAllStores" type="Amasty\Rolepermissions\Plugin\Ui\Component\Filters\Type\Select\RestrictAllStores"/>
    </type>
    <type name="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\AttributeFilter">
        <plugin name="Amasty_Rolepermissions::ModifyUseDefaultArrayWithValuesFromRestrictAttributes" type="Amasty\Rolepermissions\Plugin\Catalog\Controller\Adminhtml\Product\Initialization\Helper\AttributeFilter\ModifyUseDefaultArrayWithValuesFromRestrictAttributes" />
    </type>
    <type name="Amasty\Rolepermissions\Plugin\Eav\Model\Entity\AbstractEntity">
        <arguments>
            <argument name="actionNamesToIgnoreRestrictAttributes" xsi:type="array">
                <item name="product_save" xsi:type="string">catalog_product_save</item>
            </argument>
        </arguments>
    </type>

    <!-- prevent changing the product type from simple to virtual if the user is denied access to the weight attribute -->
    <type name="Magento\Catalog\Model\Product\TypeTransitionManager">
        <plugin name="Amasty_Rolepermissions::PreventTypeChange" type="Amasty\Rolepermissions\Plugin\Catalog\Model\Product\TypeTransitionManager\PreventTypeChange" />
    </type>
    <type name="Magento\AdminGws\Observer\AddDataAfterRoleLoad">
        <plugin name="Amasty_Rolepermissions::SkipStoresRestriction" type="Amasty\Rolepermissions\Plugin\AdminGws\Observer\AddDataAfterRoleLoad\SkipStoresRestriction"/>
    </type>

    <type name="Amasty\Ogrid\Helper\Data">
        <plugin name="Amasty_Rolepermissions::RestrictAttributeAccess"
                type="Amasty\Rolepermissions\Plugin\Ogrid\Helper\Data\RestrictAttributeAccess" />
        <plugin name="Amasty_Rolepermissions::RestrictOrderItemFields"
                type="Amasty\Rolepermissions\Plugin\Ogrid\Helper\Data\RestrictOrderItemFields" />
    </type>
    <type name="Amasty\Ogrid\Ui\Component\Columns">
        <plugin name="Amasty_Rolepermissions::RestrictProductColumns" type="Amasty\Rolepermissions\Plugin\Ogrid\Ui\Component\Columns\RestrictProductColumns"/>
    </type>

    <type name="Amasty\Rolepermissions\Model\Validation\AccessMode\ValidatorComposite">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="scope" xsi:type="object">Amasty\Rolepermissions\Model\Validation\AccessMode\Validator\Scope</item>
            </argument>
        </arguments>
    </type>
    <type name="Magento\Store\Model\System\Store">
        <plugin name="Amasty_Rolepermissions::System_Store" type="Amasty\Rolepermissions\Plugin\System\Store" />
    </type>

    <type name="Amasty\Rolepermissions\Observer\Admin\Model\SaveBeforeObserver">
        <arguments>
            <argument name="classesToCheck" xsi:type="array">
                <item name="dotdigitalgroupReview" xsi:type="string">Dotdigitalgroup\Email\Model\Review</item>
                <item name="integrationOauthNonce" xsi:type="string">Magento\Integration\Model\Oauth\Nonce</item>
                <item name="amRequestQuoteModel" xsi:type="string">Amasty\RequestQuote\Model\Quote</item>
            </argument>
        </arguments>
    </type>

    <type name="Amasty\Rolepermissions\Observer\Admin\BlockCreateAfterObserver">
        <arguments>
            <argument name="classesToCheck" xsi:type="array">
                <item name="catalogProductAttrEdit" xsi:type="string">Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit</item>
                <item name="amRequestQuoteStoreSelect" xsi:type="string">Amasty\RequestQuote\Block\Adminhtml\Quote\Create\Store\Select</item>
            </argument>
        </arguments>
    </type>

    <type name="Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider">
        <plugin name="Amasty_Rolepermissions::RestrictNameAttribute"
                type="Amasty\Rolepermissions\Plugin\Adminhtml\Catalog\Ui\DataProvider\Product\ProductDataProvider\RestrictNameAttribute" />
    </type>

    <type name="Magento\Cms\Model\BlockRepository">
        <plugin name="Amasty_Rolepermissions::UpdateStores"
                type="Amasty\Rolepermissions\Plugin\Adminhtml\Cms\Model\BlockRepository\UpdateStoresBeforeSave" />
    </type>
    <type name="Magento\Cms\Model\PageRepository">
        <plugin name="Amasty_Rolepermissions::UpdateStores"
                type="Amasty\Rolepermissions\Plugin\Adminhtml\Cms\Model\PageRepository\UpdateStoresBeforeSave" />
    </type>
</config>
