#!/usr/bin/env python

import inspect
import re

import elkm1_lib.message
from elkm1_lib.const import MESSAGE_MAP


def main():
    """Create markdown doc with messages that have encoders/decoders"""
    no_plans_to_implement = {
        "AP",
        "ar",
        "AR",
        "at",
        "AT",
        "ca",
        "CA",
        "cd",
        "CD",
        "ds",
        "DS",
        "DK",
        "ip",
        "IP",
        "ir",
        "IR",
        "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_lib.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_lib.message.MessageDecode, 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()
