<?php

// Pandora FMS - http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2009 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.
// Load global vars
global $config;

require_once 'include/functions_agents.php';
require_once 'include/functions_custom_graphs.php';
ui_require_javascript_file('calendar');

if (! check_acl($config['id_user'], $id_grupo, 'AR') && ! check_acl($config['id_user'], 0, 'AW')) {
    db_pandora_audit(
        'ACL Violation',
        'Trying to access (read) to agent '.agents_get_name($id_agente)
    );
    include 'general/noaccess.php';
    return;
}

require_once $config['homedir'].'/include/functions_graph.php';

$draw_alerts = get_parameter('draw_alerts', 0);
$period = get_parameter('period', SECONDS_1HOUR);
$width = get_parameter('width', 555);
$height = get_parameter('height', 245);
$label = get_parameter('label', '');
$start_date = get_parameter('start_date', date('Y-m-d'));
$draw_events = get_parameter('draw_events', 0);
$modules = get_parameter('modules', []);
$filter = get_parameter('filter', 0);
$combined = get_parameter('combined', 1);
$option_type = get_parameter('option_type', 0);

// ----------------------------------------------------------------------
// Get modules of agent sorted as:
// - modules network no proc
// - modules network proc
// - others
// ----------------------------------------------------------------------
$list_modules = [];
$modules_networkmap_no_proc = agents_get_modules(
    $id_agente,
    false,
    [
        'id_modulo'      => 2,
    // networkmap type
        'id_tipo_modulo' => [
            '<>2',
    // != generic_proc
            '<>6',
    // != remote_icmp_proc
            '<>9',
    // != remote_tcp_proc
            '<>6',
    // != remote_tcp_proc
            '<>18',
    // != remote_snmp_proc
            '<>21',
    // != async_proc
            '<>31',
        ],
        // != web_proc
    ]
);
if (empty($modules_networkmap_no_proc)) {
    $modules_networkmap_no_proc = [];
}

$modules_others = agents_get_modules(
    $id_agente,
    false,
    [
        'id_tipo_modulo' => [
            '<>2',
    // != generic_proc
            '<>6',
    // != remote_icmp_proc
            '<>9',
    // != remote_tcp_proc
            '<>6',
    // != remote_tcp_proc
            '<>18',
    // != remote_snmp_proc
            '<>21',
    // != async_proc
            '<>31',
        ],
        // != web_proc
    ]
);

if (empty($modules_others)) {
    $modules_others = [];
}

$modules_boolean = agents_get_modules(
    $id_agente,
    false,
    [
        'id_tipo_modulo' => [
            '<>1',
            '<>3',
            '<>4',
            '<>5',
            '<>7',
            '<>8',
            '<>10',
            '<>11',
            '<>15',
            '<>16',
            '<>17',
            '<>22',
            '<>23',
            '<>24',
            '<>30',
            '<>32',
            '<>33',
            '<>100',
        ],
    ]
);
if (empty($modules_boolean)) {
    $modules_boolean = [];
}

// Cleaned the duplicate $modules and other things
$modules_others = array_diff_key(
    $modules_others,
    $modules_networkmap_no_proc
);
foreach ($modules_others as $i => $m) {
    $modules_others[$i] = [
        'optgroup' => __('Other modules'),
        'name'     => $m,
    ];
}

foreach ($modules_networkmap_no_proc as $i => $m) {
    $modules_networkmap_no_proc[$i] = [
        'optgroup' => __('Modules network no proc'),
        'name'     => $m,
    ];
}

foreach ($modules_boolean as $i => $m) {
    $modules_boolean[$i] = [
        'optgroup' => __('Modules boolean'),
        'name'     => $m,
    ];
}


$list_modules = ($modules_networkmap_no_proc + $modules_others + $modules_boolean);
// ----------------------------------------------------------------------
if (empty($modules)) {
    // Selected the first 6 modules.
    $module_ids = array_keys($list_modules);
    $module_ids = array_slice($module_ids, 0, 6);
    $modules = $module_ids;
}

