#!/usr/bin/env python3

import sys
from datetime import datetime
from lark import Lark, Transformer
import regex

class TreeToPythonData(Transformer):
    books = list
    book = dict
    def purchased(self, children):
        return ('purchased', datetime.strptime(children[0], '%d %B %Y').date())
    def __default__(self, rulename, children, meta):
        # FIXME Should probably check there's only one child, which should be a token, not a tree.
        return (rulename, str(children[0]))

def main():
    grammar = """
        %import common.NEWLINE
        %ignore NEWLINE
        _DOTS: /^.*\.\.\.$/
        _READ: /^READ$/
        _UPDATE: /^Update Available$/
        title: /^.+(?= $)/
        author: /^.*\D(?=\d?\d \w+ \d{4}$)/
        purchased: /\d?\d \w+ \d{4}$/
        _COLLECTIONS: /^\d+$/
        book: _DOTS title " " _READ? _UPDATE? author purchased _COLLECTIONS
        books: book*
    """

    parser = Lark(grammar, start='books', regex=True, g_regex_flags=regex.MULTILINE|regex.UNICODE)
    tree = parser.parse(sys.stdin.read())
    #print(tree.pretty())
    books = TreeToPythonData(visit_tokens=False).transform(tree)
    for book in books:
        print(f'{book["title"]}\t{book["author"]}\t{book["purchased"]}')
    
if __name__ == "__main__":
    main()

