<?php
/**
 * Credential store
 *
 * @category   Class
 * @package    Pandora FMS
 * @subpackage Help Feedback
 * @version    1.0.0
 * @license    See below
 *
 *    ______                 ___                    _______ _______ ________
 *   |   __ \.-----.--.--.--|  |.-----.----.-----. |    ___|   |   |     __|
 *  |    __/|  _  |     |  _  ||  _  |   _|  _  | |    ___|       |__     |
 * |___|   |___._|__|__|_____||_____|__| |___._| |___|   |__|_|__|_______|
 *
 * ============================================================================
 * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas
 * Please see http://pandorafms.org for full contribution list
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation for version 2.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * ============================================================================
 */

// Begin.
global $config;

require_once $config['homedir'].'/godmode/wizards/Wizard.main.php';
ui_require_css_file('pandora');
/**
 * Class HelpFeedBack.
 */
class HelpFeedBack extends Wizard
{

    /**
     * Allowed methods to be called using AJAX request.
     *
     * @var array
     */
    public $AJAXMethods = [
        'loadFeedbackForm',
        'sendMailMethod',
    ];

    /**
     * Url of controller.
     *
     * @var string
     */
    public $ajaxController;


    /**
     * Checks if target method is available to be called using AJAX.
     *
     * @param string $method Target method.
     *
     * @return boolean True allowed, false not.
     */
    public function ajaxMethod($method)
    {
        return in_array($method, $this->AJAXMethods);
    }


    /**
     * Constructor.
     *
     * @param string $ajax_controller Controller.
     *
     * @return object
     */
    public function __construct($ajax_controller)
    {
        $this->ajaxController = $ajax_controller;

        return $this;
    }


    /**
     * Main method.
     *
     * @return void
     */
    public function run()
    {
        ui_require_css_File('discovery');
        ui_require_css_file('help_feedback');

        $help_url = get_parameter('b', null);
        $help_url = io_safe_input(base64_decode($help_url));

        if ($help_url === null) {
            echo __('Page not found');
        } else {
            ?>
        <iframe width="100%" height="100%" frameBorder="0" id="h_Viewer"
            src="<?php echo $help_url; ?>">
            <?php echo __('Browser not compatible.'); ?>
        </iframe>
            <?php
        }

        $hidden = '<input type="hidden" value="'.$help_url.'" ';
        $hidden .= ' form="feedback_form" name="help_url" />';

        echo $hidden;

        echo '<div class="help_feedback">';
        // Load feedback form.
        echo $this->loadFeedbackForm();
        echo '</div><div id="back" class="invisible"></div>';
    }


    /**
     * Loads a feedback form
     *
     * @return​ ​string HTML code for form.
     *
     * @return Function loadFeedbackForm.
     */
    public function loadFeedbackForm()
    {
        global $config;

        $form = [
            'action'   => '#',
            'id'       => 'feedback_form',
            'onsubmit' => 'return false;',
        ];

        $inputs = [
            [
                'wrapper'       => 'div',
                'block_id'      => 'flex-row-baseline w100p',
                'class'         => 'flex-row-baseline w100p',
                'direct'        => 1,
                'block_content' => [
                    [
                        'arguments' => [
                            'label'      => __('Suggestion'),
                            'type'       => 'radio_button',
                            'attributes' => 'class="btn"',
                            'name'       => 'suggestion',
                            'id'         => 'suggestion',
                            'script'     => 'disableRadio(\'report\')',
                            'return'     => true,
                        ],
                    ],
                    [
                        'arguments' => [
                            'label'      => __('Something is wrong'),
                            'type'       => 'radio_button',
                            'attributes' => 'class="btn"',
                            'name'       => 'report',
                            'id'         => 'report',
                            'script'     => 'disableRadio(\'suggestion\')',
                            'return'     => true,
                        ],
                    ],
                ],
            ],
            [

                'label'     => __('What happened?'),
                'class'     => 'explain',
                'arguments' => [
                    'class' => 'textarea_feedback',
                    'id'    => 'feedback_text',
                    'type'  => 'textarea',
                    'name'  => 'feedback_text',
                ],
            ],
            [
                'label'     => __('Your Email'),
                'arguments' => [
                    'id'          => 'feedback_email',
                    'name'        => 'feedback_email',
                    'input_class' => 'email_feedback',
                    'class'       => 'email_feedback',
                    'type'        => 'email',
                    'required'    => true,
                ],
            ],
            [
                'arguments' => [
                    'button_class' => 'btn_submit',
                    'class'        => 'btn_submit',
                    'attributes'   => 'class="sub next btn_submit_feed_back"',
                    'type'         => 'submit',
                    'id'           => 'submit_feedback',
                    'label'        => __('Submit'),
                ],
            ],
        ];

        $output = ui_print_toggle(
            [
                'id'      => 'toggle_help_feedback',
                'content' => $this->printForm(
                    [
                        'form'   => $form,
                        'inputs' => $inputs,
                    ],
                    true
                ),
                'name'    => __('Feedback'),
                'return'  => true,
                'class'   => 'no-border',
                'img_a'   => 'images/arrow_down_white.png',
                'img_b'   => 'images/arrow_up_white.png',

            ]
        );

        $output .= $this->loadJS();
        return $output;
    }