$table = new stdClass();
$table->width = '100%';
$table->class = 'databox filters';

$table->style[0] = 'font-weight: bolder; text-align: left;';
$table->size[0] = '10%';
$table->style[1] = 'font-weight: bolder; text-align: left;';
$table->size[1] = '15%';
$table->style[2] = 'font-weight: bolder; text-align: left;';
$table->size[2] = '10%';
$table->style[3] = 'font-weight: bolder; text-align: left;';
$table->size[3] = '20%';

$table->rowspan[0][0] = 7;
$table->rowspan[0][1] = 7;

$table->data[0][0] = __('Modules');
$table->data[0][1] = html_print_select(
    $list_modules,
    'modules[]',
    $modules,
    '',
    '',
    0,
    true,
    true,
    true,
    '',
    false,
    'min-width:200px;max-width:460px;height: 200px;'
);

$table->rowspan[2][0] = 7;
$table->data[2][0] = '';

$table->data[2][1] = __('Begin date');
$table->data[2][2] = html_print_input_text('start_date', substr($start_date, 0, 10), '', 10, 40, true);
$table->data[2][2] .= html_print_image('images/calendar_view_day.png', true, ['onclick' => "scwShow(scwID('text-start_date'),this);"]);

$table->data[3][1] = __('Time range');

$table->data[3][2] = html_print_extended_select_for_time('period', $period, '', '', 0, 7, true);

$table->data[4][2] = __('Show events');
$table->data[4][3] = html_print_checkbox('draw_events', 1, (bool) $draw_events, true);
$table->data[5][2] = __('Show alerts').ui_print_help_tip(__('the combined graph does not show the alerts into this graph'), true);
$table->data[5][3] = html_print_checkbox('draw_alerts', 1, (bool) $draw_alerts, true);
$table->data[6][2] = __('Show as one combined graph');
$graph_option_one_or_several = [
    0 => __('several graphs for each module'),
    1 => __('One combined graph'),
];
$table->data[6][3] = html_print_select($graph_option_one_or_several, 'combined', $combined, '', '', 1, true);

$table->data[7][2] = __('Chart type');
if ($combined == 1) {
    $graph_option_type = [
        0 => __('Area'),
        1 => __('Area stack'),
        2 => __('Line'),
        3 => __('Line stack'),
    ];
} else {
    $graph_option_type = [
        0 => __('Area'),
        2 => __('Line'),
    ];
}

$table->data[7][3] = html_print_select($graph_option_type, 'option_type', $option_type, '', '', 1, true);

$htmlForm = '<form method="post" action="index.php?sec=estado&sec2=operation/agentes/ver_agente&tab=graphs&id_agente='.$id_agente.'" >';
$htmlForm .= html_print_table($table, true);
$htmlForm .= html_print_input_hidden('filter', 1, true);
$htmlForm .= '<div class="action-buttons" style="width: '.$table->width.'">';
$htmlForm .= html_print_button(
    __('Save as custom graph'),
    'save_custom_graph',
    false,
    '',
    'class="sub add" style=""',
    true
).'&nbsp;&nbsp;'.html_print_submit_button(__('Filter'), 'filter_button', false, 'class="sub upd" style=""', true);
$htmlForm .= '</div>';
$htmlForm .= '</form>';

ui_toggle($htmlForm, __('Filter graphs'), __('Toggle filter(s)'), false);

$utime = get_system_time();
$current = date('Y-m-d', $utime);

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

if ($combined) {
    // Pass the $modules before the ajax call
    echo '<div class="combined-graph-container" style="width: 100%; text-align: center;"'.'data-period="'.$period.'"'.'data-stacked="'.CUSTOM_GRAPH_LINE.'"'.'data-date="'.$date.'"'.'data-height="'.$height.'"'.'>'.html_print_image('images/spinner.gif', true).'</div>';
} else {
    foreach ($modules as $id_module) {
        $title = modules_get_agentmodule_name($id_module);
        $unit = modules_get_unit($id_module);

        echo '<h4>'.$title.'</h4>';
        echo '<div class="sparse-graph-container" style="width: 100%; text-align: center;"'.'data-id_module="'.$id_module.'"'.'data-period="'.$period.'"'.'data-draw_events="'.(int) $draw_events.'"'.'data-title="'.$title.'"'.'data-draw_alerts="'.(int) $draw_alerts.'"'.'data-date="'.$date.'"'.'data-unit="'.$unit.'"'.'data-date="'.$date.'"'.'data-height="'.$height.'"'.'>'.html_print_image('images/spinner.gif', true).'</div>';
    }
}

