#!/usr/bin/env python

import csv
import datetime
import os.path

from mechanize import Browser

import downloader
import sapweb

class RfpDownloader(object):
    def __init__(self, br=None):
        if not br:
            br = Browser()
        self.br = br
        self._make_dirs()
        self.csrftoken = None

    def _make_dirs(self, ):
        label = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M')
        basepath = os.path.dirname(downloader.pathtpl)
        self.dirname = os.path.join(basepath, label+"-rfps")
        self.docs_dir = os.path.join(self.dirname, 'docs')
        os.makedirs(self.docs_dir) # makes all parents, so dirname too

    def getRfpsCsv(self, ):
        self.br.open(downloader.baseurl + 'vouchers/generate/rfps.csv')
        if self.br.viewing_html():
            print self.br.response().get_data()
            assert not self.br.viewing_html()
        downloaded_rfps_name = os.path.join(self.dirname, "inbound.csv")
        data = self.br.response().get_data()
        with open(downloaded_rfps_name, 'w') as fd:
            fd.write(data)
        return downloaded_rfps_name

    def _manage_csrf(self, ):
        if self.csrftoken: return
        cookiejar = self.br._ua_handlers["_cookies"].cookiejar
        for cookie in cookiejar:
            if cookie.name == 'csrftoken':
                assert self.csrftoken == None
                self.csrftoken = cookie.value
        self.br.addheaders.append(('X-CSRFToken', self.csrftoken))

    def putRfpsCsv(self, results):
        upload_name = os.path.join(self.dirname, "outbound.csv")
        with open(upload_name, 'w') as fd:
            writer = csv.DictWriter(fd, ['id', 'rfp_number'], extrasaction='ignore')
            writer.writeheader()
            for result in results:
                writer.writerow(result)
        with open(upload_name, 'r') as fd:
            data = fd.read()
            self._manage_csrf()
            self.br.open(downloader.baseurl + 'vouchers/generate/rfps.csv', data)
            print self.br.response().get_data()
            assert not self.br.viewing_html()

    def process(self):
        downloader.login2Admin(self.br)
        rfp_name = self.getRfpsCsv()
        with open(rfp_name, 'r') as rfps:
            created = sapweb.create_rfps(rfps, self.docs_dir)
        self.putRfpsCsv(created)

if __name__ == '__main__':
    d = RfpDownloader()
    d.process()
