from Chem import rdmol
from Chem.rdmol import Atom,Bond,Mol


def ParseAtomBlock(lines,mol,nAtoms):
  for i in range(nAtoms):
    line = lines[i]
    pX = float(line[0:10])
    pY = float(line[10:20])
    pZ = float(line[20:30])
    symb = line[31:34].strip()
    newAt = rdmol.Atom(symb)
    newAt.setPos(pX,pY,pZ)

    chg = int(line[36:39])
    if chg in [1,2,3,5,6,7]:
      newAt.setFormalCharge(4-chg);

    # parse valence

    # parse rxn component

    mol.addAtom(newAt)

bondMap = {1:Bond.SINGLE,2:Bond.DOUBLE,3:Bond.TRIPLE,4:Bond.AROMATIC}

def ParseBondBlock(lines,mol,nBonds):
  for i in range(nBonds):
    line = lines[i]
    id1 = int(line[0:3])-1
    id2 = int(line[3:6])-1
    order = int(line[6:9])
    order = bondMap.get(order,Bond.OTHER);
    b = Bond(order)
    b.setOwningMol(mol)
    b.setBeginAtomIdx(id1)
    b.setEndAtomIdx(id2)
    mol.addBond(b)

def ParseMolBlock(lines,mol):
  header = lines[0:3]
  counts = lines[3]
  nAtoms = int(counts[0:3])
  nBonds = int(counts[3:6])
  nLists = int(counts[6:9])
  chiralFlag = int(counts[12:15])
  nsText = int(counts[15:18])
  nRxnComponents = int(counts[18:21])
  nReactants = int(counts[21:24])
  nProducts = int(counts[24:27])
  nIntermediates = int(counts[27:30])

  ParseAtomBlock(lines[4:],mol,nAtoms)
  ParseBondBlock(lines[4+nAtoms:],mol,nBonds)
  

if __name__ == '__main__':
  import sys
  fName = sys.argv[1]
  inF = open(fName,'r')
  lines = inF.readlines()
  m = rdmol.Mol()
  ParseMolBlock(lines,m)

  print m.getNumAtoms()
  m.debugMol()

  print rdmol.MolToCDXML(m)
