#!/usr/bin/env python

import csv
import os
import sys
import urllib2
import urlparse

import selenium.common.exceptions

import pysapweb.rfp
import pysapweb.sap_profiles

use_browser = False
use_browser = True

def get_profile():
    try:
        browser = pysapweb.sap_profiles.load_firefox()
        return browser
    except selenium.common.exceptions.WebDriverException as e:
        print e.msg
        raise

def to_bool(val):
    if val == 'True':
        return True
    elif val == 'False':
        return False
    else:
        raise ValueError("Expected True or False, got '%s'" % (val, ))

def read_rfp_info(line):
    id = int(line['id'])
    name = line['name']
    addr_fields = ('street', 'city', 'state', 'postal')
    address = [line['addr.'+f] for f in addr_fields] + ['US']
    item_fields = ('date', 'gl', 'co', 'amount', 'desc')
    line_item = [line['item.'+f] for f in item_fields]
    payee = (to_bool(line['payee.mit']), line['payee.name'])
    return id, name, address, line_item, payee

def download_doc(url, docs_dir):
    parsed_url = urlparse.urlparse(url)
    basename = os.path.basename(parsed_url.path)
    doc_fn = os.path.join(docs_dir, basename)
    doc_data = urllib2.urlopen(url).read()
    with open(doc_fn, 'w') as doc_fd:
        doc_fd.write(doc_data)
    return doc_fn

def create_rfps(fd, docs_dir):
    reader = csv.DictReader(fd)
    if use_browser:
        browser = get_profile()
    created = []
    for line in reader:
        id, name, address, line_item, payee = read_rfp_info(line)
        doc_url = line['documentation']
        doc_path = download_doc(doc_url, docs_dir)
        args = dict(
            name=name,
            payee=payee,
            line_items=(line_item, ),
            receipts=(doc_path, ),
        )
        if not payee[0]:
            args['address'] = address
        if use_browser:
            rfp = pysapweb.rfp.create(browser, **args)
        else:
            rfp = 123456
        print "Created voucher %d -> RFP %s" % (id, rfp)
        line['rfp_number'] = rfp
        created.append(line)
    return created

def create_test_rfp():
    browser = get_profile()
    address = ('69 School St', 'Cambridge', 'MA', '02139', 'US')
    line_items = (
        ('1/1/2014', '421000', '2720842', '12.50', 'test meeting food'),
    )
    rfp = pysapweb.rfp.create(browser,
        name='test RFP',
        payee=(False, 'Alex Dehnert'),
        address=address,
        line_items=line_items,
    )
    print "Created RFP %s" % (rfp, )

if __name__ == '__main__':
    create_rfps(sys.stdin)
