<?php

namespace Blazemedia\Affiliation\AdminUserInterface\Buttons;

use Blazemedia\Affiliation\AdminUserInterface\Settings\Capability;
use Blazemedia\Affiliation\AdminUserInterface\Settings\PostTypes;

/*
 * Class Button
 * 
 * È una classe astratta che incapsula tutto il meccanismo di registrazione 
 * delle funzioni necessarie alla creazione del plugin tinymcs
 * e lascia da scrivere solo l'endpoint ajax_axtion() che sarà richiamato
 * dal plugin javascript
 * 
 * per creare un bottone bisogna quindi
 * 
 * 1. estendere la classe Button
 * 
 * 2. impostare nel costruttore della nuova classe il nome del plugin e il nome dell'action (l'endpoint da richiamare)
 *    lo si fa semplicemente richiamando il costruttore della classe base e passando i nomi
 * 
 * 3. nella cartellina plugins creare un nuovo file js (o duplicare uno dei file presenti) e chiamarlo
 *    con lo stesso nome di plugin appen dichiarato       
 *    al suo interno 
 *    addButton()  --> impostare il nome e l'icona 
 *    addCommand() --> puntare la action ( l'endpoint che abbiamo appena creato )
 * 
 * 4. scrivere il codice dell'endpoint (che potrebbe richiamare un template html o php per creare il form nella dialog box)
 * 
 * 5. piazzare tutti i template della dialog nella cartella plugin (non è obbligatorio ma è meglio)
 * 
 * 6. istanziare il nuovo bottone nel functions.php
 *  
 */
abstract class Button {

    protected $base_dir;
    protected $base_url;

    protected $name;
    protected $action;
    protected $dialog;
    protected $post_type;
    protected $post_id;

    protected $fields_to_inject = [];

    function __construct( $name, $action, $dialog ) { 
      
        $this->base_url = BLAZE_AFFILIATION_URI .'/src/AdminUserInterface/Buttons/';
        $this->base_dir = BLAZE_AFFILIATION_PATH .'/src/AdminUserInterface/Buttons/';

        $this->name   = $name;
        $this->action = $action;
        $this->dialog = $dialog;
        $this->post_type = $this->getPostType();
        $this->post_id = $this->getPostID();
        // the action needed to add the button
        add_action('admin_head', [ $this, 'add' ]);

        // create the endpoint called by the dialog box
        add_action("wp_ajax_$this->action", [ $this, 'ajax_action' ]);

        $this->addBaseUrlToFields();
    }



    /**
     * Aggiunge campi alla dialog, 
     * si può utilizzare per aggiungere dati alla maschera
     *
     * @return array
     */
    abstract public function addFieldsToDialog() : array;

    /**
     * This is the function called from the plugin
     * as endpoint
     */
    public function ajax_action() {

        // check for rights
        if ( !Capability::isAuthorEnabled() ) { die( __("Vietato") ); } 
        
        // get the template 
        $html = file_get_contents( "{$this->base_dir}plugins/{$this->dialog}");

        $this->fields_to_inject = array_merge( $this->fields_to_inject, $this->addFieldsToDialog() );
    
        $html = array_reduce( $this->fields_to_inject, function( $html, $field ) {
        
            return str_replace ( "{{".$field['name']."}}", $field['value'] , $html );
        }, $html );

        // print the block
        header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
        echo $html;        
        
        die();
    }

    

    function add() {

        // Check if user have permission
        if( !Capability::isAuthorEnabled() ) return;

        /// Check if the current post type is enabled
		if ( !PostTypes::isPostTypeEnabled() ) return;

        
        // Check if WYSIWYG is enabled
        if( 'true' == get_user_option( 'rich_editing' ) ) {

            // add the plugin (add a row into the plugins list)
            add_filter( 'mce_external_plugins', [ $this , 'add_plugin'     ]);

            // register the button into the first row of the toolbar
            add_filter( 'mce_buttons',          [ $this , 'register_button']);
        }
    }

    function add_plugin($plugin_array) {

        $plugin_array[ $this->name ] = $this->base_url . "plugins/$this->name.js";        
        return $plugin_array;
    }

    function register_button($buttons) {

        array_push( $buttons, $this->name );    
        return $buttons;
    }

    
    protected function addBaseUrlToFields(){

        $this->fields_to_inject = array_merge( $this->fields_to_inject, [
            [
                'name' => 'ApiLinkProvider',
                'value' => BLZ_API_LINK_PROVIDER
            ], 
            [
                'name' => 'ApiFormatProvider',
                'value' => BLZ_API_FORMAT_PROVIDER
            ],
            [
                'name' => 'base_url', 
                'value' => plugins_url('affiliation/src/AdminUserInterface/Buttons/plugins')
            ],
            [
                'name' => 'domain',
                'value' => $this->getDomain()
            ],
            [
                'name' => 'renewcache',
                'value' => date('Ymdh')
            ],
            [
                'name' => 'domain',
                'value' => get_option('domain_2')
            ],
            [
                'name' => 'post_type',
                'value' => $this->post_type
            ],
            [
                'name' => 'post_ID',
                'value' => $this->post_id
            ]
        ]);
    } 

    protected function getPostType() {
        $postType = "";
        
        if (isset($_GET['post_type'])) 
            $postType = $_GET['post_type'];
        else
            if (isset($_GET['post'])) 
                $postType = get_post_type(intval($_GET['post']));
            
        
        return $postType;
    }

    protected function getPostID() {
  
        $post = (isset($_GET['post_id'])) ? $_GET['post_id'] : 0;  
        
        return $post;
    }

    protected function getDomain() {

        return preg_replace('/^.*?\.(.*?\..*?)$/', '$1', home_url() );

    }

    
    
}