#!/usr/bin/perl
###########################################
# fittest
# Mike Schilli, 2013 (m@perlmeister.com)
###########################################
use warnings;
use strict;
use Garmin::FIT;
use YAML qw( DumpFile );

my( $file ) = @ARGV;
die "usage: $0 fit-file" if !defined $file;
( my $yaml_file = $file ) =~ s/.fit$/.yaml/i;

my $fit = Garmin::FIT->new();
$fit->file( $file );

my $messages = [];

$fit->data_message_callback_by_name( '', 
  sub { 
      my $msg = message( @_ );
      push @$messages, $msg if $msg;
      return 1;
  } );

$fit->open();
$fit->fetch_header();
1 while $fit->fetch();

print DumpFile( $yaml_file, $messages );

###########################################
sub message {
###########################################
  my ( $fit, $desc, $v ) = @_;

  if( !$desc->{ message_name } or
      $desc->{ message_name } ne
      "record" ) {
      return undef;
  }

  my $m = {};

  foreach my $i_name ( keys %$desc ) {

    next if $i_name !~ /^i_/;
    (my $name = $i_name ) =~ s/^i_//g;

    my $pname   = $name;
    my $attr    = $desc->{'a_' . $name};
    my $i       = $desc->{$i_name};
    my $invalid = $desc->{'I_' . $name};

    $m->{ $pname } = 
        $fit->value_cooked(
            "", $attr, "", $v->[$i] );
  }

  return $m;
}
