from __future__ import print_function

from pymol.wizard import Wizard
from pymol import cmd
import pymol

class Annotation(Wizard):

    def get_event_mask(self):
        return Wizard.event_mask_scene+Wizard.event_mask_state+Wizard.event_mask_frame

    def do_scene(self):
        self.cmd.dirty_wizard()

    def do_frame(self,frame):
        self.cmd.dirty_wizard()

    def do_state(self,state):
        self.cmd.dirty_wizard()

    def get_prompt(self):
        prompt = []
        pymol = self.cmd._pymol
        if hasattr(pymol.session,'annotation'):
            anno_dict = pymol.session.annotation
            for obj in self.cmd.get_names('objects',1): # enabled objects
                state_dict = anno_dict.get(obj,{})
                state = self.cmd.get_state()
                anno_list = state_dict.get(state,[])
                prompt.extend(anno_list)
        return prompt

    def get_panel(self):
        return [
            [ 1, 'Annotation', '' ],
            [ 2, 'Dismiss', 'cmd.set_wizard()' ]
            ]

import copy
import re

from chempy.sdf import SDF

def load_annotated_sdf(filename, object=None, state=1, discrete=1, _self=cmd):
    pymol=_self._pymol
    cmd=_self

    # get object name from file prefix

    if object is None:
        object = re.sub(r"\.[sS][dD][fF]$","",filename)

    # open the SD file

    inp_sdf = SDF(filename)

    # create a persistent place to store the annotations

    if not hasattr(pymol.session,'annotation'):
        pymol.session.annotation = {}

    # create a state-indexed dictionary for this object

    state_dict = {}
    pymol.session.annotation[object] = state_dict

    while 1:

        # get next record

        sdf_rec = inp_sdf.read()

        # if at end of list, break out of loop
        if not sdf_rec: break

        # get the MOL portion of the record

        mol_list = sdf_rec.get('MOL')

        # load it into PyMOL

        cmd.read_molstr(''.join(mol_list),object,
                             state,finish=0,discrete=discrete)

        # populate with tuple containing ordered list of keys
        # and associated data dictionary

        anno_list = [ "\\955"+object ]
        for key in sdf_rec.kees:
            if (key!='MOL'):
                data = sdf_rec.data[key]
                print(key,data)
                anno_list.append("  \\595%s: \\559%s"%(
                    key,
                    ' '.join(map(str.strip, sdf_rec.data[key]))))
        state_dict[state] = anno_list

        # increment the state index

        state = state + 1

    if state > 1:
        cmd.zoom(object)
        cmd.finish_object(object)
