<?php

declare(strict_types=1);

/**
 * @author Amasty Team
 * @copyright Copyright (c) Amasty (https://www.amasty.com)
 * @package Lazy Load for Magento 2 (System)
 */

namespace Amasty\LazyLoad\Model\LazyScript;

use Magento\Framework\App\ObjectManager;
use Magento\Framework\View\Helper\SecureHtmlRenderer;

class Jquery implements LazyScriptInterface
{
    /**
     * @var SecureHtmlRenderer
     */
    private $secureRenderer;

    public function __construct(
        ?SecureHtmlRenderer $secureRenderer = null // TODO move to not optional
    ) {
        $this->secureRenderer = $secureRenderer ?? ObjectManager::getInstance()->get(SecureHtmlRenderer::class);
    }

    public function getName(): string
    {
        return (string)__('jQuery Lazy Script');
    }

    public function getType(): string
    {
        return 'jquery';
    }

    public function getCode(): string
    {
        $script = <<<SCRIPT
            window.amlazycallback = function () {
                window.jQuery("img[data-amsrc]").lazy({
                    "bind":"event",
                    "attribute": "data-amsrc",
                    "srcsetAttribute": "data-amsrcset",
                    "visibleOnly": true
                });
                window.jQuery("img[data-amsrcset]").lazy({
                    "bind":"event",
                    "srcsetAttribute": "data-amsrcset",
                    "visibleOnly": true
                });
                window.jQuery("source[data-amsrcset]").lazy({
                     "srcsetAttribute": "data-amsrcset",
                     "visibleOnly": true
                });
            };
            require(["jquery"], function (jquery) {
                require(["Amasty_LazyLoad/js/jquery.lazy"], function(lazy) {
                    const lazyData = [
                        {
                            selector: "img[data-amsrc]",
                            lazyData: {
                                attribute: "data-amsrc",
                                srcsetAttribute: "data-amsrcset"
                            }
                        },
                        {
                            selector: "img[data-amsrcset]",
                            lazyData: {
                                srcsetAttribute: "data-amsrcset"
                            }
                        },
                        {
                            selector: "source[data-amsrcset]",
                            lazyData: {
                                srcsetAttribute: "data-amsrcset"
                            }
                        }
                    ];

                    function addLazyEvents (additionalLazyData) {
                        const additionalData = additionalLazyData ?? {};

                        lazyData.forEach((item) => {
                            window.jQuery(item.selector).lazy(Object.assign(item.lazyData, additionalData));
                        });
                    }

                    if (document.readyState === "complete") {
                        addLazyEvents({"bind":"event", "visibleOnly": true});
                    } else {
                        addLazyEvents({"visibleOnly": true});
                    }
                })
            });
        SCRIPT;

        return $this->secureRenderer->renderTag(
            'script',
            [],
            $script,
            false
        );
    }

    public function getSupportedTags(): array
    {
        return ['img', 'source'];
    }
}
