#!/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",
        "rs",
        "XB",
        "xk",
    }

    # There is one "magic" encoder 'al' which is used to encode messages a0-a8
    # Mark them all as implemented.
    encoders = {"a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a:"}
    for fn_name, _ 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, _ in inspect.getmembers(elkm1_lib.message, inspect.isfunction):
        if not re.match(r"\w\w_decode", fn_name):
            continue
        decoders.add(fn_name[0:2].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:
            if msg_code in no_plans_to_implement:
                status = "?"
            else:
                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)
    count = len(message_codes)
    print(f"\n{done} of {count} messages implemented or no plans to implement")
    print(f"Remaining {count-done} messages will be implemented based on most requested")


if __name__ == "__main__":
    main()
