//------------------------------------------------------------------------------
// This file is part of the OpenStructure project <www.openstructure.org>
//
// Copyright (C) 2008-2020 by the OpenStructure authors
//
// This library 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 3.0 of the License, or (at your option)
// any later version.
// This library 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 library; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
//------------------------------------------------------------------------------


#include <boost/python.hpp>

#include <ost/mol/alg/accessibility.hh>

using namespace boost::python;

namespace{

Real WrapAccessibilityHandle(ost::mol::EntityHandle& ent, 
                             Real probe_radius, 
                             bool include_hydrogens, 
                             bool include_hetatm,
                             bool include_water,
                             bool oligo_mode,
                             const String& selection,
                             const String& asa_abs, 
                             const String& asa_rel,
                             const String& asa_atom,
                             ost::mol::alg::AccessibilityAlgorithm algorithm) {
                                 
  return ost::mol::alg::Accessibility(ent, probe_radius, include_hydrogens, 
                                      include_hetatm, include_water, oligo_mode,
                                      selection, asa_abs, asa_rel, asa_atom, algorithm);
}

Real WrapAccessibilityView(ost::mol::EntityView& ent, 
                           Real probe_radius, 
                           bool include_hydrogens, 
                           bool include_hetatm,
                           bool include_water,
                           bool oligo_mode,
                           const String& selection,
                           const String& asa_abs, const String& asa_rel,
                           const String& asa_atom,
                           ost::mol::alg::AccessibilityAlgorithm algorithm) {

  return ost::mol::alg::Accessibility(ent, probe_radius, include_hydrogens, 
                                      include_hetatm, include_water, oligo_mode,
                                      selection, asa_abs, asa_rel, asa_atom, algorithm);
}

} // ns




void export_accessibility() {

    enum_<ost::mol::alg::AccessibilityAlgorithm>("AccessibilityAlgorithm")
    .value("NACCESS", ost::mol::alg::NACCESS)
    .value("DSSP", ost::mol::alg::DSSP)
    .export_values()
    ;

    def("Accessibility", WrapAccessibilityHandle, (arg("ent"), 
                                                   arg("probe_radius")=1.4,
                                                   arg("include_hydrogens")=false,
                                                   arg("include_hetatm")=false,
                                                   arg("include_water")=false,
                                                   arg("oligo_mode")=false,
                                                   arg("selection")="",
                                                   arg("asa_abs")="asaAbs",
                                                   arg("asa_rel")="asaRel",
                                                   arg("asa_atom")="asaAtom",
                                                   arg("algorithm")=ost::mol::alg::NACCESS));

    def("Accessibility", WrapAccessibilityView, (arg("ent"), 
                                                 arg("probe_radius")=1.4,
                                                 arg("include_hydrogens")=false,
                                                 arg("include_hetatm")=false,
                                                 arg("include_water")=false,
                                                 arg("oligo_mode")=false,
                                                 arg("selection")="",
                                                 arg("asa_abs")="asaAbs",
                                                 arg("asa_rel")="asaRel",
                                                 arg("asa_atom")="asaAtom",
                                                 arg("algorithm")=ost::mol::alg::NACCESS));
}