#!/data/av2000/soap/soapenv/bin/python
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------
# mydogane.py
# modulo cidiemme per chiamate al webservice su dogane.cidiemme.net
# -----------------------------------------------------------------

import re, sys, os, datetime, time
import requests

base_url="http://dogane.av2000.cloud"

def errlog(msg):
   print >> sys.stderr,"%s - %s" % (datetime.datetime.now().ctime(), msg)

if __name__ == "__main__":
   from optparse import OptionParser
   usage = "usage: %prog [opt] argument"
   parser = OptionParser(usage=usage)
   parser.set_defaults(mode="query")
   parser.add_option("-U", "--username", dest="username", action="store",       type="string",   help="set the username for accessing the website [REQUIRED]")
   parser.add_option("-P", "--password", dest="password", action="store",       type="string",   help="set the password for accessing the website [REQUIRED]")
   parser.add_option("-q", "--query",    dest="mode",     action="store_const", const="query",   help="query ARC for given filecode (default)")
   parser.add_option("-u", "--upload",   dest="mode",     action="store_const", const="upload",  help="upload given file")
   parser.add_option("-r", "--receipt",  dest="mode",     action="store_const", const="receipt", help="receipt for a given ARC [DAA only]")
   parser.add_option("-p", "--pdf",      dest="mode",     action="store_const", const="pdf",     help="DAA PDF for a given ARC [DAA only]")
   parser.add_option("-s", "--status",   dest="mode",     action="store_const", const="status",  help="status for a given ARC [DAA only]")
   parser.add_option("-t", "--test",     dest="test",     action="store_true",  default=False,   help="use the test environment web site")
   (opt, args) = parser.parse_args()
   if (len(args) != 1):
      parser.error("an argument is required; try -h")
   if not opt.username or not opt.password:
      parser.error("-U username and -P password parameters are required; try -h")
   if opt.mode not in ['query', 'upload'] and opt.test:
      parser.error("funzioni DAA non disponibili in modalità di test")
   try:
      if opt.mode == 'upload':
         filename = args[0]
         errlog("Upload: file '%s'" % filename)
         if not os.path.isfile(filename):
            errlog("Upload: ERRORE: File non trovato '%s'" % filename)
            print "File da inviare non trovato '%s'" & filename
            sys.exit(1)
         try:
            file = {'filename': open(filename, 'rb')}
            results = requests.post(base_url + '/cgi-bin/upload_ead.py', files=file, data={'u':opt.username, 'p':opt.password, 'test':opt.test}).json()
            if not results.has_key('filecode'):
               errlog("Upload: nessun codice ricevuto")
               print "Upload: nessun codice ricevuto"
               sys.exit(1)
            codice = results['filecode']
         except Exception, e:
            errlog("Upload: ERRORE: '%s'" % e)
            print "Errore connessione internet"
            sys.exit(1)
         if not codice:
            errlog("Upload: ERRORE: codice file non trovato nell'esito delle dogane")
            print "Codice file non trovato"
            sys.exit(1)
         errlog("Upload: codice file ricevuto '%s'" % codice)
         print codice
      elif opt.mode == 'query':
         codice  = args[0]
         errlog("Query: codice file '%s'" % codice)
         results = requests.get(base_url + '/cgi-bin/query_filecode.py', params={'u':opt.username, 'p':opt.password, 'code':codice, 'test':opt.test}).json()
         if not results.has_key('arc'):
            errlog("Query: esito file '%s' non ricevuto" % codice)
            print "Query: esito file '%s' non ricevuto" % codice
            sys.exit(1)
         elif results['arc'] is None:
            errlog("Query: ricezione ARC fallita per file '%s'" % codice)
            print "Query: ricezione ARC fallita per file '%s'" % codice
            sys.exit(1)
         errlog("Query: codice ARC ricevuto '%s'" % results['arc'])
         print '%s|%s' % (codice, results['arc'])
      elif opt.mode == 'receipt':
         arc = args[0]
         errlog("Receipt: codice ARC '%s'" % arc)
         results = requests.get(base_url + '/cgi-bin/receipt_ead.py', params={'u':opt.username, 'p':opt.password, 'arc':arc}).json()
         if not results.has_key('esito') or not results.has_key('data'):
            errlog("Receipt: dettaglio ricezione per ARC '%s' non trovato" % arc)
            print "Receipt: dettaglio ricezione per ARC '%s' non trovato" % arc
            sys.exit(1)
         errlog("Receipt: dettaglio ricezione per ARC %s: '%s' '%s'" % (arc, results['data'], results['esito']))
         print "%s|%s|%s" % (arc, results['data'], results['esito'])
      elif opt.mode == 'status':
         arc = args[0]
         errlog("Status: codice ARC '%s'" % arc)
         results = requests.get(base_url + '/cgi-bin/status_ead.py', params={'u':opt.username, 'p':opt.password, 'arc':arc}).json()
         if not results.has_key('stato') or not results.has_key('data'):
            errlog("Status: dettaglio stato per ARC '%s' non trovato" % arc)
            print "Status: dettaglio stato per ARC '%s' non trovato" % arc
            sys.exit(1)
         errlog("Status: dettaglio stato per ARC %s: '%s' '%s'" % (arc, results['data'], results['stato']))
         print "%s|%s|%s" % (arc, results['data'], results['stato'])
      elif opt.mode == 'pdf':
         arc = args[0]
         errlog("PDF: codice ARC '%s'" % arc)
         results = requests.get(base_url + '/cgi-bin/download_pdf.py', params={'u':opt.username, 'p':opt.password, 'arc':arc})
         pdf = results.content
         if not len(pdf):
            errlog("PDF: ERRORE: stampa DAA per ARC '%s' non trovata" % codicearc)
            print "Stampa DAA per ARC '%s' non trovata" % codicearc
            sys.exit(1)
         print pdf
      else:
         parser.error("unsupported mode '%s'; try -h" % opt.mode)
   except SystemExit,e:
      raise e
   sys.exit(0)

