"""
LOVE

From: BASIC Computer Games (1978)
      Edited by David H. Ahl

"This program is designed to reproduce Robert Indiana's great art
 work 'Love' with a message of your choice up to 60 characters long.

"The [DATA variable is] an alternating count of the number
 of characters and blanks which form the design.  These data give
 the correct proportions for a standard 10 character per inch
 Teletype or line printer.

"The LOVE program was created by David Ahl."


Python port by Jeff Jetton, 2019
"""


# Image data. Each top-level element is a row. Each row element
# contains alternating character and blank run lengths.
DATA = [
    [
        60,
    ],
    [1, 12, 26, 9, 12],
    [3, 8, 24, 17, 8],
    [4, 6, 23, 21, 6],
    [4, 6, 22, 12, 5, 6, 5],
    [4, 6, 21, 11, 8, 6, 4],
    [4, 6, 21, 10, 10, 5, 4],
    [4, 6, 21, 9, 11, 5, 4],
    [4, 6, 21, 8, 11, 6, 4],
    [4, 6, 21, 7, 11, 7, 4],
    [4, 6, 21, 6, 11, 8, 4],
    [4, 6, 19, 1, 1, 5, 11, 9, 4],
    [4, 6, 19, 1, 1, 5, 10, 10, 4],
    [4, 6, 18, 2, 1, 6, 8, 11, 4],
    [4, 6, 17, 3, 1, 7, 5, 13, 4],
    [4, 6, 15, 5, 2, 23, 5],
    [1, 29, 5, 17, 8],
    [1, 29, 9, 9, 12],
    [1, 13, 5, 40, 1],
    [1, 13, 5, 40, 1],
    [4, 6, 13, 3, 10, 6, 12, 5, 1],
    [5, 6, 11, 3, 11, 6, 14, 3, 1],
    [5, 6, 11, 3, 11, 6, 15, 2, 1],
    [6, 6, 9, 3, 12, 6, 16, 1, 1],
    [6, 6, 9, 3, 12, 6, 7, 1, 10],
    [7, 6, 7, 3, 13, 6, 6, 2, 10],
    [7, 6, 7, 3, 13, 14, 10],
    [8, 6, 5, 3, 14, 6, 6, 2, 10],
    [8, 6, 5, 3, 14, 6, 7, 1, 10],
    [9, 6, 3, 3, 15, 6, 16, 1, 1],
    [9, 6, 3, 3, 15, 6, 15, 2, 1],
    [10, 6, 1, 3, 16, 6, 14, 3, 1],
    [10, 10, 16, 6, 12, 5, 1],
    [11, 8, 13, 27, 1],
    [11, 8, 13, 27, 1],
    [
        60,
    ],
]


# Assume that the total length of the first element
# is the line length used by every row
ROW_LEN = sum(DATA[0])


def main() -> None:
    # Display intro text
    print("\n                  Love")
    print("Creative Computing  Morristown, New Jersey")
    print("\n\n")
    print("A tribute to the great American artist, Robert Indiana.")
    print("His great work will be reproduced with a message of")
    print("your choice up to 60 characters.  If you can't think of")
    print("a message, simple type the word 'love'\n")  # (sic)

    # Get message from user
    message = input("Your message, please? ")
    if message == "":
        message = "LOVE"

    # Repeat the message until we get at least one line's worth
    while len(message) < ROW_LEN:
        message += message

    # Display image
    print("\n" * 9)
    for row in DATA:
        print_message = True
        position = 0
        line_text = ""
        for length in row:
            if print_message:
                text = message[position : (position + length)]
                print_message = False
            else:
                text = " " * length
                print_message = True
            line_text += text
            position += length
        print(line_text)

    print()


if __name__ == "__main__":
    main()


######################################################################
#
# Porting Notes
#
#   Not too different from the original, logic-wise. The image was
#   originally encoded as a series of BASIC "DATA" lines. Here,
#   we've converted it to a more Pythonic nested list structure.
#   Other changes include reducing some of the vertical spacing
#   (since we'll probably be showing this on a screen rather than
#   the sort of tractor-feed printer the program was written for)
#   and having the message default to LOVE when no input is given.
#
#   This program uses a simple version of run-length encoding to
#   compress a 60 x 36 image (2,160 characters) into just 252 DATA
#   values.  That's about an 8.5-to-1 data compression ratio,
#   which is pretty good!
#
#
# Ideas for Modifications
#
#   Process the user's message input to remove spaces and change
#   to uppercase.
#
#   Encode other images in a similar fashion and let the user choose
#   which one they'd like to use to display their message.
#
#   To help with the above step, create a program that reads in a
#   text file of any sort of similar character/space art and produces
#   the Python code to initialize the correct nested list of values.
#
#   For example, if the input file were:
#
#     *****
#     *  **
#     **  *
#
#   Your program would output:
#
#    ((5, ), (1, 1, 2), (2, 1, 1))
#
######################################################################
