#!/usr/bin/python -u
# SPDX-License-Identifier: AGPL-3.0-only

from collections import defaultdict
from datetime import datetime

import kopano
from MAPI.Tags import PR_EC_STATSTABLE_SYSTEM, PR_DISPLAY_NAME_W, PR_EC_STATS_SYSTEM_VALUE, PR_EC_STATS_SYSTEM_DESCRIPTION

"""

provides an easy-to read overview of the kopano-server cache statistics,
as compared to the more low-level "kopano-stats --system"

"""

options, _ = kopano.parser('ksp').parse_args()
server = kopano.Server(options=options, auth_user='SYSTEM', auth_pass='')
# XXX: When python-kopano supports sorting, simplify the loop by sorting on display_name in descending order.
table = server.table(PR_EC_STATSTABLE_SYSTEM, columns=[PR_DISPLAY_NAME_W, PR_EC_STATS_SYSTEM_VALUE, PR_EC_STATS_SYSTEM_DESCRIPTION])

cstat = defaultdict(dict)
for row in table.rows():
    name, value, _ = row
    name = name.value
    value = value.value

    if name == 'server_start_date':
        serverstarttime = value

    # Skip non cache items
    if not name.startswith('cache_'):
        continue

    if name.endswith('_hit'):
        name = name[6:-4]
        cstat[name]['hits'] = int(value)
    if name.endswith('_req'):
        name = name[6:-4]
        cstat[name]['requests'] = int(value)
    if name.endswith('_size'):
        name = name[6:-5]
        cstat[name]['size'] = int(value)
    if name.endswith('_maxsz'):
        name = name[6:-6]
        cstat[name]['maxsz'] = int(value)

print('Kopano Cache Statistics')
print('  Server start time: %s' % ( serverstarttime ))
print('  Current time     : %s' % ( datetime.now().strftime('%c') ))
print('')
print('%10s %24s         %24s' % ('Cache', 'Hit ratio', 'Mem usage ratio'))

for name, data in cstat.items():
    if data['requests']:
        percentage = '%d%%' % (data['hits'] * 100 / data['requests'])
    else:
        percentage = 'N/A'

    if data['maxsz']:
        persize = '%d%%' % (data['size'] * 100 / data['maxsz'])
    else:
        persize = 'N/A'

    print('%10s (%12d/%12d) (%3s)   (%12d/%12d) (%3s)' % (name, data['hits'], data['requests'], percentage, data['size'], data['maxsz'], persize))
