<?php
// Pandora FMS - http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2010 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.
class ModuleGraph
{

    private $correct_acl = false;

    private $acl = 'AR';

    private $id = 0;

    private $id_agent = 0;

    private $graph_type = 'sparse';

    private $period = SECONDS_1DAY;

    private $draw_events = 0;

    private $width = 0;

    private $height = 0;

    private $draw_alerts = 0;

    private $start_date = 0;

    private $time_compare_separated = 0;

    private $time_compare_overlapped = 0;

    private $unknown_graph = 1;

    private $zoom = 1;

    private $baseline = 0;

    private $module = null;

    private $server_id = '';


    function __construct()
    {
        $system = System::getInstance();

        $this->start_date = date('Y-m-d');

        if ($system->checkACL($this->acl)) {
            $this->correct_acl = true;
        } else {
            $this->correct_acl = false;
        }
    }


    private function getFilters()
    {
        $system = System::getInstance();

        $this->id = (int) $system->getRequest('id', 0);
        $this->id_agent = (int) $system->getRequest('id_agent', 0);
        $this->server_id = $system->getRequest('server_id', '');

        $this->module = modules_get_agentmodule($this->id);
        $this->graph_type = return_graphtype($this->module['id_tipo_modulo']);

        $period_hours = $system->getRequest('period_hours', false);

        if ($period_hours == false) {
            $this->period = SECONDS_1DAY;
        } else {
            $this->period = ($period_hours * SECONDS_1HOUR);
        }

        $this->draw_events = (int) $system->getRequest('draw_events', 0);
        $this->draw_alerts = (int) $system->getRequest('draw_alerts', 0);
        $this->start_date = $system->getRequest('start_date', false);
        if ($this->start_date === false) {
            $this->start_date = date('Y-m-d');
        } else {
            $this->start_date = date('Y-m-d', strtotime($this->start_date));
        }

        $this->time_compare_separated = (int) $system->getRequest('time_compare_separated', 0);
        $this->time_compare_overlapped = (int) $system->getRequest('time_compare_overlapped', 0);
        $this->unknown_graph = (int) $system->getRequest('unknown_graph', 0);
        $this->zoom = (int) $system->getRequest('zoom', 1);
        $this->baseline = (int) $system->getRequest('baseline', 0);

        $this->width = (int) $system->getRequest('width', 0);
        $this->width -= 20;
        // Correct the width
        $this->height = (int) $system->getRequest('height', 0);

        // Sancho says "put the height to 1/2 for to make more beautyful"
        $this->height = ($this->height / 1.5);

        $this->height -= 80;
        // Correct the height
        // For to avoid fucking IPHONES when they are in horizontal.
        if ($this->height < 140) {
            $this->height = 140;
        }

    }


    public function ajax($parameter2=false)
    {
        global $config;

        $system = System::getInstance();

        if (!$this->correct_acl) {
            return;
        } else {
            switch ($parameter2) {
                case 'get_graph':
                    $this->getFilters();
                    if ($system->getConfig('metaconsole')) {
                        $server_data = metaconsole_get_connection_by_id(
                            $this->server_id
                        );
                        // Establishes connection.
                        if (metaconsole_load_external_db($server_data) !== NOERR) {
                            return false;
                        }
                    }

                    $correct = 0;
                    $graph = '';
                    $correct = 1;
                    $label = $this->module['nombre'];
                    $unit = db_get_value(
                        'unit',
                        'tagente_modulo',
                        'id_agente_modulo',
                        $this->id
                    );
                    $utime = get_system_time();
                    $current = date('Y-m-d', $utime);

                    if ($this->start_date != $current) {
                        $date = strtotime($this->start_date);
                    } else {
                        $date = $utime;
                    }

                    $urlImage = ui_get_full_url(false);

                    $time_compare = false;
                    if ($this->time_compare_separated) {
                        $time_compare = 'separated';
                    } else if ($this->time_compare_overlapped) {
                        $time_compare = 'overlapped';
                    }

                    ob_start();
                    switch ($this->graph_type) {
                        case 'boolean':
                        case 'sparse':
                        case 'string':
                            $params = [
                                'agent_module_id' => $this->id,
                                'period'          => $this->period,
                                'show_events'     => $this->draw_events,
                                'width'           => $this->width,
                                'height'          => $this->height,
                                'show_alerts'     => $this->draw_alerts,
                                'date'            => $date,
                                'unit'            => $unit,
                                'baseline'        => $this->baseline,
                                'homeurl'         => $urlImage,
                                'adapt_key'       => 'adapter_'.$this->graph_type,
                                'compare'         => $time_compare,
                                'show_unknown'    => $this->unknown_graph,
                                'menu'            => false,
                                'type_graph'      => $config['type_module_charts'],
                                'vconsole'        => true,
                            ];

                            $graph = grafico_modulo_sparse($params);
                            if ($this->draw_events) {
                                $graph .= '<br>';
                                $graph .= graphic_module_events(
                                    $this->id,
                                    $this->width,
                                    $this->height,
                                    $this->period,
                                    $config['homeurl'],
                                    $this->zoom,
                                    'adapted_'.$this->graph_type,
                                    $date
                                );
                            }
                        break;

                        default:
                            $graph .= fs_error_image('../images');
                        break;
                    }

                    if ($system->getConfig('metaconsole')) {
                        metaconsole_restore_db();
                    }

                    $graph = ob_get_clean().$graph;

                    echo json_encode(['correct' => $correct, 'graph' => $graph]);
                break;
            }
        }
    }


