#!/usr/bin/env python

# Copyright 2000 by Jeffrey Chang.  All rights reserved.
# This code is part of the Biopython distribution and governed by its
# license.  Please see the LICENSE file that should have been included
# as part of this package.

import sys
import getopt

from Bio.Medline import PubMed

DEFAULT_DELAY = 5

def print_usage():
    print """query_pubmed.py [-h] [-c] [-d delay] query

This script sends a query to PubMed* and prints the MEDLARS-
formatted results to the screen.

Arguments:
    -h           Print out this help message.
    -c           Count the hits, and don't print them out.
    -d delay     Set the delay between queries.  This script limits
                 the query rate to prevent saturating NCBI's bandwidth.
                 By default one query is sent every %g seconds.

* http://www.ncbi.nlm.nih.gov/PubMed/
""" % DEFAULT_DELAY

if __name__ == '__main__':
    try:
        optlist, args = getopt.getopt(sys.argv[1:], "hcd:")
    except getopt.error, x:
        print x
        sys.exit(0)
    if len(args) != 1:     # If they gave extraneous arguments,
        print_usage()      # print the instructions and quit.
        sys.exit(0)
    query = args[0]

    help = 0
    delay = DEFAULT_DELAY
    count_only = 0
    for opt, arg in optlist:
        if opt == '-h':
            help = 1
        elif opt == '-c':
            count_only = 1
        elif opt == '-d':
            try:
                delay = float(arg)
            except ValueError:
                print "Delay must be a floating point value"
                sys.exit(0)
            if delay < 0:
                print "Delay cannot be negative"
                sys.exit(0)
    if help:
        print_usage()
        sys.exit(0)

    print "Doing a PubMed search for %s..." % repr(query)
    
    ids = PubMed.search_for(query)
    print "Found %d citations" % len(ids)

    if count_only:
        sys.exit(0)

    pm = PubMed.Dictionary(delay=delay)
    for id in ids:
        try:
            print pm[id]
        except KeyError, x:
            print "Couldn't download %s, %s" % (id, x)
        sys.stdout.flush()
