mport sys, string, os, tempfile

from gnue.common.apps.GClientApp import GClientApp
from gnue.common.utils.TextUtils import dollarToText, comify
from gnue.common.datasources.GDataSource import DataSourceWrapper
from mx.DateTime import *

VERSION = "0.0.1"

#
# Check definition
#
DOCUMENT_OFFSET = (0,792)
CHECK_OFFSET = (0,-252)
CHECKS_PER_SHEET = 3
OFFSETS = {
   'CheckDate': (512, -74),
   'Control': (27,-22),
   'Payee': (87, -107),
   'PayeeAddress': (87, -150),
   'AmountText': (54, -130),
   'Amount': (506, -110),
   'Memo': (36, -217),
  }
REPEAT_PAYEE_IN_ADDRESS = 1
FONT_SIZE = 11
FONT = 'Helvetica'

#
# Datasource stuff
#

CONNECTION = 'market'


#
# Main code
#

line_spacing = -FONT_SIZE * 1.1

def run(connections, first_check=10055, missing_checks=0, printer='hp0'):

  check_index = CHECKS_PER_SHEET
  first_page = 1

  check_no = first_check

  #destname = tempfile.mktemp('.ps')
  destname="checks.ps"
  dest = open(destname,"w")
  dest.write(PS_Header)

  datasource = DataSourceWrapper(connections,
                   fields=('check_no','check_date','payee',
                           'address1','address2','address3',
                           'address4','memo','amount',
                           'print_flag'),
                   attributes={'connection': CONNECTION,
                               'name': 'dtsChecks',
                               'table': 'checks',
                               'order_by': 'vendor,id' } )

  check_date = DateTime(*datasource.triggerExtensions.getTimeStamp().tuple()[:3])

  resultset = datasource.createResultSet(conditions={'print_flag': 'Q'})

  for rec in resultset:

    # Set fields
    rec['print_flag'] = 'Y'
    rec['check_date'] = check_date
    rec['check_no'] = check_no

    print "Check index: %s" % check_index

    if check_index + 1 > CHECKS_PER_SHEET - missing_checks:
      if not first_page:
        dest.write(PS_Page_Footer)
      first_page = 0
      dest.write(PS_Page_Header)
      setFont(dest, FONT, FONT_SIZE)
      check_index = 0
      missing_checks = 0
      cx, cy = DOCUMENT_OFFSET
      print "Resetting"
    else:
      x, y = CHECK_OFFSET
      cx += x
      cy += y



    # Print simple fields
    printAt(dest, rec['check_no'], *(OFFSETS['Control'] + (cx,cy)))
    printAt(dest, rec['check_date'].strftime('%b %d, %Y'), *(OFFSETS['CheckDate'] + (cx,cy)))
    printAt(dest, rec['memo'], *(OFFSETS['Memo'] + (cx,cy)))
    printAt(dest, rec['payee'], *(OFFSETS['Payee'] + (cx,cy)))
    printAt(dest, '**%s**' % comify(rec['amount'],2), *(OFFSETS['Amount'] + (cx,cy)))
    printAt(dest, '*** ' + dollarToText(rec['amount']) + ' ***', *(OFFSETS['AmountText'] + (cx,cy)))

    # Print address
    if rec['address1']:
      add = rec['payee'] + "\n" + rec['address1']
      for addy in ('address2','address3','address4'):
        if rec[addy]:
          add += '\n' + rec[addy]
      printAt(dest, add, *(OFFSETS['PayeeAddress'] + (cx,cy)))

    check_no += 1
    check_index += 1

  dest.write(PS_Page_Footer)
  dest.write(PS_Footer)

  resultset.post()
  resultset._dataObject.commit()
  dest.close()
##  os.system("lpr -h -P %s %s; rm -f %s" % (sys.argv[2], destname, destname))


class Runner(GClientApp):
  def run(self):
   run(self.connections)


#
# Set the font information
#
def setFont(dest, font, size):
  dest.write ('/%s findfont %s scalefont setfont\n' % (font, size))


def sanitize(value):
  return str(value).replace('(',"\\(").replace(')','\\)')

def printAt(dest, text, x, y, offx=0, offy=0):
  for text in str(text).split('\n'):
    dest.write ('%s %s moveto (%s) show\n' % (
          x + offx, y+offy, sanitize(text)))
    y += line_spacing




PS_Header = """%!PS-Adobe-3.0
%%Creator: Old Towne Market Reporting Framework
%%BoundingBox: 0 0 612 792
%%LanguageLevel: 2
%%Orientation: Portrait
%%EndComments
%%BeginProlog
%%EndProlog
%%BeginSetup
initgraphics
%%EndSetup
"""




PS_Footer = """
%%Trailer
erasepage
initgraphics
%%EOF
"""

PS_Page_Header = """
%%Page: 1 1
gsave
"""

PS_Page_Footer = """
grestore
showpage
"""

if __name__ == '__main__':
  Runner().run()


