import logging
import numpy as np
import ase

logger = logging.getLogger('DockOnSurf')


def get_atom_coords(atoms: ase.Atoms, ctrs_list):
    pass


def ads_euler(site, ctr, pts_angle, neigh_ctr):
    pass


def ads_chemcat(site, ctr, pts_angle):
    pass


def adsorb_confs(conf_list, surf, ads_ctrs, sites, algo, num_pts, neigh_ctrs):
    surf_ads_list = []
    sites_coords = get_atom_coords(surf, sites)
    for conf in conf_list:
        molec_ctr_coords = get_atom_coords(conf, ads_ctrs)
        molec_neigh_coords = get_atom_coords(conf, neigh_ctrs)
        for site in sites_coords:
            for i, molec_ctr in enumerate(molec_ctr_coords):
                if algo == 'euler':
                    surf_ads_list.append(ads_euler(site, molec_ctr, num_pts,
                                                   molec_neigh_coords[i]))
                elif algo == 'chemcat':
                    surf_ads_list.append(ads_chemcat(site, molec_ctr, num_pts))
    return surf_ads_list


def run_screening(inp_vars):
    """Carry out the screening of adsorbate coordinates on a surface

    @param inp_vars: Calculation parameters from input file.
    """
    import os
    import numpy as np
    from modules.formats import read_coords, read_energies, \
        rdkit_mol_to_ase_atoms, adapt_format
    from modules.clustering import get_rmsd, clustering
    from modules.isolated import get_moments_of_inertia, get_neighbors
    from modules.calculation import run_calc

    if not os.path.isdir("isolated"):
        err = "'isolated' directory not found. It is needed in order to carry "
        "out the screening of structures to be adsorbed"
        logger.error(err)
        raise ValueError(err)

    conf_list = read_coords(inp_vars['code'], 'isolated', 'rdkit')
    # TODO Implement neighbors algorithm
    # neigh_list = get_neighbors(conf_list[0], inp_vars['molec_ads_ctrs'])
    conf_enrgs = read_energies(inp_vars['code'], 'isolated')
    mois = np.array([get_moments_of_inertia(conf)[0] for conf in conf_list])
    rmsd_mtx = get_rmsd(conf_list)
    exemplars = clustering(rmsd_mtx)
    conf_list = [conf_list[idx] for idx in exemplars]
    conf_list = [rdkit_mol_to_ase_atoms(conf) for conf in conf_list]
    surf = adapt_format('ase', inp_vars['surf_file'])
    surf_ads_list = adsorb_confs(conf_list, surf, inp_vars['molec_ads_ctrs'],
                                 inp_vars['sites'], inp_vars['ads_algo'],
                                 inp_vars['sample_points_per_angle'],
                                 inp_vars['molec_neigh_ctrs'])
    run_calc('screening', inp_vars, surf_ads_list)
