# Path: molml/constants.py
# ELE_TO_NUM = bidict({
#     'H': 1,
#     'C': 6,
#     'N': 7,
#     'O': 8,
#     'F': 9,
#     'P': 15,
#     'S': 16,
#     'Cl': 17,
#     'Br': 35,
#     'I': 53,
#     'Se': 34
# })
# 
# TYPE_ORDER = ['1', 'Ar', '2', '3']
# 
# BOND_LENGTHS = {
#     "C": {
#         "3":   0.62,
#         "2":   0.69,
#         "Ar": 0.72,
#         "1":   0.85,
#     },
#     "Cl": {
#         "1":   1.045,
#     },
#     "F": {
#         "1":   1.23,
#     },
#     "H": {
#         "1":   0.6,
#     },
#     "N": {
#         "3":   0.565,
#         "2":   0.63,
#         "Ar": 0.655,
#         "1":   0.74,
#     },
#     "O": {
#         "3":   0.53,
#         "2":   0.59,
#         "Ar": 0.62,
#         "1":   0.695,
#     },
#     "P": {
#         "2":   0.945,
#         "Ar": 0.985,
#         "1":   1.11,
#     },
#     "S": {
#         "2":   0.905,
#         "Ar": 0.945,
#         "1":   1.07,
#     },
# }
# 
# UNKNOWN = 'UNKNOWN'


from builtins import range
from collections import Counter
from itertools import product, combinations
from scipy.spatial.distance import cdist
from scipy.special import expit
from .constants import ELE_TO_NUM, TYPE_ORDER, BOND_LENGTHS, UNKNOWN
import importlib
import json
import warnings
import numpy
import scipy.stats
                                            label='spacing')


def get_bond_type(element1, element2, dist):
    """
    Get the bond type between two elements based on their distance.

    If there is no bond, return None.

    Parameters
    ----------
    element1 : str
        The element of the first atom
    element2 : str
        The element of the second atom
    dist : float
        The distance between the two atoms
    Returns
    -------
    key : str
        The type of the bond
    """
    bad_eles = [x for x in (element1, element2) if x not in BOND_LENGTHS]
    if len(bad_eles):
        msg = "The following elements are not in BOND_LENGTHS: %s" % bad_eles
        warnings.warn(msg)
        return

    for key in TYPE_ORDER[::-1]:
        try:

# Path: molml/constants.py
# ELE_TO_NUM = bidict({
#     'H': 1,
#     'C': 6,
#     'N': 7,
#     'O': 8,
#     'F': 9,
#     'P': 15,
#     'S': 16,
#     'Cl': 17,
#     'Br': 35,
#     'I': 53,
#     'Se': 34
# })
# 
# TYPE_ORDER = ['1', 'Ar', '2', '3']
# 
# BOND_LENGTHS = {
#     "C": {
#         "3":   0.62,
#         "2":   0.69,
#         "Ar": 0.72,
#         "1":   0.85,
#     },
#     "Cl": {
#         "1":   1.045,
#     },
#     "F": {
#         "1":   1.23,
#     },
#     "H": {
#         "1":   0.6,
#     },
#     "N": {
#         "3":   0.565,
#         "2":   0.63,
#         "Ar": 0.655,
#         "1":   0.74,
#     },
#     "O": {
#         "3":   0.53,
#         "2":   0.59,
#         "Ar": 0.62,
#         "1":   0.695,
#     },
#     "P": {
#         "2":   0.945,
#         "Ar": 0.985,
#         "1":   1.11,
#     },
#     "S": {
#         "2":   0.905,
#         "Ar": 0.945,
#         "1":   1.07,
#     },
# }
# 
# UNKNOWN = 'UNKNOWN'


# Path: molml/utils.py
from builtins import range
from collections import Counter
from itertools import product, combinations
from scipy.spatial.distance import cdist
from scipy.special import expit
from .constants import ELE_TO_NUM, TYPE_ORDER, BOND_LENGTHS, UNKNOWN
import importlib
import json
import warnings
import numpy
import scipy.stats

                                            label='spacing')


def get_bond_type(element1, element2, dist):
    """
    Get the bond type between two elements based on their distance.

    If there is no bond, return None.

    Parameters
    ----------
    element1 : str
        The element of the first atom
    element2 : str
        The element of the second atom
    dist : float
        The distance between the two atoms
    Returns
    -------
    key : str
        The type of the bond
    """
    bad_eles = [x for x in (element1, element2) if x not in BOND_LENGTHS]
    if len(bad_eles):
        msg = "The following elements are not in BOND_LENGTHS: %s" % bad_eles
        warnings.warn(msg)
        return

    for key in TYPE_ORDER[::-1]:
        try:

            cutoff = BOND_LENGTHS[element1][key] + BOND_LENGTHS[element2][key]