from orionclient.session import APISession
from orionclient.types import MolsearchQuery, MolsearchDatabase
from openeye.oechem import OEMol, oemolistream, OEReadMolecule, OEThrow


def find_first_available_db(search_type='2D'):
    if search_type.upper() not in ['2D', '3D']:
        raise ValueError("Search type must be '2D' or '3D'")

    search_filter = {'search_type': search_type.upper()}

    db = None
    for db in APISession.list_resources(MolsearchDatabase, search_filter):
        if db.state == "LOADED":
            break

    if db is None or db.state != "LOADED":
        raise ValueError(f"No loaded {search_type} database found")

    return db


PROJECT = APISession.get_current_project().id

db = find_first_available_db()

ifs = oemolistream()
filename = "p_ethyltoluene.sdf"
if not ifs.open(filename):
    OEThrow.Fatal(f"Unable to open file {filename}")

mol = OEMol()
OEReadMolecule(ifs, mol)
ifs.close()

subsearch_query = MolsearchQuery.create_subsearch_query(
    database_id=db.id,
    num_hits=100,
    mdlquery=mol,
    subsearch_query_type="MDLJSON",
    name="p_ethyltoluene subsearch",
    project=PROJECT,
    aliphatic_constraint=False,
    topology_constraint=False,
    stereo_constraint=False,
    isotope_constraint=False,
    session=APISession,
)