#!/usr/bin/env python

# Process a ros message collection, adding metadata to each
# entry based on a given python expression

import roslib
roslib.load_manifest('mongo_ros')
import argparse
import rospy
import mongo_ros.message_collection as mc
from mongo_ros import util
import sys


def main(argv=sys.argv):
    rospy.init_node('add_metadata')
    argv = rospy.myargv(argv)
    parser = argparse.ArgumentParser(description="""
    Add metadata to a message collection.  For example,
    'add_metadata my_db tf tf/tfMessage stamp m.transforms[0].header.stamp'
    would add a metadata field called 'stamp' to a collection of tf messages,
    that holds the timestamp of the first transform in each message.""")
    parser.add_argument('db_name', help="Name of db")
    parser.add_argument('collection_name', help="Name of collection within db")
    parser.add_argument('message_type',
                        help="Message type, e.g. 'std_msgs/String'")
    parser.add_argument('field', help="Name of metadata field")
    parser.add_argument('expr', help="Python expression to compute the"
                        " metadata, in which 'm' denotes the message")
    args = parser.parse_args(argv[1:])

    pkg, msg = args.message_type.split('/')
    cls = util.load_message_class(pkg, msg)
    coll = mc.MessageCollection(args.db_name, args.collection_name, cls,
                                indexes=[args.field])
    for m, meta in coll.query({}):
        val = eval(args.expr)
        coll.update(meta, metadata={args.field: val})
                                

if __name__=='__main__':
    sys.exit(main())
