#!/usr/bin/env python

import inspect
import re

from elkm1.const import MESSAGE_MAP
import elkm1.message

def main():
    """Create markdown doc with messages that have encoders/decoders"""
    no_plans_to_implement = {'ar', 'AR', 'at', 'AT',
        'ca', 'CA', 'cd', 'CD', 'ds', 'DS', 'DK', 'NS', 'NZ',
        'RE', 'rr', 'RR', 'rs', 'ua', 'UA', 'XB', 'xk'}

    # There is one "magic" encoder 'al' which is used to encode
    # messages a0-a8
    encoders = {'a0','a1','a2','a3','a4','a5','a6','a7','a8','a9','a:'}

    for fn_name, fn in inspect.getmembers(elkm1.message, inspect.isfunction):
        if not fn_name.endswith('_encode'):
            continue
        encoders.add(fn_name[0:2])

    decoders = set()
    for fn_name, fn in inspect.getmembers(elkm1.message, inspect.isfunction):
        if not re.match(r'_\w\w_decode', fn_name):
            continue
        decoders.add(fn_name[1:3].upper())

    message_codes = sorted(MESSAGE_MAP.keys(), key=lambda s: s.lower())

    messages_done = 0
    print('Msg | Status | Description')
    print('----|--------|------------')
    for msg_code in message_codes:
        if msg_code in encoders or msg_code in decoders:
            status = '✓' 
            messages_done += 1
        elif msg_code in no_plans_to_implement:
            status = '✗'
        else:
            status = ''
        print('{msg_code:4s}|   {status:5s}| {desc}'.format(
            msg_code=msg_code, status=status, desc=MESSAGE_MAP[msg_code]))

    done = messages_done + len(no_plans_to_implement)
    print('\n{d} of {t} messages implemented or no plans to implement'.format(
        d=done, t=len(message_codes)))
    print('Remaining {l} messages will be implemented based on most requested'
          .format(l=len(message_codes)-done))

if __name__ == '__main__':
    main()
