# Collection of code snippets by Arne Vajhøj 
# (from articles on eksperten.dk / vajhoej.dk written sometime between 2004 and now) 
import itertools

from java.math import BigDecimal
from java.util import ArrayList

from net.sf.jasperreports.engine import JasperCompileManager, JasperFillManager, JasperExportManager
from net.sf.jasperreports.engine.data import ListOfArrayDataSource

from dk.vajhoej.isam.map import PyIsamMap

import AutoMap
import OrdersISAM
import OrderLinesISAM
import Orders
import OrderLines

# read from index-sequential file
oisqmp = PyIsamMap.createIsamMapRMS("orders.isq", OrdersISAM)
olisqmp = PyIsamMap.createIsamMapRMS("orderlines.isq", OrderLinesISAM)
isamdata = ArrayList()
for oisam in oisqmp.values():
    for olisam in olisqmp.key(1).isInt(oisam.id).values():
        oisam.orderLinesT.add(olisam)
    isamdata.add(oisam)
# convert
mo = AutoMap(OrdersISAM, Orders, True)
mol = AutoMap(OrderLinesISAM, OrderLines, True)
data = ArrayList()
for oisam in isamdata:
    o = Orders()
    mo.convert(oisam, o)
    for olisam in oisam.orderLinesT:
        ol = OrderLines()
        mol.convert(olisam, ol)
        o.orderLines.add(ol)
    data.add(o)
# aggregate - tricky due to some issues:
#    * Jython classes are not Java bean classes so instead of
#      an AggData class with JRBeanCollectionDataSource we use
#      Object[] with ListOfArrayDataSource
#    * Jython does not support + operator for BigDecimal so instead of
#      Python sum builtin we use an explicit for loop and BigDecimal add
#      (also note that the groupby value list is readonce, so if we had used
#      two sums, then we would have had to create a copy of the value list)
def genrow(customer, orders):
    n = 0
    total = BigDecimal.ZERO
    for o in orders:
        n = n + 1
        total = total.add(o.totalPrice)
    return ArrayList([ customer, n, total]).toArray()
temp = [ genrow(k, v) for k, v in itertools.groupby(sorted(data, key=lambda o: o.customer), lambda o: o.customer) ]
adata = sorted(temp, key=lambda o: o[2].negate())
# generate PDF
rep = JasperCompileManager.compileReport('rep.jrxml')
prt = JasperFillManager.fillReport(rep, None, ListOfArrayDataSource(adata, [ "customer", "n", "total"]))
JasperExportManager.exportReportToPdfFile(prt, 'orders4.pdf')
#
print('isq2pdf done')