    /**
     * Function send_mail_method,we use send_email_attachment method
     * from functions_cron.php.
     *
     * @param​ ​string​ $feedback_option type fo mail.
     * @param​ ​string​ $feedback_text text mail.
     * @param​ ​string​ $feedback_mail costumer mail.
     *
     * @return void.
     */
    public function sendMailMethod()
    {
        global $config;
        $suggestion = get_parameter('type', 'false');
        $feedback_text = get_parameter('feedback_text', null);
        $feedback_mail = get_parameter('feedback_email', null);
        $help_url = get_parameter('help_url', 'unknown');

        $section = explode('title=', $help_url, 2);

        $subject = '';
        if (is_array($section) === true && isset($section[1]) === true) {
            $subject = '['.$section[1].']';
        }

        if ($suggestion !== 'false') {
            $subject .= __('[pandorafms wiki] New suggestion');
        } else {
            $subject .= __('[pandorafms wiki] New report');
        }

        if (empty($feedback_mail) === true) {
            $error = [
                'error' => __(
                    'Please provide your email address, we promise not to bother you'
                ),
            ];
        }

        if (empty($feedback_text) === true) {
            if ($suggestion !== 'false') {
                $msg = 'Please provide some feedback. Write something awesome!';
            } else {
                $msg = 'Please provide some feedback. We\'ll appreciate it!';
            }

            $error = [
                'error' => __($msg),
            ];
        }

        if ($error !== null) {
            echo json_encode($error);
            exit;
        }

        enterprise_include_once('include/functions_cron.php');

        $uid = $config['pandora_uid'];
        if (empty($uid) === true) {
            $uid = 'not registered';
        }

        $body = '<ul><li><b>User mail</b> '.$feedback_mail.'</li>';
        $body .= '<li><b>Console</b> <i>'.$uid.'</i></li>';
        $body .= '<li><b>URL</b> '.$help_url.'</li></ul>';
        $body .= '<h2>Message</h2>';
        $body .= '<p>'.$feedback_text.'</p>';

        $res = enterprise_hook(
            'send_email_attachment',
            [
                'feedback@artica.es',
                $body,
                $subject,
            ]
        );

        // Response.
        if ($res == 1) {
            $r = ['error' => ''];
        } else {
            $r = ['error' => __('Something went wrong while sending the report.')];
        }

        echo json_encode($r);

        exit;
    }


    /**
     * Load extra JS.
     *
     * @return string JS content.
     */
    public function loadJS()
    {
        ob_start();
        ?>
    <script type="text/javascript">
        function disableRadio(id) {
            $('#'+id).prop('checked', false)
        }

        // Set values to data.
        $("#feedback_form").on('submit', function() {
            // Make the AJAX call to send mails.
            $.ajax({
                type: "POST",
                url: "ajax.php",
                dataType: "json",
                data: {
                    page: "<?php echo $this->ajaxController; ?>",
                    method: 'sendMailMethod',
                    type: $('#suggestion').prop('checked'),
                    feedback_text: $("textarea[name=feedback_text]").val(),
                    feedback_email: $("input[name=feedback_email]").val(),
                    help_url: $("input[name=help_url]").val(),
                },
                success: function (data) {
                    var title;
                    var content;
                    var failed = 0;
                    var className='submit-next';

                    if (data.error != "") {
                        title = '<?php echo __('Failed'); ?>';
                        content = data.error;
                        failed = 1;
                        className='submit-cancel';
                    } else {
                        title = '<?php echo __('Success'); ?>';
                        content = '<?php echo __('Your report had been successfully sent to Artica.').'<br>'.__('Thank you!'); ?>';
                    }
                    $('#back').html(content);
                    $('#back').dialog({
                        title: title,
                        buttons: [
                            {
                                class:
                                "ui-widget ui-state-default ui-corner-all ui-button-text-only sub upd " + className,
                                text: '<?php echo __('OK'); ?>',
                                click: function() {
                                    $(this).dialog("close");
                                    if (failed == 0) {
                                        $('#toggle_help_feedback').empty();
                                    }
                                }
                            },
                        ]
                    })
                },
                error: function (data) {
                    console.error("Fatal error in AJAX call to send help feedback mail")
                }
            });
        });

    </script>
        <?php
        return ob_get_clean();
    }


}