    public function show()
    {
        if (!$this->correct_acl) {
            $this->show_fail_acl();
        } else {
            $this->getFilters();
            $this->showModuleGraph();
        }
    }


    private function show_fail_acl()
    {
        $error['type'] = 'onStart';
        $error['title_text'] = __('You don\'t have access to this page');
        $error['content_text'] = System::getDefaultACLFailText();
        if (class_exists('HomeEnterprise')) {
            $home = new HomeEnterprise();
        } else {
            $home = new Home();
        }

        $home->show($error);
    }


    private function javascript_code()
    {
        ob_start();

        global $config;

        echo include_javascript_dependencies_flot_graph(true);
        ui_require_javascript_file('pandora', 'include/javascript/', true);

        ?>
        <script type="text/javascript">
            $(document).ready(function() {
                function load_graph() {
                    $("#loading_graph").show();

                    var heigth = $(document).height()
                            - $(".ui-header").height()
                            - $(".ui-collapsible").height()
                            - 55;
                    var width = $(document).width() - 25;
                    ajax_get_graph($("#id_module").val(), heigth, width, $("#server_id").val());
                }

                load_graph();

                // Detect orientation change to refresh dinamic content
                window.addEventListener("resize", function() {
                    // Reload dinamic content
                    load_graph();
                });
            });

            function ajax_get_graph(id, heigth_graph, width_graph, server_id) {
                postvars = {};
                postvars["action"] = "ajax";
                postvars["parameter1"] = "module_graph";
                postvars["parameter2"] = "get_graph";
                postvars["width"] = width_graph;
                postvars["height"] = heigth_graph;

                postvars["draw_alerts"] = ($("input[name = 'draw_alerts']").is(":checked"))?1:0;
                postvars["draw_events"] = ($("input[name = 'draw_events']").is(":checked"))?1:0;
                postvars["time_compare_separated"] = ($("input[name = 'time_compare_separated']").is(":checked"))?1:0;
                postvars["time_compare_overlapped"] = ($("input[name = 'time_compare_overlapped']").is(":checked"))?1:0;
                postvars["unknown_graph"] = ($("input[name = 'unknown_graph']").is(":checked"))?1:0;;

                postvars["period_hours"] = $("input[name = 'period_hours']").val();
                postvars["zoom"] = $("input[name = 'zoom']").val();
                postvars["start_date"] = $("input[name = 'start_date']").val();

                postvars["id"] = id;

                postvars["server_id"] = server_id;

                $.ajax ({
                    type: "POST",
                    url: "index.php",
                    dataType: "json",
                    data: postvars,
                    success:
                    function (data) {
                        $("#loading_graph").hide();
                        if (data.correct) {
                            $("#graph_content").show();
                            $("#graph_content").html(data.graph);
                        }
                        else {
                            $("#error_graph").show();
                        }
                    },
                    error:
                    function (jqXHR, textStatus, errorThrown) {
                        $("#loading_graph").hide();
                        $("#error_graph").show();
                    }
                    });
            }
        </script>
        <?php
        $javascript_code = ob_get_clean();

        return $javascript_code;
    }


