#! /usr/bin/env python3

"""
Usage:
    prefixspan-cli (frequent | top-k) <threshold> [options] [<file>]

    prefixspan-cli --help


Options:
    --minlen=<minlen>  Minimum length of patterns. [default: 1]
    --maxlen=<maxlen>  Maximum length of patterns. [default: 1000]

    --key=<key>        Custom key function for top-k algorithm. [default: ]
                       Must be a Python lambda function in form of "lambda patt, matches: ...".
"""

import sys
from functools import partial

from docopt import docopt

from prefixspan.api import PrefixSpan

print2 = partial(print, file=sys.stderr)

def checkArg(arg, cond):
    # type: (str, Callable[[int], bool]) -> int
    try:
        val = int(argv[arg])
        if not cond(val):
            raise ValueError
    except ValueError:
        print2("ERROR: Cannot parse {}.".format(arg))
        print2(__doc__)
        sys.exit(1)

    return val


if __name__ == "__main__":
    argv = docopt(__doc__)

    db = [
        [int(v) for v in line.rstrip().split(' ')]
        for line in (open(argv["<file>"]) if argv["<file>"] else sys.stdin)
    ]

    ps = PrefixSpan(db)

    if argv["frequent"]:
        threshold = checkArg("<threshold>", lambda v: 0 < v <= len(db))
        func = ps.frequent
    elif argv["top-k"]:
        threshold = checkArg("<threshold>", lambda v: v > 0)
        func = ps.topk

    if argv["--minlen"]:
        ps.minlen = checkArg("--minlen", lambda v: v > 0)
    if argv["--maxlen"]:
        ps.maxlen = checkArg("--maxlen", lambda v: v >= ps.minlen)

    if argv["--key"]:
        try:
            func = partial(ps.topk, key=eval(argv["--key"]))
        except:
            print2("ERROR: Cannot parse {}.".format("--key"))
            print2(__doc__)
            sys.exit(1)

    for freq, patt in func(threshold):
        print("{} : {}".format(' '.join(str(v) for v in patt), freq))
