<?php
namespace ShortPixel;
use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;

if ( ! defined( 'ABSPATH' ) ) {
 exit; // Exit if accessed directly.
}
/**
 * User: simon
 * Date: 11.04.2018
 */
// @todo This is used by feedback. Should be replaced a some point.
class ShortPixelPluginRequest {

    /**
     * Url for the request
     *
     * @var string
     */
    private $url;
    /**
     * Api endpoint
     *
     * @var string
     */
    private $data = array(
        'server' => array(),
        'user' => array(),
        'wordpress' => array(
            'deactivated_plugin' => array(),
        ),
    );
    /**
     * Plugin file
     *
     * @var string
     */
    private $plugin_file = '';

    private $allow_tracking = 0;

    public $request_successful = false;

    function __construct( $_plugin_file, $url, $args ) {

        $this->url = $url;
        // Set variables
        $this->allow_tracking = ($args['anonymous'] === false)? true : false;
        $this->plugin_file = $_plugin_file;
        $this->data['unique'] = md5( home_url() . get_bloginfo( 'admin_email' ) );
				if ($args['anonymous'] == false)
        	$this->data['key'] = $args['key'];
        $this->data['wordpress']['deactivated_plugin']['uninstall_reason'] = $args['reason'];
        $this->data['wordpress']['deactivated_plugin']['uninstall_details'] = $args['details'];

        // Start collecting data
        $this->_collect_data();
        $this->request_successful = $this->_send_request();
    }

    /**
     * Collect all data for the request.
     *
     */
    private function _collect_data() {

        $current_plugin = get_plugin_data( $this->plugin_file );

        // Plugin data
        $this->data['wordpress']['deactivated_plugin']['slug'] = $current_plugin['TextDomain'];
        $this->data['wordpress']['deactivated_plugin']['name'] = $current_plugin['Name'];
        $this->data['wordpress']['deactivated_plugin']['version'] = $current_plugin['Version'];
        $this->data['wordpress']['deactivated_plugin']['author'] = $current_plugin['AuthorName'];

        if ( $this->allow_tracking ) {
            //$this->_collect_wordpress_data();
            //$this->_collect_server_data();
            $this->_collect_user_data();
        }

    }

    /**
     * Collect WordPress data.
     *
     */
    private function _collect_wordpress_data() {
        $this->data['wordpress']['locale'] = ( get_bloginfo( 'version' ) >= 4.7 ) ? get_user_locale() : get_locale();
        $this->data['wordpress']['wp_version'] = get_bloginfo( 'version' );
        $this->data['wordpress']['multisite'] = is_multisite();

        $this->data['wordpress']['themes'] = $this->get_themes();
        $this->data['wordpress']['plugins'] = $this->get_plugins();
    }

    /**
     * Collect server data.
     *
     */
    private function _collect_server_data() {
        $this->data['server']['server'] = isset( $_SERVER['SERVER_SOFTWARE'] ) ? sanitize_text_field(wp_unslash($_SERVER['SERVER_SOFTWARE'])) : '';
        $this->data['server']['php_version'] = phpversion();
        $this->data['server']['url'] = esc_url(home_url());
    }

    /**
     * Collect user data.
     *
     */
    private function _collect_user_data() {
        $admin = get_user_by( 'email', get_bloginfo( 'admin_email' ) );
        if ( ! $admin ) {
            $this->data['user']['email'] = '';
            $this->data['user']['first_name'] = '';
            $this->data['user']['last_name'] = '';
        }else{
            $this->data['user']['email'] = get_bloginfo( 'admin_email' );
            $this->data['user']['first_name'] = $admin->first_name;
            $this->data['user']['last_name'] = $admin->last_name;
        }
    }

    /**
     * Get current themes
     *
     * @return array
     */
    private function get_themes() {
        $theme = wp_get_theme();

        return array(
            'installed' => $this->_get_installed_themes(),
            'active'    => array(
                'slug'    => get_stylesheet(),
                'name'    => $theme->get( 'Name' ),
                'version' => $theme->get( 'Version' ),
                'author'  => $theme->get( 'Author' ),
            ),
        );
    }

    /**
     * Get an array of installed themes
     */
    private function _get_installed_themes() {
        $installed = wp_get_themes();
        $theme     = get_stylesheet();
        $arr       = array();

        foreach ( $installed as $slug => $info ) {
            if ( $slug === $theme ) {
                continue;
            }
            $arr[ $slug ] = array(
                'slug'    => $slug,
                'name'    => $info->get( 'Name' ),
                'version' => $info->get( 'Version' ),
                'author'  => $info->get( 'Author' )
            );
        };

        return $arr;
    }

    /**
     * Get a list of installed plugins
     */
    private function get_plugins() {
        if ( ! function_exists( 'get_plugins' ) ) {
            include ABSPATH . '/wp-admin/includes/plugin.php';
        }

        $plugins   = get_plugins();
        $option    = get_option( 'active_plugins', array() );
        $active    = array();
        $installed = array();
        foreach ( $plugins as $id => $info ) {
            if ( in_array( $id, $active ) ) {
                continue;
            }

            $id = explode( '/', $id );
            $id = ucwords( str_replace( '-', ' ', $id[0] ) );

            $installed[] = $id;
        }

        foreach ( $option as $id ) {
            $id = explode( '/', $id );
            $id = ucwords( str_replace( '-', ' ', $id[0] ) );

            $active[] = $id;
        }

        return array(
            'installed' => $installed,
            'active'    => $active,
        );
    }

    /**
     * Send dat to server.
     *
     */
    private function _send_request() {

        $request = wp_remote_post( $this->url, array(
            'method'      => 'POST',
            'timeout'     => 20,
            'redirection' => 5,
            'httpversion' => '1.1',
            'blocking'    => true,
            'body'        => $this->data,
            'user-agent'  => 'MT/EPSILON-CUSTOMER-TRACKING/' . esc_url( home_url() )
        ) );


        if ( is_wp_error( $request ) ) {
            return false;
        }

        return true;

    }
}
