#!/usr/bin/env python
# (C) 2017 OpenEye Scientific Software Inc. All rights reserved.
#
# TERMS FOR USE OF SAMPLE CODE The software below ("Sample Code") is
# provided to current licensees or subscribers of OpenEye products or
# SaaS offerings (each a "Customer").
# Customer is hereby permitted to use, copy, and modify the Sample Code,
# subject to these terms. OpenEye claims no rights to Customer's
# modifications. Modification of Sample Code is at Customer's sole and
# exclusive risk. Sample Code may require Customer to have a then
# current license or subscription to the applicable OpenEye offering.
# THE SAMPLE CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED.  OPENEYE DISCLAIMS ALL WARRANTIES, INCLUDING, BUT
# NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# PARTICULAR PURPOSE AND NONINFRINGEMENT. In no event shall OpenEye be
# liable for any damages or liability in connection with the Sample Code
# or its use.

# @ <SNIPPET-IMAGE-TABLE>
from openeye import oechem
from openeye import oedepict

smiles = ["c1ccccc1 benzene", "c1cccnc1 pyridine", "c1cncnc1 pyrimidine"]

imagewidth, imageheight = 350, 250
image = oedepict.OEImage(imagewidth, imageheight)

mainrows, maincols = 3, 2
maintableopts = oedepict.OEImageTableOptions(mainrows, maincols, oedepict.OEImageTableStyle_NoStyle)
maintableopts.SetHeader(False)
maintableopts.SetColumnWidths([10, 20])
maintable = oedepict.OEImageTable(image, maintableopts)

datarows, datacols = 4, 2
datatableopts = oedepict.OEImageTableOptions(datarows, datacols,
                                             oedepict.OEImageTableStyle_LightGreen)
datatableopts.SetStubColumn(True)
datatableopts.SetMargins(5.0)
datatableopts.SetColumnWidths([10, 20])

for r in range(min(len(smiles), maintable.NumRows())):
    # depict molecule in first column
    cell = maintable.GetBodyCell(r + 1, 1)

    opts = oedepict.OE2DMolDisplayOptions(cell.GetWidth(), cell.GetHeight(),
                                          oedepict.OEScale_AutoScale)
    opts.SetTitleLocation(oedepict.OETitleLocation_Hidden)

    mol = oechem.OEGraphMol()
    oechem.OESmilesToMol(mol, smiles[r])
    oedepict.OEPrepareDepiction(mol)

    disp = oedepict.OE2DMolDisplay(mol, opts)
    oedepict.OERenderMolecule(cell, disp)

    # depicting data in table
    cell = maintable.GetBodyCell(r + 1, 2)

    table = oedepict.OEImageTable(cell, datatableopts)

    table.DrawText(table.GetHeaderCell(1, False), "Property")
    table.DrawText(table.GetHeaderCell(1), "Value")

    table.DrawText(table.GetStubColumnCell(1), "Name")
    table.DrawText(table.GetBodyCell(1, 1), mol.GetTitle())

    table.DrawText(table.GetStubColumnCell(2), "SMILES")
    table.DrawText(table.GetBodyCell(2, 1), oechem.OEMolToSmiles(mol))

    table.DrawText(table.GetStubColumnCell(3), "MV")
    table.DrawText(table.GetBodyCell(3, 1), "%.3f" % oechem.OECalculateMolecularWeight(mol))

oedepict.OEWriteImage("ImageTable.png", image)
# @ </SNIPPET-IMAGE-TABLE>
oedepict.OEWriteImage("ImageTable.pdf", image)
