
"""This script is for generating, examining and playing with sequences
using the available filters and modifiers. It doesn't generate phrases,
play or print scores"""

import sys, readline
from argparse import ArgumentParser
from .inphuncs import itertree

def optparser(optlist):
    """Display options"""
    parser = ArgumentParser(description = __doc__)
    parser.add_argument("-s", "--step", action="store_true",
        help="Show sequences as intervals.")
    parser.add_argument("-n", "--number-lines", action="store_true",
        help="Number lines")
    parser.add_argument("-g", "--graph", action="store_true",
        help="Display as simple graphs")
    parser.add_argument("-z", "--Z",  action="store_true",
        help="Display Z-vector of each sequence")
    parser.add_argument("-i", "--inversions", action="store_true",
        help="Show each sequence's inversion.")
    parser.add_argument("-r", "--relatives", action="store_true" ,
        help="Append groups of Z-related sequences to the output")

    return parser.parse_args(optlist)

   
def z_relatives(relatives_set):
    """Print sequences grouped by Z-vector"""
    msg = ['\n\nZ-related sets:\n\n']
    relatives_list = sorted(relatives_set)
    group = [relatives_list[0]]
    for pair in relatives_list:
        if pair[0] == group[0][0]:
            group.append(pair)
        else:
            msg.extend([str(group[0][0]), '\n\n'])
            msg.extend([str(member[1]) + '\n' for member in group])
            msg.append('\n\n')
            print(''.join(msg))
            msg = []
            group = [pair]
        
def run():
    """Produce sequences"""
    options = optparser(sys.argv[1:])
    while 1:
        seqargs = input("\n    Enter sequence options, " +
                        "h for help or q to quit\n\n")
        if seqargs == 'q':
            return
        print ('\n')
        counter = 1
        rel_set = set()
        try:
            tree = itertree(seqargs + ' mortal', root=False)
        except SystemExit:
            continue
        for seq in tree:
            msg = []
            if options.number_lines:
                msg.extend([str(counter), ":"])
                counter += 1
            if options.graph:
                seq.sort()
                for i in range(seq[0], seq[-1] + 1):
                    msg.append(str(i) if i in seq else '_')
            else:
                if options.step:
                    msg.append(str(seq.all_steps()))
                else:
                    msg.append(str(seq))
                if options.inversions:
                    msg.append(" ")
                    if options.step:
                        msg.append(str(seq.inverted().all_steps()))
                    else:
                        msg.append(str(seq.inverted()))            
                if options.Z:
                    msg.extend([" ", str(seq.vector)])
                if options.relatives:
                    rel_set.add((seq.vector, seq))
            print(''.join(msg))
        if rel_set:
            z_relatives(rel_set)

