<?php

/**
 * File: /controller/e2pdf-debug.php
 *
 * @package  E2Pdf
 * @license  GPLv3
 * @link     https://e2pdf.com
 */
if (!defined('ABSPATH')) {
    die('Access denied.');
}

class Controller_E2pdf_Debug extends Helper_E2pdf_View {

    // url: admin.php?page=e2pdf-debug
    public function index_action() {
        if ($this->post->get('_wpnonce')) {
            if (wp_verify_nonce($this->post->get('_wpnonce'), 'e2pdf_debug')) {
                if ($this->post->get('e2pdf_updated')) {
                    update_option('e2pdf_version', '1.00.00');
                    /* translators: %s: Action */
                    $this->add_notification('update', sprintf(__('Success: %s', 'e2pdf'), __('Reinitialize Activation Hooks', 'e2pdf')));
                    $this->redirect($this->helper->get_url(['page' => 'e2pdf-debug']));
                }
            } else {
                wp_die($this->message('wp_verify_nonce_error'));
            }
        }
        $this->view('api', new Model_E2pdf_Api());
        if (ini_get('disable_functions')) {
            $disabled_functions = explode(',', ini_get('disable_functions'));
        } else {
            $disabled_functions = [];
        }
        $this->view('disabled_functions', $disabled_functions);
    }

    // url: admin.php?page=e2pdf-debug&action=db
    public function db_action() {
        global $wpdb;
        if ($this->post->get('_wpnonce')) {
            if (wp_verify_nonce($this->post->get('_wpnonce'), 'e2pdf_debug')) {
                if ($this->post->get('e2pdf_db_repair')) {
                    $db_prefix = $wpdb->prefix;
                    $this->helper->load('db')->db_repair($db_prefix);
                    /* translators: %s: Action */
                    $this->add_notification('update', sprintf(__('Success: %s', 'e2pdf'), __('Repair DB', 'e2pdf')));
                } elseif ($this->post->get('e2pdf_db_repair_collate')) {
                    $db_prefix = $wpdb->prefix;
                    $this->helper->load('db')->db_repair_collate($db_prefix);
                    /* translators: %s: Action */
                    $this->add_notification('update', sprintf(__('Success: %s', 'e2pdf'), __('Repair DB Collate', 'e2pdf')));
                } elseif ($this->post->get('e2pdf_db')) {
                    $db_prefix = $wpdb->prefix;
                    $this->helper->load('db')->db_init($db_prefix);
                    /* translators: %s: Action */
                    $this->add_notification('update', sprintf(__('Success: %s', 'e2pdf'), __('Reinitialize DB Hooks', 'e2pdf')));
                }
                $this->redirect(
                        $this->helper->get_url(
                                [
                                    'page' => 'e2pdf-debug',
                                    'action' => 'db',
                                ]
                        )
                );
            } else {
                wp_die($this->message('wp_verify_nonce_error'));
            }
        }
        $this->view('db_structure', $this->helper->load('db')->db_structure($wpdb->prefix, true));
        $this->view('db_check_collate', $this->helper->load('db')->db_check_collate($wpdb->prefix));
    }

    // url: admin.php?page=e2pdf-debug&action=phpinfo
    public function phpinfo_action() {
        $this->view('phpinfo', $this->get_php_info());
    }

    // url: admin.php?page=e2pdf-debug&action=requests
    public function connections_action() {
        $connections = [
            'self_connection' => [],
            'api_connection_upload' => [],
            'api_connection_download' => [],
        ];

        $url = plugins_url('img/loader.svg?v=' . time(), $this->helper->get('plugin_file_path'));
        $image = $this->helper->load('image')->get_by_url($url);
        if ($image !== '<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" width="20px" height="20px" viewBox="0 0 128 128" xml:space="preserve"><g><path d="M63.9.45A63.46 63.46 0 1 1 .47 63.9 63.46 63.46 0 0 1 63.9.46zM41.8 19.38a22.27 22.27 0 1 1-22.3 22.27 22.27 22.27 0 0 1 22.27-22.27z" fill="#808080" fill-rule="evenodd"/><animateTransform attributeName="transform" type="rotate" from="0 64 64" to="360 64 64" dur="960ms" repeatCount="indefinite"></animateTransform></g></svg>') {
            $connections['self_connection'] = [
                'error' => '',
            ];
        }

        $file = 10000000;
        $times = [];
        $times[] = microtime(true);
        $model_e2pdf_api = new Model_E2pdf_Api();
        $model_e2pdf_api->set(
                [
                    'action' => 'common/connection',
                    'data' => [
                        'upload' => str_repeat(' ', $file),
                    ],
                ]
        );
        $request = $model_e2pdf_api->request();
        $times[] = microtime(true);
        if (isset($request['error'])) {
            $connections['api_connection_upload'] = [
                'error' => $request['error'],
                'result' => '',
            ];
        } else {
            $connections['api_connection_upload'] = [
                'result' => $this->helper->load('convert')->from_bytes($file / ($times[1] - $times[0])) . '/s (' . $this->helper->load('convert')->from_bytes($file) . ' in ' . number_format(($times[1] - $times[0]), 2) . 's)',
            ];
        }

        $times[] = microtime(true);
        $model_e2pdf_api = new Model_E2pdf_Api();
        $model_e2pdf_api->set(
                [
                    'action' => 'common/connection',
                    'data' => [
                        'download' => true,
                    ],
                ]
        );
        $request = $model_e2pdf_api->request();
        $times[] = microtime(true);
        if (isset($request['error'])) {
            $connections['api_connection_download'] = [
                'error' => $request['error'],
                'result' => '',
            ];
        } else {
            $connections['api_connection_download'] = [
                'result' => $this->helper->load('convert')->from_bytes($file / ($times[3] - $times[2])) . '/s (' . $this->helper->load('convert')->from_bytes($file) . ' in ' . number_format(($times[3] - $times[2]), 2) . 's)',
            ];
        }
        $this->view('connections', $connections);
    }

    // php info
    public function get_php_info() {
        ob_start();
        phpinfo();
        $contents = ob_get_contents();
        ob_end_clean();
        $php_info = (str_replace('module_Zend Optimizer', 'module_Zend_Optimizer', preg_replace('%^.*<body>(.*)</body>.*$%ms', '$1', $contents)));
        return $php_info;
    }
}
