<?php

namespace Essential_Addons_Elementor\Extensions;

use Elementor\Controls_Manager;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

class Image_Masking {

    private static $svg_dir_url = EAEL_PLUGIN_URL . 'assets/front-end/img/image-masking/svg-shapes/';

    /**
     * Strip characters that could break out of the <style> block or inject
     * new CSS rules/declarations from a user-supplied CSS fragment.
     */
    private static function sanitize_css_fragment( $value ) {
        return str_replace( [ '<', '>', '{', '}', ';' ], '', (string) $value );
    }
	/**
	 * Initialize hooks
	 */
	public function __construct() {
		add_action( 'elementor/element/column/section_advanced/after_section_end', [ $this, 'register_controls' ] );
		add_action( 'elementor/element/section/section_advanced/after_section_end', [ $this, 'register_controls' ] );
		add_action( 'elementor/element/container/section_layout/after_section_end', [ $this, 'register_controls' ] );
		add_action( 'elementor/element/common/_section_style/after_section_end', [ $this, 'register_controls' ] );
		add_action( 'elementor/frontend/before_render', [ $this, 'before_render' ], 100 );
        add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
		add_filter( 'elementor/document/element/replace_id', [ $this, 'cleanup_settings_data' ] );
		add_filter( 'elementor/document/save/data', [ $this, 'cleanup_settings_data' ] );
	}

	public function cleanup_settings_data( $element_data ) {

		$prefixes = [
			'eael_image_masking_',
			'eael_clip_',
			'eael_svg_paths_',
			'eael_image_morphing_'
		];

		$clean_settings = function ( &$settings ) use ( $prefixes ) {
			if ( empty( $settings[ 'eael_enable_image_masking' ] ) || 'yes' !== $settings[ 'eael_enable_image_masking' ] ) {
				foreach ( array_keys( $settings ) as $key ) {
					foreach ( $prefixes as $prefix ) {
						if ( strncmp( $key, $prefix, \strlen( $prefix ) ) === 0 ) {
							unset( $settings[ $key ] );
						}
					}
				}
			}

			// TODO: Remove this block after several versions once existing sites have re-saved and eael_svg_path is no longer present in the DB.
			// Strip legacy eael_svg_path key from repeater items (replaced by eael_svg_code)
			if ( ! empty( $settings['eael_svg_paths_custom'] ) && \is_array( $settings['eael_svg_paths_custom'] ) ) {
				foreach ( $settings['eael_svg_paths_custom'] as &$item ) {
					unset( $item['eael_svg_path'] );
				}
				unset( $item );
			}
		};

		$walk = function ( &$element ) use ( &$walk, $clean_settings ) {

			if ( isset( $element['settings'] ) ) {
				$clean_settings( $element['settings'] );
			}

			if ( isset( $element['page_settings'] ) ) {
				$clean_settings( $element['page_settings'] );
			}

			if ( ! empty( $element['elements'] ) ) {
				foreach ( $element['elements'] as &$child ) {
					$walk( $child );
				}
			}
		};

		$walk( $element_data );

		return $element_data;
	}

    public function enqueue_scripts() {
        $data = [ 'svg_dir_url' => self::$svg_dir_url ];
        wp_localize_script( 'elementor-frontend', 'EAELImageMaskingConfig', $data );
    }

