<?php
/**
 * ReduxFrameworkPlugin main class
 *
 * @package     ReduxFramework\ReduxFrameworkPlugin
 * @since       3.0.0
 */


// Exit if accessed directly
if( !defined( 'ABSPATH' ) ) {
    exit;
}


if( !class_exists( 'ReduxFrameworkPlugin' ) ) {

    /**
     * Main ReduxFrameworkPlugin class
     *
     * @since       3.0.0
     */
    class ReduxFrameworkPlugin {

        /**
         * @const       string VERSION The plugin version, used for cache-busting and script file references
         * @since       3.0.0
         */
        const VERSION = '3.0.0';

        /**
         * @access      protected
         * @var         array $options Array of config options, used to check for demo mode
         * @since       3.0.0
         */
        protected $options = array();

        /**
         * Use this value as the text domain when translating strings from this plugin. It should match
         * the Text Domain field set in the plugin header, as well as the directory name of the plugin.
         * Additionally, text domains should only contain letters, number and hypens, not underscores
         * or spaces.
         *
         * @access      protected
         * @var         string $plugin_slug The unique ID (slug) of this plugin
         * @since       3.0.0
         */
        protected $plugin_slug = 'redux-framework';

        /**
         * @access      protected
         * @var         string $plugin_screen_hook_suffix The slug of the plugin screen
         * @since       3.0.0
         */
        protected $plugin_screen_hook_suffix = null;

        /**
         * @access      protected
         * @var         string $plugin_network_activated Check for plugin network activation
         * @since       3.0.0
         */
        protected $plugin_network_activated = null;

        /**
         * @access      private
         * @var         \ReduxFrameworkPlugin $instance The one true ReduxFrameworkPlugin
         * @since       3.0.0
         */
        private static $instance;

        /**
         * Get active instance
         *
         * @access      public
         * @since       3.1.3
         * @return      self::$instance The one true ReduxFrameworkPlugin
         */
        public static function instance() {
            if( !self::$instance ) {
                self::$instance = new self;
                self::$instance->get_redux_options();
                self::$instance->includes();
                self::$instance->hooks();
            }

            return self::$instance;
        }


        /**
         * Get Redux options
         *
         * @access      public
         * @since       3.1.3
         * @return      void
         */
        public function get_redux_options() {

            // Setup defaults
            $defaults = array(
                'demo'      => false,
            );

            // If multisite is enabled
            if( is_multisite() ) {

                // Get network activated plugins
                $plugins = get_site_option( 'active_sitewide_plugins' );

                foreach( $plugins as $file => $plugin ) {
                    if( strpos( $file, 'redux-framework.php' ) !== false ) {
                        $this->plugin_network_activated = true;
                        $this->options = get_site_option( 'ReduxFrameworkPlugin', $defaults );
                    }
                }
            }

            // If options aren't set, grab them now!
            if( empty( $this->options ) ) {
                $this->options = get_option( 'ReduxFrameworkPlugin', $defaults );
            }
        }


        /**
         * Include necessary files
         *
         * @access      public
         * @since       3.1.3
         * @return      void
         */
        public function includes() {
            // Include ReduxCore
            if( file_exists( dirname( __FILE__ ) . '/ReduxCore/framework.php' ) ) {
                require_once( dirname( __FILE__ ) . '/ReduxCore/framework.php' );
            }

            // Include demo config, if demo mode is active
            if( $this->options['demo'] && file_exists( dirname( __FILE__ ) . '/sample/sample-config.php' ) ) {
                require_once( dirname( __FILE__ ) . '/sample/sample-config.php' );
            }
        }


        /**
         * Run action and filter hooks
         *
         * @access      private
         * @since       3.1.3
         * @return      void
         */
        private function hooks() {
            add_action( 'wp_loaded', array( $this, 'options_toggle_check' ) );

            // Activate plugin when new blog is added
            add_action( 'wpmu_new_blog', array( $this, 'activate_new_site' ) );

            // Display admin notices
            add_action( 'admin_notices', array( $this, 'admin_notices' ) );

            // Edit plugin metalinks
            add_filter( 'plugin_row_meta', array( $this, 'plugin_metalinks' ), null, 2 );

            do_action( 'redux/plugin/hooks', $this );

        }


        /**
         * Fired on plugin activation
         *
         * @access      public
         * @since       3.0.0
         * @param       boolean $network_wide True if plugin is network activated, false otherwise
         * @return      void
         */
        public static function activate( $network_wide ) {
            if( function_exists( 'is_multisite' ) && is_multisite() ) {
                if( $network_wide ) {
                    // Get all blog IDs
                    $blog_ids = self::get_blog_ids();

                    foreach( $blog_ids as $blog_id ) {
                        switch_to_blog( $blog_id );
                        self::single_activate();
                    }
                    restore_current_blog();
                } else {
                    self::single_activate();
                }
            } else {
                self::single_activate();
            }

            delete_site_transient( 'update_plugins' );
        }


        /**
         * Fired when plugin is deactivated
         *
         * @access      public
         * @since       3.0.0
         * @param       boolean $network_wide True if plugin is network activated, false otherwise
         * @return      void
         */
        public static function deactivate( $network_wide ) {
            if( function_exists( 'is_multisite' ) && is_multisite() ) {
                if( $network_wide ) {
                    // Get all blog IDs
                    $blog_ids = self::get_blog_ids();

                    foreach( $blog_ids as $blog_id ) {
                        switch_to_blog( $blog_id );
                        self::single_deactivate();
                    }
                    restore_current_blog();
                } else {
                    self::single_deactivate();
                }
            } else {
                self::single_deactivate();
            }

            delete_option( 'ReduxFrameworkPlugin' );
        }


        /**
         * Fired when a new WPMU site is activated
         *
         * @access      public
         * @since       3.0.0
         * @param       int $blog_id The ID of the new blog
         * @return      void
         */
        public function activate_new_site( $blog_id ) {
            if( 1 !== did_action( 'wpmu_new_blog' ) ) {
                return;
            }

            switch_to_blog( $blog_id );
            self::single_activate();
            restore_current_blog();
        }


        /**
         * Get all IDs of blogs that are not activated, not spam, and not deleted
         *
         * @access      private
         * @since       3.0.0
         * @global      object $wpdb
         * @return      array|false Array of IDs or false if none are found
         */
        private static function get_blog_ids() {
            global $wpdb;

            // Get an array of IDs
            $sql = "SELECT blog_id FROM $wpdb->blogs
                    WHERE archived = '0' AND spam = '0'
                    AND deleted = '0'";

            return $wpdb->get_col( $sql );
        }


        /**
         * Fired for each WPMS blog on plugin activation
         *
         * @access      private
         * @since       3.0.0
         * @return      void
         */
        private static function single_activate() {
            $notices = get_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES', array() );
            $notices[] = __( 'Redux Framework has an embedded demo.', 'redux-framework' ) . ' <a href="./plugins.php?ReduxFrameworkPlugin=demo">' . __( 'Click here to activate the sample config file.', 'redux-framework' ) . '</a>';

            update_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES', $notices );
        }


        /**
         * Display admin notices
         *
         * @access      public
         * @since       3.0.0
         * @return      void
         */
        public function admin_notices() {
            do_action( 'ReduxFrameworkPlugin_admin_notice' );

            if( $notices = get_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES' ) ) {
                foreach( $notices as $notice ) {
                    echo '<div class="updated"><p>' . $notice . '</p></div>';
                }

                delete_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES' );
            }
        }


        /**
         * Fired for each blog when the plugin is deactivated
         *
         * @access      private
         * @since       3.0.0
         * @return      void
         */
        private static function single_deactivate() {
            delete_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES' );
        }


        /**
         * Turn on or off
         *
         * @access      public
         * @since       3.0.0
         * @global      string $pagenow The current page being displayed
         * @return      void
         */
        public function options_toggle_check() {
            global $pagenow;

            if( $pagenow == 'plugins.php' && is_admin() && !empty( $_GET['ReduxFrameworkPlugin'] ) ) {
                $url = './plugins.php';

                if( $_GET['ReduxFrameworkPlugin'] == 'demo' ) {
                    if( $this->options['demo'] == false ) {
                        $this->options['demo'] = true;
                    } else {
                        $this->options['demo'] = false;
                    }
                }

                if( is_multisite() && is_network_admin() && $this->plugin_network_activated ) {
                    update_site_option( 'ReduxFrameworkPlugin', $this->options );
                } else {
                    update_option( 'ReduxFrameworkPlugin', $this->options );
                }

                wp_redirect( $url );
            }
        }


        /**
         * Add settings action link to plugins page
         *
         * @access      public
         * @since       3.0.0
         * @return      void
         */
        public function add_action_links( $links ) {
            // In case we ever want to do this...
            return $links;

            /**
             * return array_merge( 
             *      array( 'redux_plugin_settings' => '<a href="' . admin_url( 'plugins.php?page=' . 'redux_plugin_settings' ) . '">' . __( 'Settings', 'redux-framework' ) . '</a>' ), 
             *      $links
             * );
             */
        }


        /**
         * Edit plugin metalinks
         *
         * @access      public
         * @since       3.0.0
         * @param       array $links The current array of links
         * @param       string $file A specific plugin row
         * @return      array The modified array of links
         */
        public function plugin_metalinks( $links, $file ) {
            if( strpos($file,'redux-framework.php') !== false ) {

                $new_links = array(
                    '<a href="https://github.com/ReduxFramework/ReduxFramework" target="_blank">' . __( 'Github Repo', 'redux-framework' ) . '</a>',
                    '<a href="https://github.com/ReduxFramework/ReduxFramework/issues/" target="_blank">' . __( 'Issue Tracker', 'redux-framework' ) . '</a>'
                );

                if( ( is_multisite() && $this->plugin_network_activated ) || !is_network_admin() || !is_multisite() ) {
                    if( $this->options['demo'] ) {
                        $new_links[1] .= '<br /><span style="display: block; padding-top: 6px;"><a href="./plugins.php?ReduxFrameworkPlugin=demo" style="color: #bc0b0b;">' . __( 'Deactivate Demo Mode', 'redux-framework' ) . '</a></span>';
                    } else {
                        $new_links[1] .= '<br /><span style="display: block; padding-top: 6px;"><a href="./plugins.php?ReduxFrameworkPlugin=demo" style="color: #bc0b0b;">' . __( 'Activate Demo Mode', 'redux-framework' ) . '</a></span>';
                    }
                }

                $links = array_merge( $links, $new_links );
            }

            return $links;
        }
    }
}
