<?php

/**
 * @author          Tassos Marinos <info@tassos.gr>
 * @link            https://www.tassos.gr
 * @copyright       Copyright © 2024 Tassos All Rights Reserved
 * @license         GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
*/

// No direct access to this file
defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\EditorField;
use Joomla\CMS\Form\Field\TextareaField;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Factory;

class JFormFieldTFEditor extends TextareaField
{
    public function getInput()
    {
        $this->class .= ' tf-editor';
        
        $this->loadAssets();

        return '<div class="tf-editor-wrapper"' . $this->getWrapperAttributes() . '>' . parent::getInput() . '</div>';
    }
    
    private function loadAssets()
    {
		$doc = Factory::getDocument();

        // Get the global editor
        $globalEditor = Factory::getConfig()->get('editor');
        
        // Get the user editor
        $userEditor = Factory::getUser()->getParam('editor');

        $editor = $userEditor ? $userEditor : $globalEditor;
        $option = Factory::getApplication()->input->get('option', '');
        $layout = Factory::getApplication()->input->get('layout', '');

        if (!in_array($option, ['com_content', 'com_contact', 'com_categories']) || $layout !== 'edit' || $editor !== 'jce')
        {
            $wa = $doc->getWebAssetManager();

            if (!$wa->assetExists('script', 'tinymce'))
            {
                $wa->registerScript('tinymce', 'media/vendor/tinymce/tinymce.min.js', [], ['defer' => true]);
            }

            if (!$wa->assetExists('script', 'plg_editors_tinymce'))
            {
                $wa->registerScript('plg_editors_tinymce', 'plg_editors_tinymce/tinymce.min.js', [], ['type' => 'module', 'defer' => true], ['core', 'tinymce']);
            }

            $wa->useScript('tinymce')->useScript('plg_editors_tinymce');
        }

        HTMLHelper::stylesheet('plg_system_nrframework/controls/editor.css', ['relative' => true, 'version' => 'auto']);
        HTMLHelper::script('plg_system_nrframework/controls/editor.js', ['relative' => true, 'version' => 'auto']);
    }

    private function getWrapperAttributes()
    {
        $plugins = isset($this->element['plugins']) ? array_filter(array_map('trim', explode(',', (string) $this->element['plugins']))) : false;
        $toolbar = isset($this->element['toolbar']) ? array_filter(array_map('trim', explode(',', (string) $this->element['toolbar']))) : false;

        $atts = [];
        
        if ($plugins)
        {
            $atts[] = 'data-plugins="' . htmlspecialchars(json_encode($plugins), ENT_COMPAT, 'UTF-8') . '"';
        }

        if ($toolbar)
        {
            $atts[] = 'data-toolbar="' . htmlspecialchars(json_encode($toolbar), ENT_COMPAT, 'UTF-8') . '"';
        }

        return implode(' ', $atts);
    }
}