    private function clip_paths( $shape ){
        $shapes = [
            'bavel' => 'polygon(20% 0%, 80% 0%, 100% 20%, 100% 80%, 80% 100%, 20% 100%, 0% 80%, 0% 20%)',
            'rabbet' => 'polygon(0% 15%, 15% 15%, 15% 0%, 85% 0%, 85% 15%, 100% 15%, 100% 85%, 85% 85%, 85% 100%, 15% 100%, 15% 85%, 0% 85%)',
            'chevron-left' => 'polygon(100% 0%, 75% 50%, 100% 100%, 25% 100%, 0% 50%, 25% 0%)',
            'chevron-right' => 'polygon(75% 0%, 100% 50%, 75% 100%, 0% 100%, 25% 50%, 0% 0%)',
            'star' => 'polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%)',
        ];
        return $shapes[$shape] ?? '';
    }
    private function masking_controllers( $element, $tab = '' ) {

        $condition = [];
        if( '_hover' === $tab ) {
            $element->add_control(
                'eael_image_masking_hover_effect',
                [
                    'label' => esc_html__( 'Enable', 'essential-addons-for-elementor-lite' ),
                    'type' => Controls_Manager::SWITCHER,
                    'return_value' => 'yes',
                ]
            );
            $condition = [
				'eael_image_masking_hover_effect' => 'yes',
			];
        }

        $condition['eael_image_masking_type'] = 'clip';
        $image_dir_url = EAEL_PLUGIN_URL . 'assets/front-end/img/image-masking/clip-paths/';
        $element->add_control(
            'eael_image_masking_clip_path' . $tab,
            [
                'label' => esc_html__( 'Select Clip Path', 'essential-addons-for-elementor-lite' ),
                'label_block' => true,
                'type' => Controls_Manager::CHOOSE,
                'options' => [
                    'bavel' => [
                        'title' => esc_html__( 'Bavel', 'essential-addons-for-elementor-lite' ),
                        'image' => $image_dir_url . 'bavel.svg',
                    ],
                    'rabbet' => [
                        'title' => esc_html__( 'Rabbet', 'essential-addons-for-elementor-lite' ),
                        'image' => $image_dir_url . 'rabbet.svg',
                    ],
                    'chevron-left' => [
                        'title' => esc_html__( 'Chevron Left', 'essential-addons-for-elementor-lite' ),
                        'image' => $image_dir_url . 'chevron-left.svg',
                    ],
                    'chevron-right' => [
                        'title' => esc_html__( 'Chevron Right', 'essential-addons-for-elementor-lite' ),
                        'image' => $image_dir_url . 'chevron-right.svg',
                    ],
                    'star' => [
                        'title' => esc_html__( 'Start', 'essential-addons-for-elementor-lite' ),
                        'image' => $image_dir_url . 'star.svg',
                    ],
                ],
                'default' => 'bavel',
                'toggle'       => false,
                'image_choose' => true,
                'css_class'    => 'eael-image-masking-choose',
                'condition'    => array_merge( $condition, [ 'eael_image_masking_enable_custom_clip_path' . $tab . '!' => 'yes' ] )
            ]
        );

        $element->add_control(
            'eael_image_masking_enable_custom_clip_path' . $tab,
            [
                'label'       => esc_html__( 'Use Custom Clip Path', 'essential-addons-for-elementor-lite' ),
                'type'        => Controls_Manager::SWITCHER,
                'return_value' => 'yes',
                'condition'   => $condition,
            ]
        );

        $element->add_control(
            'eael_image_masking_custom_clip_path' . $tab,
            [
                'label'       => '',
                'type'        => Controls_Manager::TEXTAREA,
                'rows'        => 10,
                'label_block' => true,
                'dynamic'     => [
					'active' => false,
				],
                'ai' => [
					'active' => false,
				],
                'default'     => 'clip-path: polygon(50% 0%, 80% 10%, 100% 35%, 100% 70%, 80% 90%, 50% 100%, 20% 90%, 0% 70%, 0% 35%, 20% 10%);',
                'placeholder' => 'clip-path: polygon(50% 0%, 0% 100%, 100% 100%);',
                'description' => __( 'Enter your custom clip path value. You can use <a href = "https://bennettfeely.com/clippy/" target = "_blank">Clippy</a> to generate your custom clip path.', 'essential-addons-for-elementor-lite' ),
                'condition'   => array_merge( $condition, [ 'eael_image_masking_enable_custom_clip_path' . $tab => 'yes' ] ),
            ]
        );

        $condition = [ 'eael_image_masking_type' => 'image' ];
        if( '_hover' === $tab ){
            $condition['eael_image_masking_hover_effect'] = 'yes';
        }

        $svg_url = EAEL_PLUGIN_URL . 'assets/front-end/img/image-masking/svg-shapes/';
        $element->add_control(
            'eael_image_masking_svg' . $tab,
            [
                'label' => esc_html__( 'Choose Shape', 'essential-addons-for-elementor-lite' ),
                'label_block' => true,
                'type' => Controls_Manager::CHOOSE,
                'options' => [
                    'polygon' => [
                        'title' => esc_html__( 'Polygon', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'polygon.svg',
                    ],
                    'rounded' => [
                        'title' => esc_html__( 'Rounded', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'rounded.svg',
                    ],
                    'arch-down' => [
                        'title' => esc_html__( 'Arch Down', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'arch-down.svg',
                    ],
                    'arch-group' => [
                        'title' => esc_html__( 'Arch Group', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'arch-group.svg',
                    ],
                    'arch-up' => [
                        'title' => esc_html__( 'Arch Up', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'arch-up.svg',
                    ],
                    'asterisk' => [
                        'title' => esc_html__( 'Asterisk', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'asterisk.svg',
                    ],
                    'blob' => [
                        'title' => esc_html__( 'Blob', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'blob.svg',
                    ],
                    'blocks' => [
                        'title' => esc_html__( 'Blocks', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'blocks.svg',
                    ],
                    'brash-1' => [
                        'title' => esc_html__( 'Brash 1', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'brash-1.svg',
                    ],
                    'brash-2' => [
                        'title' => esc_html__( 'Brash 2', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'brash-2.svg',
                    ],
                    'brash-3' => [
                        'title' => esc_html__( 'Brash 3', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'brash-3.svg',
                    ],
                    'burst' => [
                        'title' => esc_html__( 'Burst', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'burst.svg',
                    ],
                    'chat' => [
                        'title' => esc_html__( 'Chat', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'chat.svg',
                    ],
                    'hex-tile' => [
                        'title' => esc_html__( 'Hex Tile', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'hex-tile.svg',
                    ],
                    'leaf' => [
                        'title' => esc_html__( 'Leaf', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'leaf.svg',
                    ],
                    'oval' => [
                        'title' => esc_html__( 'Oval', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'oval.svg',
                    ],
                    'pixel-cross' => [
                        'title' => esc_html__( 'Pixel Cross', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'pixel-cross.svg',
                    ],
                    'quote' => [
                        'title' => esc_html__( 'Quote', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'quote.svg',
                    ],
                    'star-dimond' => [
                        'title' => esc_html__( 'Star Diamond', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'star-dimond.svg',
                    ],
                    'upload' => [
                        'title' => esc_html__( 'Upload', 'essential-addons-for-elementor-lite' ),
                        'image' => $svg_url . 'upload.svg',
                        'fullwidth' => true,
                    ],
                ],
                'toggle'       => false,
                'image_choose' => true,
                'css_class'    => 'eael-image-masking-choose col-5',
                'default'      => 'polygon',
				'condition'    => $condition
            ]
        );

        if ( !apply_filters('eael/pro_enabled', false ) ) {
            $element->add_control(
                'eael_image_masking_upload_pro_message' . $tab,
                [
                    'label' => '',
                    'type' => Controls_Manager::RAW_HTML,
                    'raw' => '<div class="ea-nerd-box">
                            <div class="ea-nerd-box-message">' . __('This feature is available in the pro version.', 'essential-addons-for-elementor-lite') . '</div>
                            <a class="ea-nerd-box-link elementor-button elementor-button-default" href="https://wpdeveloper.com/upgrade/ea-pro" target="_blank">
                            ' . __('Upgrade to EA PRO', 'essential-addons-for-elementor-lite') . '
                            </a>
                        </div>',
                    'content_classes' => 'eael-pro-notice',
                    'condition' => array_merge( $condition, [ 'eael_image_masking_svg' . $tab => 'upload' ] )   
                ]
            );
        } else {
            do_action( 'eael/image-masking/image_control', $element, array_merge( $condition, [ 'eael_image_masking_svg' . $tab => 'upload' ] ), $tab );
        }

        if( '_hover' === $tab ){
            $element->add_control(
                'eael_image_masking_hover_selector',
                [
                    'label'       => esc_html__( 'Hover Selector', 'essential-addons-for-elementor-lite' ),
                    'type'        => Controls_Manager::TEXT,
                    'label_block' => true,
                    'dynamic'     => [
                        'active' => false,
                    ],
                    'ai' => [
                        'active' => true,
                    ],
                    'placeholder' => '.not-masked-element, #not-masked-element',
                    'description' => __( 'Enter the selector for the element you want to apply the hover effect on. If you leave this field empty, the hover effect will be applied on hover for full section.', 'essential-addons-for-elementor-lite' ),
                    'condition'   => [
                        'eael_image_masking_hover_effect' => 'yes',
                    ]
                ]
            );
        }
    }

	public function register_controls( $element ) {
		$element->start_controls_section(
			'eael_image_masking_section',
			[
				'label' => __( '<i class="eaicon-logo"></i> Image Masking', 'essential-addons-for-elementor-lite' ),
				'tab'   => Controls_Manager::TAB_ADVANCED
			]
		);

		$element->add_control(
			'eael_enable_image_masking',
			[
				'label' => __( 'Enable Image Masking', 'essential-addons-for-elementor-lite' ),
				'type'  => Controls_Manager::SWITCHER
			]
		);

        $element->add_control(
            'eael_image_masking_type',
            [
                'label' => esc_html__( 'Type', 'essential-addons-for-elementor-lite' ),
                'type' => Controls_Manager::CHOOSE,
                'options' => [
                    'image' => [
                        'title' => esc_html__( 'Image/SVG Masking', 'essential-addons-for-elementor-lite' ),
                        'icon' => 'eicon-image',
                    ],
                    'clip' => [
                        'title' => esc_html__( 'Clip Path', 'essential-addons-for-elementor-lite' ),
                        'icon' => 'eicon-integration',
                    ],
                    'morphing' => [
                        'title' => esc_html__( 'Morphing', 'essential-addons-for-elementor-lite' ),
                        'icon' => 'eicon-animation',
                    ]
                ],
                'condition' => [
					'eael_enable_image_masking' => 'yes'
				],
                'default' => 'clip',
                'toggle' => false,
            ]
        );

        $element->start_controls_tabs( 'eael_image_masking_tabs', [
            'condition' => [
                'eael_enable_image_masking' => 'yes',
                'eael_image_masking_type!' => 'morphing'
            ]
        ] );
        
        $element->start_controls_tab(
            'eael_image_masking_normal_tab',
            [
                'label' => esc_html__( 'Normal', 'essential-addons-for-elementor-lite' ),
            ]
        );
        
        $this->masking_controllers( $element );
        
        $element->end_controls_tab();
        
        $element->start_controls_tab(
            'eael_image_masking_hover_tab',
            [
                'label' => esc_html__( 'Hover', 'essential-addons-for-elementor-lite' ),
            ]
        );
        
        $this->masking_controllers( $element, '_hover' );
        
        $element->end_controls_tab();
        
        $element->end_controls_tabs();

        $element->add_control(
            'eael_image_masking_image_size',
            [
                'label' => esc_html__( 'Size', 'essential-addons-for-elementor-lite' ),
                'type' => Controls_Manager::SELECT,
                'default' => 'contain',
                'options' => [
                    ''        => esc_html__( 'Default', 'essential-addons-for-elementor-lite' ),
                    'auto'    => esc_html__( 'Auto', 'essential-addons-for-elementor-lite' ),
                    'cover'   => esc_html__( 'Cover', 'essential-addons-for-elementor-lite' ),
                    'contain' => esc_html__( 'Contain', 'essential-addons-for-elementor-lite' ),
                    'custom'  => esc_html__( 'Custom', 'essential-addons-for-elementor-lite' ),
                ],
                'condition' => [
                    'eael_enable_image_masking' => 'yes',
					'eael_image_masking_type' => 'image'
				],
                'selectors' => [
                    '{{WRAPPER}} img' => 'mask-size: {{VALUE}}; -webkit-mask-size: {{VALUE}};',
                ],
            ]
        );

        $element->add_control(
            'eael_image_masking_image_custom_size_custom',
            [
                'label' => '',
                'type' => Controls_Manager::SLIDER,
                'size_units' => [ 'px', '%' ],
                'range' => [
                    'px' => [
                        'min' => 0,
                        'max' => 1000,
                        'step' => 5,
                    ],
                    '%' => [
                        'min' => 0,
                        'max' => 100,
                    ],
                ],
                'selectors' => [
                    '{{WRAPPER}} img' => 'mask-size: {{SIZE}}{{UNIT}}; -webkit-mask-size: {{SIZE}}{{UNIT}};',
                ],
                'condition' => [
                    'eael_enable_image_masking' => 'yes',
					'eael_image_masking_type' => 'image',
                    'eael_image_masking_image_size' => 'custom'
				],
            ]
        );

        $element->add_control(
            'eael_image_masking_image_position',
            [
                'label' => esc_html__( 'Position', 'essential-addons-for-elementor-lite' ),
                'type' => Controls_Manager::SELECT,
                'default' => 'center center',
                'options' => [
                    ''              => esc_html__( 'Default', 'essential-addons-for-elementor-lite' ),
                    'left top'      => esc_html__( 'Left Top', 'essential-addons-for-elementor-lite' ),
                    'left center'   => esc_html__( 'Left Center', 'essential-addons-for-elementor-lite' ),
                    'left bottom'   => esc_html__( 'Left Bottom', 'essential-addons-for-elementor-lite' ),
                    'center top'    => esc_html__( 'Center Top', 'essential-addons-for-elementor-lite' ),
                    'center center' => esc_html__( 'Center Center', 'essential-addons-for-elementor-lite' ),
                    'center bottom' => esc_html__( 'Center Bottom', 'essential-addons-for-elementor-lite' ),
                    'right top'     => esc_html__( 'Right Top', 'essential-addons-for-elementor-lite' ),
                    'right center'  => esc_html__( 'Right Center', 'essential-addons-for-elementor-lite' ),
                    'right bottom'  => esc_html__( 'Right Bottom', 'essential-addons-for-elementor-lite' )
                ],
                'condition' => [
                    'eael_enable_image_masking' => 'yes',
					'eael_image_masking_type' => 'image'
				],
                'selectors' => [
                    '{{WRAPPER}} img' => 'mask-position: {{VALUE}}; -webkit-mask-position: {{VALUE}};',
                ],
            ]
        );

        $element->add_control(
            'eael_image_masking_image_repeat',
            [
                'label' => esc_html__( 'Repeat', 'essential-addons-for-elementor-lite' ),
                'type' => Controls_Manager::SELECT,
                'default' => 'no-repeat',
                'options' => [
                    'no-repeat' => esc_html__( 'No-repeat', 'essential-addons-for-elementor-lite' ),
                    'repeat'    => esc_html__( 'Repeat', 'essential-addons-for-elementor-lite' ),
                    'repeat-x'  => esc_html__( 'Repeat-x', 'essential-addons-for-elementor-lite' ),
                    'repeat-y'  => esc_html__( 'Repeat-y', 'essential-addons-for-elementor-lite' ),
                ],
                'condition' => [
                    'eael_enable_image_masking' => 'yes',
					'eael_image_masking_type' => 'image'
				],
                'selectors' => [
                    '{{WRAPPER}} img' => 'mask-repeat: {{VALUE}}; -webkit-mask-repeat: {{VALUE}};',
                ],
            ]
        );

        if ( !apply_filters('eael/pro_enabled', false ) ) {
            $element->add_control(
                'eael_image_masking_pro_message',
                [
                    'label' => '',
                    'type' => Controls_Manager::RAW_HTML,
                    'raw' => '<div class="ea-nerd-box">
                            <div class="ea-nerd-box-message">' . __('This feature is available in the pro version.', 'essential-addons-for-elementor-lite') . '</div>
                            <a class="ea-nerd-box-link elementor-button elementor-button-default" href="https://wpdeveloper.com/upgrade/ea-pro" target="_blank">
                            ' . __('Upgrade to EA PRO', 'essential-addons-for-elementor-lite') . '
                            </a>
                        </div>',
                    'content_classes' => 'eael-pro-notice',
                    'condition' => [
                        'eael_enable_image_masking' => 'yes',
                        'eael_image_masking_type' => 'morphing'
                    ]
                ]
            );
        } else {
            do_action( 'eael/image_masking/morphing_controls', $element );
        }

		$element->end_controls_section();
	}

    private function extract_first_path_d($svg) {
        // Try DOM first
        libxml_use_internal_errors(true);
        $dom = new \DOMDocument();
        if (@$dom->loadXML($svg)) {
            $path = $dom->getElementsByTagName('path')->item(0);
            if ($path) {
                return $path->getAttribute('d');
            }
        }

        // Regex fallback
        if (preg_match('/<path[^>]+d="([^"]+)"/i', $svg, $match)) {
            return $match[1];
        }

        return null; // not found
    }
	public function before_render( $element ) {
		$is_enabled = $element->get_settings_for_display( 'eael_enable_image_masking' );
        $settings = $element->get_settings_for_display();

		if ( 'yes' === $is_enabled ) {
			$type = $settings['eael_image_masking_type'];
            $element_id = $element->get_id();
            $style = '';
            $element->add_render_attribute( '_wrapper', 'class', 'eael-image-masking-' . esc_attr( $element_id ) );
			if( 'clip' === $type ){
                $clip_path_value = '';
                if( 'yes' === $settings['eael_image_masking_enable_custom_clip_path'] ){
                    $clip_path_value = $settings['eael_image_masking_custom_clip_path'];
                    $clip_path_value = str_replace( 'clip-path: ', '', $clip_path_value );
                    $clip_path_value = self::sanitize_css_fragment( $clip_path_value );
                } else {
                    $clip_path = $settings['eael_image_masking_clip_path'];
                    $clip_path_value = $this->clip_paths( $clip_path );
                }
                if( $clip_path_value ) {
                    $style .= '.eael-image-masking-'. esc_html( $element_id ) .' img {clip-path: '.$clip_path_value.'}';
                }

                if( 'yes' === $settings['eael_image_masking_hover_effect'] ){
                    $hover_clip_path_value = '';
                    if( 'yes' === $settings['eael_image_masking_enable_custom_clip_path_hover'] ){
                        $hover_clip_path_value = $settings['eael_image_masking_custom_clip_path_hover'];
                        $hover_clip_path_value = str_replace( 'clip-path: ', '', $hover_clip_path_value );
                        $hover_clip_path_value = self::sanitize_css_fragment( $hover_clip_path_value );
                    } else {
                        $hover_clip_path = $settings['eael_image_masking_clip_path_hover'];
                        $hover_clip_path_value = $this->clip_paths( $hover_clip_path );
                    }
                    if( $hover_clip_path_value ) {
                        $hover_selector = $settings['eael_image_masking_hover_selector'];
                        if( $hover_selector ){
                            $hover_selector = ' ' . self::sanitize_css_fragment( trim( $hover_selector ) );
                        }
                        $style .= '.eael-image-masking-'. esc_html( $element_id ) . $hover_selector . ':hover img {clip-path: '.$hover_clip_path_value.'}';
                    }
                }
			} else if( 'image' === $type ) {
                $svg = $element->get_settings_for_display( 'eael_image_masking_svg' );
                $mask_url = '';
                if( 'upload' !== $svg ){
                    $svg_url = self::$svg_dir_url;
                    $mask_url = $svg_url . $svg . '.svg';
                } else if( 'upload' === $svg ){
                    $image = $element->get_settings_for_display( 'eael_image_masking_image' );
                    $mask_url = isset( $image['url'] ) ? $image['url'] : '';
                }

                if( $mask_url ) {
                    $mask_url = esc_url( $mask_url );
                    $style .= '.eael-image-masking-'. esc_html( $element_id ) .' img {mask-image: url('.$mask_url.'); -webkit-mask-image: url('.$mask_url.');}';
                }

                if( 'yes' === $settings['eael_image_masking_hover_effect'] ){
                    $hover_image = $element->get_settings_for_display( 'eael_image_masking_svg_hover' );
                    $hover_mask_url = '';
                    if( 'upload' !== $hover_image ){
                        $svg = $element->get_settings_for_display( 'eael_image_masking_svg' );
                        $svg_url = self::$svg_dir_url;
                        $hover_mask_url = $svg_url . $hover_image . '.svg';
                    } else if( 'upload' === $hover_image ){
                        $hover_image = $element->get_settings_for_display( 'eael_image_masking_image_hover' );
                        $hover_mask_url = $hover_image['url'] ?? '';
                    }
                    if( $hover_mask_url ) {
                        $hover_mask_url = esc_url( $hover_mask_url );
                        $hover_selector = $element->get_settings_for_display( 'eael_image_masking_hover_selector' );
                        if( $hover_selector ){
                            $hover_selector = ' ' . self::sanitize_css_fragment( trim( $hover_selector ) );
                        }
                        $style .= '.eael-image-masking-'. esc_html( $element_id ) . $hover_selector .':hover img {mask-image: url('.$hover_mask_url.'); -webkit-mask-image: url('.$hover_mask_url.');}';
                    }
                }

			} else if( 'morphing' === $type ) {
                $morphing_options = apply_filters( 'eael/image_masking/morphing_options', [], $element, $element_id );
                if( !empty( $morphing_options ) ){
                    if( !empty( $morphing_options['svg_html'] ) ){
                        //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
                        echo $morphing_options['svg_html'];
                    }
                    unset( $morphing_options['svg_html'] );
                    $element->add_render_attribute( '_wrapper', 'data-morphing-options', wp_json_encode( $morphing_options ) );
                    $element->add_render_attribute( '_wrapper', 'class', 'eael-morphing-enabled' );
                }
			}
            
		
            if( $style ){
                //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
                echo '<style id="eael-image-masking-'. esc_attr( $element_id ) .'">'. $style .'</style>';
            }
        }
	}
}