#!/usr/bin/env python

import argparse
import sys

import fitparse


def format_message(message, options):
    s = message.name
    if options.with_defs:
        s += ' [%s]' % message.type
    s += '\n'

    if message.type == 'data':
        for field_data in message:
            s += ' * %s: %s' % (field_data.name, field_data.value)
            if field_data.units:
                s += ' [%s]' % field_data.units
            s += '\n'

    return s


def parse_args(args=None):
    parser = argparse.ArgumentParser(
        description='Dump .FIT files to various formats',
        epilog='python-fitparse version %s' % fitparse.__version__,
    )
    parser.add_argument('-v', '--verbose', action='count', default=0)
    parser.add_argument(
        '-o', '--output', type=argparse.FileType(mode='wb'),
        help='File to output to.',
    )
    parser.add_argument(
        '-t', '--type', choices=('csv', 'excel', 'readable'), default='readable',
        help='File type to output. (DEFAULT: %(default)s)',
    )
    parser.add_argument(
        '-n', '--name', help='Message name (or number) to filter',
    )
    parser.add_argument(
        'infile', metavar='FITFILE', type=argparse.FileType(mode='rb'),
        help='Input .FIT file (Use - for stdin)',
    )

    options = parser.parse_args(args)

    if (options.type != 'readable') and not options.output:
        parser.error('Please specify an output file (-o) or set --type readable')

    options.with_defs = (options.verbose >= 1)
    options.print_messages = (options.type == 'readable')
    options.print_stream = (options.output or sys.stdout)

    if not options.print_messages and (options.verbose >= 1):
        options.print_messages = True
        options.print_stream = sys.stdout

    return options


def main(args=None):
    options = parse_args(args)

    fitfile = fitparse.FitFile(
        options.infile,
        data_processor=fitparse.StandardUnitsDataProcessor(),
    )
    messages = fitfile.get_messages(
        name=options.name,
        with_definitions=options.with_defs,
    )

    for n, message in enumerate(messages, 1):
        if options.print_messages:
            print >> options.print_stream, '%d. %s' % (
                n, format_message(message, options),
            )

if __name__ == '__main__':
    main()
