#!/usr/bin/env python3

import argparse
import os
import sys

import p600syx

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Dump Prophet-600 presets.')
    parser.add_argument('-d', '--debug', action='store_true',
                        help='turn on debug output')
    parser.add_argument('-p', '--program', type=int, default=-1,
                        help='filter for program number')
    parser.add_argument('infile', nargs='?',
                        help='input sysex file')
    args = parser.parse_args()

    if args.infile:
        if not os.path.exists(args.infile):
            print(f'File {args.infile} not found, exiting')
            sys.exit(1)
        if args.debug:
            print('Reading from file {args.infile}', file=sys.stderr)
        with open(args.infile, 'rb') as f:
            data = f.read()
    else:
        if args.debug:
            print('Reading from stdin', file=sys.stderr)
        data = sys.stdin.buffer.read()

    # Split SysEx stream at the terminating 0xf7, drop empty messages
    msgs = [ msg for msg in data.split(b'\xf7') if len(msg) ]
    if args.debug:
        print(f'Found {len(msgs)} messages')

    for i, m in enumerate(msgs):
        parser = p600syx.factory.get_parser(m)
        if not parser:
            print(f'No suitable parser found for message {i}')
            continue
        if args.debug:
            print(f'Using {parser.name} for message {i}', file=sys.stderr)
        program, parameters, data = parser.decode(m)
        if args.program > -1 and program != args.program:
            continue
        print()
        print(f'{"Program number":30}: {program:5}')
        for name, value in parameters:
            if name.startswith('Patch Name') and value > 0:
                print(f'{name:30}: {value:5} {repr(chr(value))}')
            else:                
                print(f'{name:30}: {value:5}')

        if args.debug:
            print()
            print(f'Data length: {len(data)}', file=sys.stderr)
            print(data, file=sys.stderr)
            print(file=sys.stderr)
