<?php
/*
 +--------------------------------------------------------------------+
 | Copyright CiviCRM LLC. All rights reserved.                        |
 |                                                                    |
 | This work is published under the GNU AGPLv3 license with some      |
 | permitted exceptions and without any warranty. For full license    |
 | and copyright information, see https://civicrm.org/licensing       |
 +--------------------------------------------------------------------+
 */

/**
 *
 * @package CRM
 * @copyright CiviCRM LLC https://civicrm.org/licensing
 *
 */

// This file must not accessed directly.
if (!defined('ABSPATH')) {
  exit;
}

/**
 * Define CiviCRM_For_WordPress_Shortcodes_Modal Class.
 *
 * @since 4.6
 */
class CiviCRM_For_WordPress_Shortcodes_Modal {

  /**
   * @var object
   * Plugin object reference.
   * @since 4.6
   * @access public
   */
  public $civi;

  /**
   * Instance constructor.
   *
   * @since 4.6
   */
  public function __construct() {

    // Store reference to CiviCRM plugin object.
    $this->civi = civi_wp();

  }

  /**
   * Register hooks to handle the shortcode modal.
   *
   * @since 4.6
   */
  public function register_hooks() {

    // Bail if CiviCRM not installed yet.
    if (!CIVICRM_INSTALLED) {
      return;
    }

    /*
     * Adds the CiviCRM button to post and page edit screens.
     * Use priority 100 to position button to the far right.
     */
    add_action('media_buttons', [$this, 'add_form_button'], 100);

    // Add the Javascript and styles to make it all happen.
    add_action('load-post.php', [$this, 'add_core_resources']);
    add_action('load-post-new.php', [$this, 'add_core_resources']);
    add_action('load-page.php', [$this, 'add_core_resources']);
    add_action('load-page-new.php', [$this, 'add_core_resources']);

  }

  /**
   * Add button to editor for selected WordPress Post Types.
   *
   * Callback method for 'media_buttons' hook as set in register_hooks().
   *
   * @since 4.7
   */
  public function add_form_button() {

    // Add button to selected WordPress Post Types, if allowed.
    if ($this->post_type_has_button()) {

      $civilogo = file_get_contents(CIVICRM_PLUGIN_DIR . 'assets/images/civilogo.svg.b64');

      $url = admin_url('admin.php?page=CiviCRM&q=civicrm/shortcode&reset=1');
      echo '<a href= "' . $url . '" class="button crm-shortcode-button" style="padding-left: 4px;" title="' . __('Add CiviCRM Public Pages', 'civicrm') . '"><img src="' . $civilogo . '" height="15" width="15" alt="' . __('Add CiviCRM Public Pages', 'civicrm') . '" style="margin: -3px 1px 0 -2px;" />' . __('CiviCRM', 'civicrm') . '</a>';

    }

  }

  /**
   * Add core resources.
   *
   * Callback method as set in register_hooks().
   *
   * @since 4.7
   */
  public function add_core_resources() {
    if ($this->civi->initialize()) {
      Civi::resources()
        ->addCoreResources()
        ->addScriptFile('civicrm', 'js/crm.insert-shortcode.js', 0, 'html-header');
    }
  }

  /**
   * Does a WordPress post type have the CiviCRM button on it?
   *
   * @since 4.6
   *
   * @return bool $has_button True if the post type has the button, false otherwise.
   */
  public function post_type_has_button() {

    // Get screen object.
    $screen = get_current_screen();

    // Bail if no post type (e.g. Ninja Forms)
    if (!isset($screen->post_type)) {
      return;
    }

    // Get post types that support the editor.
    $capable_post_types = $this->get_post_types_with_editor();

    // Default allowed to true on all capable post types.
    $allowed = (in_array($screen->post_type, $capable_post_types)) ? TRUE : FALSE;

    /**
     * Filter the appearance of the CiviCRM button.
     *
     * @since 4.6
     *
     * @param bool $allowed True if the button is allowed, false otherwise.
     * @param object $screen The current WordPress screen object.
     */
    $allowed = apply_filters('civicrm_restrict_button_appearance', $allowed, $screen);

    return $allowed;

  }

  /**
   * Get WordPress post types that support the editor.
   *
   * @since 4.6
   *
   * @return array $supported_post_types Array of post types that have an editor.
   */
  public function get_post_types_with_editor() {

    static $supported_post_types = [];
    if (!empty($supported_post_types)) {
      return $supported_post_types;
    }

    // Get only post types with an admin UI.
    $args = [
      'public' => TRUE,
      'show_ui' => TRUE,
    ];

    // Get post types.
    $post_types = get_post_types($args);

    foreach ($post_types as $post_type) {
      // Filter only those which have an editor.
      if (post_type_supports($post_type, 'editor')) {
        $supported_post_types[] = $post_type;
      }
    }

    return $supported_post_types;
  }

}
