def get_message(argv: list[str]) -> str:
    """check arguments and return string"""

    # https://docs.python.org/3.10/reference/simple_stmts.html?highlight=assert#the-assert-statement
    assert len(argv) < 3, "too much arguments"

    if len(argv) == 2:
        return argv[1]

    # stdin https://docs.python.org/3/library/sys.html#sys.stdin
    print("What is the text to count?")
    msg = sys.stdin.readline()
    return msg


def main(argv: list[str]):
    """displays stats on string"""

    try:
        msg = get_message(argv)
    except AssertionError as err:
        print("AssertionError:", err)
        return


    char_count = len(msg)
    print("The text contains", char_count,"characters:")

    # filter() https://docs.python.org/3.10/library/functions.html#filter
    upper_count = len(list(filter(str.isupper, msg)))
    print(upper_count, "upper letters")

    # generator expressions https://docs.python.org/3.10/reference/expressions.html#generator-expressions
    lower_count = sum(1 for char in msg if char.islower())
    print(lower_count, "lower letters")

    # in https://docs.python.org/3/reference/expressions.html#in
    punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
    punctuation_count = sum(1 for char in msg if char in punctuation)
    print(punctuation_count, "punctuation marks")

    # array.count() https://docs.python.org/3.10/library/array.html?highlight=count#array.array.count
    space_count = msg.count(" ") + msg.count("\n")
    print(space_count, "spaces")

    # list comprehension https://docs.python.org/3.10/tutorial/datastructures.html#list-comprehensions
    digits_count = len([char for char in msg if char.isdigit()])
    print(digits_count, "digits")


if __name__ == "__main__":
    import sys
    main(sys.argv)
