#!/usr/bin/env python3
import argparse, importlib.util, json, os, shutil, subprocess, sys
from importlib.metadata import PackageNotFoundError, version

def mod(name):
    try: return importlib.util.find_spec(name) is not None
    except Exception: return False

def exe(name): return shutil.which(name)

def streamlit_status():
    try:
        installed = version('streamlit')
        import streamlit
        has_iframe = hasattr(streamlit, 'iframe')
        parts = tuple(int(x) for x in installed.split('.')[:2])
        version_ok = parts >= (1, 63)
        return {'ok': has_iframe and version_ok, 'detail': f'{installed}; st.iframe={has_iframe}; minimal_1.63={version_ok}'}
    except (PackageNotFoundError, ImportError):
        return {'ok': False, 'detail': 'tidak terpasang'}

def version_cmd(path, args):
    if not path: return None
    try:
        p=subprocess.run([path]+args,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,text=True,timeout=10)
        return (p.stdout or '').strip().splitlines()[0][:240] if p.stdout else f'exit={p.returncode}'
    except Exception as e: return str(e)

ap=argparse.ArgumentParser(description='QM Komputasi 2.4.0 Research Complete doctor')
ap.add_argument('--json',action='store_true')
ns=ap.parse_args()
status={
 'python': {'ok': sys.version_info >= (3,10), 'detail': sys.version.split()[0]},
 'streamlit': streamlit_status(), 'rdkit': {'ok': mod('rdkit')}, 'pyscf': {'ok': mod('pyscf')},
 'psi4_python': {'ok': mod('psi4')}, 'openmm': {'ok': mod('openmm')},
 'openff_toolkit': {'ok': mod('openff.toolkit')}, 'openmmforcefields': {'ok': mod('openmmforcefields')},
}
for key,name,args in [('xtb','xtb',['--version']),('dftbplus','dftb+',['--version']),('psi4_cli','psi4',['--version']),('mopac','mopac',['--version']),('orca','orca',[]),('openbabel','obabel',['-V'])]:
    p=exe(name); status[key]={'ok':bool(p),'path':p,'detail':version_cmd(p,args) if p else None}
status['dftb_parameters']={'ok': bool(os.environ.get('DFTB_PREFIX')), 'detail': os.environ.get('DFTB_PREFIX')}
summary={'version':'2.4.0-r8','all_core':all(status[k]['ok'] for k in ['python','streamlit','rdkit','pyscf']), 'status':status}
if ns.json: print(json.dumps(summary,indent=2))
else:
    print('QM Komputasi 2.4.0-r8 Research Complete — Doctor')
    for k,v in status.items(): print(('OK  ' if v.get('ok') else 'MISS'), f'{k:20s}', v.get('detail') or v.get('path') or '')
    print('\nCore:', 'PASS' if summary['all_core'] else 'INCOMPLETE')
