package org.biojava.nbio.structure.io.mmcif;

import org.biojava.nbio.structure.io.FileParsingParameters;
import org.biojava.nbio.structure.io.mmcif.chem.MetalBondDistance;
import org.biojava.nbio.structure.io.mmcif.model.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by andreas on 6/9/16.
 */
public class MetalBondConsumer implements MMcifConsumer{


    Map<String,List<MetalBondDistance>> definitions = new HashMap();

    @Override
    public void documentStart() {
        definitions.clear();
    }

    @Override
    public void documentEnd() {

        // minimize memory consumption

        for  (List<MetalBondDistance> d : definitions.values()){
            ArrayList<MetalBondDistance> a = (ArrayList)d;

            a.trimToSize();
        }

    }

    @Override
    public void newAtomSite(AtomSite atom) {

    }

    @Override
    public void newEntity(Entity entity) {

    }

    @Override
    public void newEntityPoly(EntityPoly entityPoly) {

    }

    @Override
    public void newEntityPolySeq(EntityPolySeq epolseq) {

    }

    @Override
    public void newStructAsym(StructAsym sasym) {

    }

    @Override
    public void setStruct(Struct struct) {

    }

    @Override
    public void newDatabasePDBrev(DatabasePDBrev dbrev) {

    }

    @Override
    public void newDatabasePDBrevRecord(DatabasePdbrevRecord dbrev) {

    }

    @Override
    public void newDatabasePDBremark(DatabasePDBremark remark) {

    }

    @Override
    public void newExptl(Exptl exptl) {

    }

    @Override
    public void newCell(Cell cell) {

    }

    @Override
    public void newSymmetry(Symmetry symmetry) {

    }

    @Override
    public void newStructNcsOper(StructNcsOper sNcsOper) {

    }

    @Override
    public void newStructRef(StructRef sref) {

    }

    @Override
    public void newStructRefSeq(StructRefSeq sref) {

    }

    @Override
    public void newStructRefSeqDif(StructRefSeqDif sref) {

    }

    @Override
    public void newStructSite(StructSite sref) {

    }

    @Override
    public void newStructSiteGen(StructSiteGen sref) {

    }

    @Override
    public void newPdbxPolySeqScheme(PdbxPolySeqScheme ppss) {

    }

    @Override
    public void newPdbxNonPolyScheme(PdbxNonPolyScheme ppss) {

    }

    @Override
    public void newPdbxEntityNonPoly(PdbxEntityNonPoly pen) {

    }

    @Override
    public void newStructKeywords(StructKeywords kw) {

    }

    @Override
    public void newRefine(Refine r) {

    }

    @Override
    public void newChemComp(ChemComp c) {

    }

    @Override
    public void newChemCompDescriptor(ChemCompDescriptor ccd) {

    }

    @Override
    public void newPdbxStructOperList(PdbxStructOperList structOper) {

    }

    @Override
    public void newPdbxStrucAssembly(PdbxStructAssembly strucAssembly) {

    }

    @Override
    public void newPdbxStrucAssemblyGen(PdbxStructAssemblyGen strucAssembly) {

    }

    @Override
    public void newChemCompAtom(ChemCompAtom atom) {

    }

    @Override
    public void newPdbxChemCompIndentifier(PdbxChemCompIdentifier id) {

    }

    @Override
    public void newChemCompBond(ChemCompBond bond) {

    }

    @Override
    public void newPdbxChemCompDescriptor(PdbxChemCompDescriptor desc) {

    }

    @Override
    public void newEntitySrcGen(EntitySrcGen entitySrcGen) {

    }

    @Override
    public void newEntitySrcNat(EntitySrcNat entitySrcNat) {

    }

    @Override
    public void newEntitySrcSyn(EntitySrcSyn entitySrcSyn) {

    }

    @Override
    public void newStructConn(StructConn structConn) {

    }

    @Override
    public void newAuditAuthor(AuditAuthor aa) {

    }

    @Override
    public void newGenericData(String category, List<String> loopFields, List<String> lineData) {

        MetalBondDistance d = new MetalBondDistance();

        d.setAtomType1(lineData.get(0));
        d.setAtomType2(lineData.get(1));
        d.setLowerLimit(Float.parseFloat(lineData.get(2)));
        d.setUpperLimit(Float.parseFloat(lineData.get(3)));

        List<MetalBondDistance> defs = definitions.get(d.getAtomType1());

        if ( defs == null){
            defs = new ArrayList<>();
            definitions.put(d.getAtomType1(),defs);
        }

        defs.add(d);

    }

    @Override
    public void setFileParsingParameters(FileParsingParameters params) {

    }

    @Override
    public FileParsingParameters getFileParsingParameters() {
        return null;
    }

    public Map<String,List<MetalBondDistance>> getDefinitions(){
        return definitions;
    }
}