echo "<div style='clear: both;'></div>";

echo '<div id="graph-error-message" style="display: none;">';
ui_print_error_message(__('There was an error loading the graph'));
echo '</div>';

// Dialog to save the custom graph
echo "<div id='dialog_save_custom_graph' style='display: none;'>";
$table = new stdClass();
$table->width = '100%';
$table->style[0] = 'font-weight: bolder; text-align: right;';
$table->data[0][0] = __('Name custom graph');
$table->data[0][1] = html_print_input_text(
    'name_custom_graph',
    '',
    __('Name custom graph'),
    30,
    50,
    true
);

html_print_table($table);

echo "<div style='width: ".$table->width."; text-align: right;'>";
    html_print_image(
        'images/spinner.gif',
        false,
        [
            'style' => 'display: none',
            'class' => 'loading_save',
        ]
    );
    html_print_image(
        'images/ok.png',
        false,
        [
            'style' => 'display: none',
            'class' => 'ok_save',
        ]
    );
    html_print_image(
        'images/error_red.png',
        false,
        [
            'style' => 'display: none',
            'class' => 'error_save',
        ]
    );
    html_print_button(
        __('Save'),
        'save_custom_graph',
        false,
        'save_custom_graph_second_step();',
        'class="button_save sub save"'
    );
    echo '</div>';
    echo '</div>';
    ?>
