#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2013-2020
# This file is part of Shinken Enterprise, all rights reserved.

import optparse
import urllib
import json
from shinkensolutions.lib_checks.common import Utils, Result, EXIT_STATUS, HTMLTable

result = Result()


def get_option_parser():
    parser = optparse.OptionParser()
    parser.add_option('-H', '--hostname', dest='hostname', default='127.0.0.1')
    parser.add_option('-p', '--port', dest='port', default=7770, type=int)
    parser.add_option('-P', '--password', dest='password', default='')
    parser.add_option('-t', '--daemon-type', dest='daemon_type', default='arbiter')
    parser.add_option('-T', '--timeout', dest='timeout', type=int, default=60)
    parser.add_option('-e', '--expanded', dest='expanded', action='store_true', default=False)
    parser.add_option('-S', '--secure', dest='secure_connection', action='store_true', default=False)
    parser.add_option('-r', '--readable', dest='perfdata_human_readable', action='store_true', default=False)
    return parser


def _main():
    parser = get_option_parser()
    opts, args = parser.parse_args()
    
    http = 'https' if opts.secure_connection else 'http'
    uri = '%s://%s:%s/' % (http, opts.hostname, opts.port)
    uri = uri.decode('utf-8')
    
    get_params = {
        'password': opts.password
    }
    expanded = opts.expanded
    if expanded:
        get_params['expanded'] = expanded
    
    raw_buffer, request_time = Utils.request_get(result, uri, '/memory_stats?%s' % urllib.urlencode(get_params), raise_exp=False, timeout=opts.timeout)
    memory_stats = json.loads(raw_buffer)
    
    result.add_check(output='process memory see by os : %s (%s o)' % (Utils.print_human_readable_size(memory_stats['process_memory']), memory_stats['process_memory']))
    result.add_check(output='total size of items in gc : %s (%s o)' % (Utils.print_human_readable_size(memory_stats['process_python_gc_items']), memory_stats['process_python_gc_items']))
    
    hr_process_memory = Utils.print_human_readable_size(memory_stats['process_memory'])
    hr_gc_size = Utils.print_human_readable_size(memory_stats['process_python_gc_items'])
    
    perfdata_human_readable = opts.perfdata_human_readable
    if perfdata_human_readable is True:
        result.add_perf_data('process_memory_mo', hr_process_memory.replace(" ", ""))
        result.add_perf_data('gc_size_mo', hr_gc_size.replace(" ", ""))
    else:
        result.add_perf_data('process_memory', memory_stats['process_memory'])
        result.add_perf_data('gc_size', memory_stats['process_python_gc_items'])
    
    if expanded:
        if memory_stats['guppy_install']:
            result.add_check(output='total size of items in python : %s (%s o) for %s items' % (Utils.print_human_readable_size(int(memory_stats['process_python_heap_size'])), memory_stats['process_python_heap_size'], memory_stats['total_nb_item']))
            
            if perfdata_human_readable is True:
                result.add_perf_data('process_memory_mo', hr_process_memory.replace(" ", ""))
                result.add_perf_data('gc_size_mo', hr_gc_size.replace(" ", ""))
            else:
                result.add_perf_data('process_memory', memory_stats['process_memory'])
                result.add_perf_data('gc_size', memory_stats['process_python_gc_items'])
            
            headers = (
                'index',
                'nb',
                'nb_percent',
                'size',
                'size_percent',
                'cumulative',
                'cumulative_percent',
                'item_type'
            )
            lines = []
            for by_items_info in memory_stats['by_items_info']:
                lines.append(
                    (
                        by_items_info['index'],
                        by_items_info['nb'],
                        by_items_info['nb_percent'],
                        '%s (%s o)' % (Utils.print_human_readable_size(int(by_items_info['size'])), by_items_info['size']),
                        by_items_info['size_percent'],
                        '%s (%s o)' % (Utils.print_human_readable_size(int(by_items_info['cumulative'])), by_items_info['cumulative']),
                        by_items_info['cumulative_percent'],
                        by_items_info['item_type']
                    )
                
                )
            
            by_type_info = HTMLTable.table(headers, lines, title='Top 19 by type memory consume')
            result.add_check(long_output=by_type_info)
        
        else:
            result.add_check(EXIT_STATUS.WARNING, 'guppy was not install expanded cannot be load')
    
    print result.exit()


if __name__ == '__main__':
    _main()
