#!/usr/bin/python

import sys
import os
import time
import getopt

import lastfm
import lastfm.marshaller

USAGE = """\
usage: lastcd [--stdout] [--debug] [--help]"""

if __name__ == '__main__':
    shortopts = 'sdh'
    longopts = [
        'stdout',
        'debug',
        'help',
        ]

    try:
        opts, args = getopt.getopt(sys.argv[1:], shortopts, longopts)
    except getopt.GetoptError, e:
        print >>sys.stderr, 'lastcd: %s' % e
        print >>sys.stderr, USAGE
        sys.exit(1)

    debug = False
    stdout = False

    for opt, arg in opts:
        if opt in ('--stdout', '-s'):
            stdout = True
        elif opt in ('--debug', '-d'):
            debug = True
        elif opt in ('--help', '-h'):
            print USAGE
            sys.exit(0)

    try:
        log = lastfm.logger('lastcd', debug=debug)
    except IOError, e:
        print >>sys.stderr, 'lastcd: error opening log: %s' % e
        sys.exit(1)

    songs = []
    for f in [file(name) for name in args] or [sys.stdin]:
        songs += lastfm.marshaller.load_documents(f)

    total_len = 0
    for s in songs:
        total_len += s['length']

    # We will simulate things as if the last track in our input just
    # finished playing right now.

    pos = time.time() - total_len

    subs = []
    for s in songs:
        l = s['length']
        if l:
            if l >= lastfm.MIN_LEN and l <= lastfm.MAX_LEN:
                date = pos + l / 2
                s['time'] = time.gmtime(pos)
                subs.append(s)
            pos = pos + l
        else:
            print >>sys.stderr, 'lastcd: track has zero length'
            sys.exit(1)

    if not subs:
        print >>sys.stderr, 'lastcd: no usable tracks found'
        sys.exit(1)

    if stdout:
        for s in subs:
            print lastfm.marshaller.dump(s)
    else:
        try:
            log.info('Sending %s song(s) to daemon' % len(subs))
            lastfm.submit(subs)
        except IOError, e:
            print >>sys.stderr, 'lastcd: error writing: %s' % e