<script type="text/javascript">
    $(document).ready(function() {
        $("#dialog_save_custom_graph").dialog({
            title: "<?php echo __('Save custom graph'); ?>",
            height: 200,
            width: 500,
            modal: true,
            autoOpen: false
        });
    });
    
    $('#button-save_custom_graph').click(function (event) {
        $("#dialog_save_custom_graph").dialog("open");
    });
    
    function save_custom_graph_second_step() {
        $(".button_save").disable();
        $(".ok_save").hide();
        $(".error_save").hide();
        $(".loading_save").show();
        
        var params = {};
        params["id_modules"] = <?php echo json_encode($modules); ?>;
        params["name"] = $("input[name='name_custom_graph']").val();
        params["description"] = "<?php echo __('Custom graph create from the tab graphs in the agent.'); ?>";
        params["stacked"] = <?php echo CUSTOM_GRAPH_LINE; ?>;
        params["width"] = <?php echo $width; ?>;
        params["height"] = <?php echo $height; ?>;
        params["events"] = <?php echo $draw_events; ?>;
        params["period"] = <?php echo $period; ?>;
        
        params["save_custom_graph"] = 1;
        params["page"] = "include/ajax/graph.ajax";
        jQuery.ajax ({
            data: params,
            dataType: "json",
            type: "POST",
            url: "ajax.php",
            success: function (data) {
                $(".loading_save").hide();
                if (data.correct) {
                    $(".ok_save").show();
                }
                else {
                    $(".error_save").show();
                    $(".button_save").enable();
                }
            }
        });
    }
    
    // Load graphs
    $(document).ready(function() {
        $('#combined').change(function () {
            if ($('#combined').val() == 1) {
                $('#option_type').empty();
                $('#option_type').append($('<option>', {
                    value: 0,
                    text: "<?php echo __('Area'); ?>"
                }));
                $('#option_type').append($('<option>', {
                    value: 1,
                    text: "<?php echo __('Area stack'); ?>"
                }));
                $('#option_type').append($('<option>', {
                    value: 2,
                    text: "<?php echo __('Line'); ?>"
                }));
                $('#option_type').append($('<option>', {
                    value: 3,
                    text: "<?php echo __('Line stack'); ?>"
                }));
            }
            else {
                $('#option_type').empty();
                $('#option_type').append($('<option>', {
                    value: 0,
                    text: "<?php echo __('Area'); ?>"
                }));
                $('#option_type').append($('<option>', {
                    value: 2,
                    text: "<?php echo __('Line'); ?>"
                }));
            }
        });

        var getModulesPHP = function () {
            return <?php echo json_encode($modules); ?>;
        }
        
        var requestGraph = function (type, data) {
            data = data || {};
            type = type || 'custom';
            data.page = 'include/ajax/graph.ajax';
            data['print_' + type + '_graph'] = 1;
            
            return $.ajax({
                url: 'ajax.php',
                type: 'POST',
                dataType: 'html',
                data: data
            })
        }
        
        var requestCustomGraph = function (graphId, width, height, period, stacked, date, modules) {
            return requestGraph('custom', {
                page: 'include/ajax/graph.ajax',
                print_custom_graph: 1,
                id_graph: graphId,
                height: height,
                width: width,
                period: period,
                stacked: stacked,
                date: date,
                modules_param: modules
            });
        }
        
        var requestSparseGraph = function (moduleId, period, showEvents, width, height, title, showAlerts, date, unit, type_g) {
            return requestGraph('sparse', {
                page: 'include/ajax/graph.ajax',
                print_sparse_graph: 1,
                agent_module_id: moduleId,
                period: period,
                show_events: showEvents,
                width: width,
                height: height,
                title: title,
                show_alerts: showAlerts,
                date: date,
                unit: unit,
                type_g: type_g
            });
        }
        
        var loadCustomGraphs = function () {
            $('div.combined-graph-container').each(function (index, el) {
                loadCustomGraph(el);
            });
        }
        
        var loadCustomGraph = function (element) {
            var $container = $(element);
            var $errorMessage = $('div#graph-error-message');
            var period = $container.data('period');
            var conf_stacked = parseInt($("#option_type").val());
            
            switch (conf_stacked) {
                case 0:
                    var stacked = 0;
                    break;
                case 1:
                    var stacked = 1;
                    break;
                case 2:
                    var stacked = 2;
                    break;
                case 3:
                    var stacked = 3;
                    break;
            }

            var date = $container.data('date');
            var height = $container.data('height');
            
            var modules = getModulesPHP();
            var width = $container.width() - 20;
            
            var handleSuccess = function (data) {
                $container.html(data);
            }
            var handleError = function (xhr, textStatus, errorThrown) {
                $container.html($errorMessage.html());
            }
            
            requestCustomGraph(0, width, height, period, stacked, date, modules)
                .done(handleSuccess)
                .fail(handleError);
        }
        
        var loadSparseGraphs = function () {
            $('div.sparse-graph-container').each(function (index, el) {
                loadSparseGraph(el);
            });
        }
        
        var loadSparseGraph = function (element) {
            var $container = $(element);
            var $errorMessage = $('div#graph-error-message');
            var moduleId = $container.data('id_module');
            var period = $container.data('period');
            var showEvents = $container.data('draw_events');
            var title = $container.data('title');
            var showAlerts = $container.data('draw_alerts');
            var date = $container.data('date');
            var unit = $container.data('unit');
            var date = $container.data('date');
            var height = $container.data('height');
            var conf_stacked = parseInt($("#option_type").val());
            
            switch (conf_stacked) {
                case 0:
                    var type_g = 'area';
                    break;
                case 2:
                    var type_g = 'line';
                    break;
            }
            
            var width = $container.width() - 20;
            
            var handleSuccess = function (data) {
                $container.html(data);
            }
            var handleError = function (xhr, textStatus, errorThrown) {
                $container.html($errorMessage.html());
            }

            requestSparseGraph(moduleId, period, showEvents, width, height, title, showAlerts, date, unit, type_g)
                .done(handleSuccess)
                .fail(handleError);
        }
        
        // Run
        loadCustomGraphs();
        loadSparseGraphs();
    });
</script>