/* Copyright (C) 2006-2007  Egon Willighagen <egonw@users.sf.net>
 *
 * Contact: cdk-devel@lists.sourceforge.net
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 */
package org.openscience.cdk.interfaces;

/**
 * The base class for atom types.
 *
 * Atom types are typically used to describe the
 * behaviour of an atom of a particular element in different environment like
 * sp<sup>3</sup> hybridized carbon C3, etc., in some molecular modelling
 * applications.
 *
 * @cdk.module  interfaces
 * @cdk.githash
 *
 * @author      egonw
 * @cdk.created 2005-08-24
 *
 * @cdk.keyword atom, type
 */
public interface IAtomType extends IIsotope {

    /**
     *
     * An enum for the different hybridization states.
     *
     */
    public enum Hybridization {
        S, SP1, // linear
        SP2, // trigonal planar (single pi-electron in pz)
        SP3, // tetrahedral
        PLANAR3, // trigonal planar (lone pair in pz)
        SP3D1, // trigonal planar
        SP3D2, // octahedral
        SP3D3, // pentagonal bipyramid
        SP3D4, // square antiprim??
        SP3D5 // tricapped trigonal prism
    }

    /**
     * Sets the if attribute of the AtomType object.
     *
     * @param  identifier  The new AtomTypeID value. Null if unset.
     * @see    #getAtomTypeName
     */
    public void setAtomTypeName(String identifier);

    /**
     * Sets the MaxBondOrder attribute of the AtomType object.
     *
     * @param  maxBondOrder  The new MaxBondOrder value
     * @see    #getMaxBondOrder
     */
    public void setMaxBondOrder(IBond.Order maxBondOrder);

    /**
     * Sets the the exact bond order sum attribute of the AtomType object.
     *
     * @param  bondOrderSum  The new bondOrderSum value
     * @see    #getBondOrderSum
     */
    public void setBondOrderSum(Double bondOrderSum);

    /**
     * Gets the id attribute of the AtomType object.
     *
     * @return    The id value
     * @see       #setAtomTypeName
     */
    public String getAtomTypeName();

    /**
     * Gets the MaxBondOrder attribute of the AtomType object.
     *
     * @return    The MaxBondOrder value
     * @see       #setMaxBondOrder
     */
    public IBond.Order getMaxBondOrder();

    /**
     * Gets the bondOrderSum attribute of the AtomType object.
     *
     * @return    The bondOrderSum value
     * @see       #setBondOrderSum
     */
    public Double getBondOrderSum();

    /**
     * Sets the formal charge of this atom.
     *
     * @param  charge  The formal charge
     * @see    #getFormalCharge
     */
    public void setFormalCharge(Integer charge);

    /**
     * Returns the formal charge of this atom.
     *
     * @return the formal charge of this atom
     * @see    #setFormalCharge
     */
    public Integer getFormalCharge();

    /**
     * Sets the formal neighbour count of this atom.
     *
     * @param  count  The neighbour count
     * @see    #getFormalNeighbourCount
     */
    public void setFormalNeighbourCount(Integer count);

    /**
     * Returns the formal neighbour count of this atom.
     *
     * @return the formal neighbour count of this atom
     * @see    #setFormalNeighbourCount
     */
    public Integer getFormalNeighbourCount();

    /**
     * Sets the hybridization of this atom.
     *
     * @param  hybridization  The hybridization
     * @see    #getHybridization
     */
    public void setHybridization(Hybridization hybridization);

    /**
     * Returns the hybridization of this atom.
     *
     * @return the hybridization of this atom
     * @see    #setHybridization
     */
    public Hybridization getHybridization();

    /**
     * Sets the covalent radius for this AtomType.
     *
     * @param radius The covalent radius for this AtomType
     * @see    #getCovalentRadius
     */
    public void setCovalentRadius(Double radius);

    /**
     * Returns the covalent radius for this AtomType.
     *
     * @return The covalent radius for this AtomType
     * @see    #setCovalentRadius
     */
    public Double getCovalentRadius();

    /**
     * Sets the the exact electron valency of the AtomType object.
     *
     * @param  valency  The new valency value
     * @see    #getValency()
     */
    public void setValency(Integer valency);

    /**
     * Gets the the exact electron valency of the AtomType object.
     *
     * @return The valency value
     * @see    #setValency(Integer)
     */
    public Integer getValency();

}
