package org.openscience.cdk.modeling.builder3d;

import java.util.List;
import java.util.Map;

/**
 * Set the right atoms order to get the parameters.
 *
 * @author         chhoppe
 * @cdk.created    2004-10-8
 * @cdk.module     forcefield
 * @cdk.githash
 */
public class MMFF94ParametersCall {

    private Map<String, List> pSet = null;

    //private final static double DEFAULT_BOND_LENGTH = 1.5;
    //private final static double DEFAULT_ANGLE = 90;			// Only to test
    //private final static double DEFAULT_TORSION_ANGLE = 90;

    public MMFF94ParametersCall() {}

    /**
     * Initialize the AtomOrder class.
     *
     * @param  parameterSet  Force Field parameter as Map
     */
    public void initialize(Map<String, List> parameterSet) {
        pSet = parameterSet;
    }

    /**
     *  Gets the bond parameter set.
     *
     * @param  id1            atom1 id
     * @param  id2            atom2 id
     * @return                The distance value from the force field parameter set
     * @exception  Exception  Description of the Exception
     */
    public List getBondData(String code, String id1, String id2) throws Exception {
        String dkey = "";
        if (pSet.containsKey(("bond" + code + ";" + id1 + ";" + id2))) {
            dkey = "bond" + code + ";" + id1 + ";" + id2;
        } else if (pSet.containsKey(("bond" + code + ";" + id2 + ";" + id1))) {
            dkey = "bond" + code + ";" + id2 + ";" + id1;
        } /*
           * else { System.out.println("KEYError:Unknown distance key in pSet: "
           * + code + ";" + id2 + " ;" + id1+" take default bon length:" +
           * DEFAULT_BOND_LENGTH); return DEFAULT_BOND_LENGTH; }
           */
        //logger.debug("dkey = " + dkey);
        return (List) pSet.get(dkey);
    }

    /**
     *  Gets the angle parameter set.
     *
     * @param  id1            ID from Atom 1.
     * @param  id2            ID from Atom 2.
     * @param  id3            ID from Atom 3.
     * @return                The angle data from the force field parameter set
     * @exception  Exception  Description of the Exception
     */
    public List getAngleData(String angleType, String id1, String id2, String id3) throws Exception {
        String akey = "";
        if (pSet.containsKey(("angle" + angleType + ";" + id1 + ";" + id2 + ";" + id3))) {
            akey = "angle" + angleType + ";" + id1 + ";" + id2 + ";" + id3;
        } else if (pSet.containsKey(("angle" + angleType + ";" + id3 + ";" + id2 + ";" + id1))) {
            akey = "angle" + angleType + ";" + id3 + ";" + id2 + ";" + id1;
        } /*
           * else {
           * System.out.println("KEYErrorAngle:Unknown angle key in pSet: " +
           * angleType + ";" + id1 + " ; " + id2 + " ; " + id3
           * +" take default angle:" + DEFAULT_ANGLE); return
           * (Vector)[DEFAULT_ANGLE,0,0]; }
           */
        //logger.debug("angle key : " + akey);
        return (List) pSet.get(akey);
    }