    private function showModuleGraph()
    {
        $agent_alias = agents_get_alias($this->module['id_agente']);

        $ui = Ui::getInstance();

        $ui->createPage();

        if ($this->id_agent) {
            $ui->createDefaultHeader(
                sprintf(__('%s: %s'), get_product_name(), $this->module['nombre']),
                $ui->createHeaderButton(
                    [
                        'icon' => 'back',
                        'pos'  => 'left',
                        'text' => __('Back'),
                        'href' => 'index.php?page=agent&id='.$this->id_agent,
                    ]
                )
            );
        } else {
            $ui->createDefaultHeader(
                sprintf(__('%s: %s'), get_product_name(), $this->module['nombre']),
                $ui->createHeaderButton(
                    [
                        'icon' => 'back',
                        'pos'  => 'left',
                        'text' => __('Back'),
                        'href' => 'index.php?page=modules',
                    ]
                )
            );
        }

        $ui->showFooter(false);
        $ui->beginContent();
            $ui->contentAddHtml(
                $ui->getInput(
                    [
                        'id'    => 'id_module',
                        'value' => $this->id,
                        'type'  => 'hidden',
                    ]
                )
            );
            $ui->contentAddHtml(
                $ui->getInput(
                    [
                        'id'    => 'server_id',
                        'value' => $this->server_id,
                        'type'  => 'hidden',
                    ]
                )
            );
            $title = sprintf(__('Options for %s : %s'), $agent_alias, $this->module['nombre']);
            $ui->contentBeginCollapsible($title);
                $ui->beginForm('index.php?page=module_graph&id='.$this->id.'&server_id='.$this->server_id);
                    $options = [
                        'name'    => 'draw_alerts',
                        'value'   => 1,
                        'checked' => (bool) $this->draw_alerts,
                        'label'   => __('Show Alerts'),
                    ];
                    $ui->formAddCheckbox($options);

                    $options = [
                        'name'    => 'draw_events',
                        'value'   => 1,
                        'checked' => (bool) $this->draw_events,
                        'label'   => __('Show Events'),
                    ];
                    $ui->formAddCheckbox($options);

                    $options = [
                        'name'    => 'time_compare_separated',
                        'value'   => 1,
                        'checked' => (bool) $this->time_compare_separated,
                        'label'   => __('Time compare (Separated)'),
                    ];
                    $ui->formAddCheckbox($options);

                    $options = [
                        'name'    => 'time_compare_overlapped',
                        'value'   => 1,
                        'checked' => (bool) $this->time_compare_overlapped,
                        'label'   => __('Time compare (Overlapped)'),
                    ];
                    $ui->formAddCheckbox($options);

                    $options = [
                        'name'    => 'unknown_graph',
                        'value'   => 1,
                        'checked' => (bool) $this->unknown_graph,
                        'label'   => __('Show unknown graph'),
                    ];
                    $ui->formAddCheckbox($options);

                    $options = [
                        'label' => __('Time range (hours)'),
                        'name'  => 'period_hours',
                        'value' => ($this->period / SECONDS_1HOUR),
                        'min'   => 0,
                        'max'   => (24 * 30),
                        'step'  => 4,
                    ];
                    $ui->formAddSlider($options);

                    $options = [
                        'name'  => 'start_date',
                        'value' => $this->start_date,
                        'label' => __('Begin date'),
                    ];
                    $ui->formAddInpuDate($options);

                    $options = [
                        'icon'     => 'refresh',
                        'icon_pos' => 'right',
                        'text'     => __('Update graph'),
                    ];
                    $ui->formAddSubmitButton($options);

                    $html = $ui->getEndForm();
                    $ui->contentCollapsibleAddItem($html);
                    $ui->contentEndCollapsible();
                    $ui->contentAddHtml(
                        '<div id="graph_content" style="display: none; width: 100%; height: 100%; text-align: center;"></div>
				<div id="loading_graph" style="width: 100%; text-align: center;">'.__('Loading...').'<br /><img src="images/ajax-loader.gif" /></div>
				<div id="error_graph" style="display: none; color: red; width: 100%; text-align: center;">'.__('Error get the graph').'</div>'
                    );
            $ui->contentAddHtml($this->javascript_code());
        $ui->endContent();
        $ui->showPage();
    }


}