    /**
     *  Gets the bond-angle interaction parameter set.
     *
     * @param  id1            ID from Atom 1.
     * @param  id2            ID from Atom 2.
     * @param  id3            ID from Atom 3.
     * @return                The bond-angle interaction data from the force field parameter set
     * @exception  Exception  Description of the Exception
     */
    public List getBondAngleInteractionData(String strbndType, String id1, String id2, String id3) throws Exception {
        String akey = "";
        if (pSet.containsKey(("strbnd" + strbndType + ";" + id1 + ";" + id2 + ";" + id3))) {
            akey = "strbnd" + strbndType + ";" + id1 + ";" + id2 + ";" + id3;
        } else if (pSet.containsKey(("strbnd" + strbndType + ";" + id1 + ";" + id3 + ";" + id2))) {
            akey = "strbnd" + strbndType + ";" + id1 + ";" + id3 + ";" + id2;
        } else if (pSet.containsKey(("strbnd" + strbndType + ";" + id2 + ";" + id1 + ";" + id3))) {
            akey = "strbnd" + strbndType + ";" + id2 + ";" + id1 + ";" + id3;
        } else if (pSet.containsKey(("strbnd" + strbndType + ";" + id2 + ";" + id3 + ";" + id1))) {
            akey = "strbnd" + strbndType + ";" + id2 + ";" + id3 + ";" + id1;
        } else if (pSet.containsKey(("strbnd" + strbndType + ";" + id3 + ";" + id1 + ";" + id2))) {
            akey = "strbnd" + strbndType + ";" + id3 + ";" + id1 + ";" + id2;
        } else if (pSet.containsKey(("strbnd" + strbndType + ";" + id3 + ";" + id2 + ";" + id1))) {
            akey = "strbnd" + strbndType + ";" + id3 + ";" + id2 + ";" + id1;
        } /*
           * else {
           * System.out.println("KEYErrorAngle:Unknown angle key in pSet: " +id1
           * + " ; " + id2 + " ; " + id3+" take default angle:" +
           * DEFAULT_ANGLE); return (Vector)[DEFAULT_ANGLE,0,0]; }
           */
        //logger.debug("akey : " + akey);
        return (List) pSet.get(akey);
    }

    /**
     * Gets the bond-angle interaction parameter set.
     *
     * @param  iR             ID from Atom 1.
     * @param  jR             ID from Atom 2.
     * @param  kR             ID from Atom 3.
     * @return                The bond-angle interaction data from the force field parameter set
     * @exception  Exception  Description of the Exception
     */
    public List getDefaultStretchBendData(int iR, int jR, int kR) throws Exception {
        String dfsbkey = "";
        if (pSet.containsKey(("DFSB" + iR + ";" + jR + ";" + kR))) {
            dfsbkey = "DFSB" + iR + ";" + jR + ";" + kR;
        } /*
           * else { System.out.println(
           * "KEYErrorDefaultStretchBend:Unknown default stretch-bend key in pSet: "
           * + iR + " ; " + jR + " ; " + kR); }
           */
        //logger.debug("dfsbkey : " + dfsbkey);
        return (List) pSet.get(dfsbkey);
    }

    /**
     *  Gets the bond parameter set.
     *
     * @param  id1            atom1 id
     * @param  id2            atom2 id
     * @return                The distance value from the force field parameter set
     * @exception  Exception  Description of the Exception
     */
    public List getTorsionData(String code, String id1, String id2, String id3, String id4) throws Exception {
        String dkey = "";
        if (pSet.containsKey(("torsion" + code + ";" + id1 + ";" + id2 + ";" + id3 + ";" + id4))) {
            dkey = "torsion" + code + ";" + id1 + ";" + id2 + ";" + id3 + ";" + id4;
        } else if (pSet.containsKey(("torsion" + code + ";" + id4 + ";" + id3 + ";" + id2 + ";" + id1))) {
            dkey = "torsion" + code + ";" + id4 + ";" + id3 + ";" + id2 + ";" + id1;
        } else if (pSet.containsKey(("torsion" + code + ";*;" + id2 + ";" + id3 + ";*"))) {
            dkey = "torsion" + code + ";*;" + id2 + ";" + id3 + ";*";
        } else if (pSet.containsKey(("torsion" + code + ";*;" + id3 + ";" + id2 + ";*"))) {
            dkey = "torsion" + code + ";*;" + id3 + ";" + id2 + ";*";
        } else if (pSet.containsKey(("torsion" + 0 + ";*;" + id2 + ";" + id3 + ";*"))) {
            dkey = "torsion" + 0 + ";*;" + id2 + ";" + id3 + ";*";
        } else if (pSet.containsKey(("torsion" + 0 + ";*;" + id3 + ";" + id2 + ";*"))) {
            dkey = "torsion" + 0 + ";*;" + id3 + ";" + id2 + ";*";
        } /*
           * else {
           * System.out.println("KEYError:Unknown distance key in pSet: torsion"
           * + code + ";" + id1 + ";" + id2 + ";" + id3 + ";" + id4 +
           * " take default torsion angle:" + DEFAULT_TORSION_ANGLES); return
           * DEFAULT_TORSION_ANGLE; }
           */
        //logger.debug("dkey = " + dkey);
        return (List) pSet.get(dkey);
    }

}
