import os, json, urllib.request, urllib.parse
from pathlib import Path
vals={}
for line in Path('/opt/openclaw/ops/.env.nextcloud-bot').read_text().splitlines():
    s=line.strip()
    if not s or s.startswith('#') or '=' not in s: continue
    k,v=s.split('=',1); vals[k]=v.strip().strip('"').strip("'")
base=vals['INFISICAL_URL'].rstrip('/'); project=vals['INFISICAL_PROJECT_ID']
def http(method,url,body=None,headers=None):
    data=json.dumps(body).encode() if isinstance(body,dict) else body
    req=urllib.request.Request(url, data=data, method=method, headers=headers or {})
    with urllib.request.urlopen(req, timeout=20) as r:
        return json.loads(r.read().decode() or '{}')
login=http('POST',base+'/api/v1/auth/universal-auth/login',{'clientId':vals['INFISICAL_CLIENT_ID'],'clientSecret':vals['INFISICAL_CLIENT_SECRET']},{'Content-Type':'application/json'})
tok=login.get('accessToken') or (login.get('data') or {}).get('accessToken')
qs=urllib.parse.urlencode({'workspaceId':project,'environment':'prod','secretPath':'/nextcloud-bot'})
sec=http('GET',base+'/api/v3/secrets/raw?'+qs,headers={'Authorization':'Bearer '+tok})
items=sec.get('secrets') or sec.get('data') or []
if isinstance(items,dict): items=items.get('secrets') or []
secrets={}
for x in items:
    if isinstance(x,dict):
        k=x.get('secretKey') or x.get('key') or x.get('secretName')
        v=x.get('secretValue') or x.get('value')
        if k: secrets[k]=v
print('infisical_keys', sorted(secrets.keys()))
def slack(method,token):
    req=urllib.request.Request('https://slack.com/api/'+method, data=b'', headers={'Authorization':'Bearer '+token,'Content-Type':'application/x-www-form-urlencoded'})
    return json.loads(urllib.request.urlopen(req, timeout=20).read().decode() or '{}')
if secrets.get('SLACK_BOT_TOKEN'):
    res=slack('auth.test', secrets['SLACK_BOT_TOKEN'])
    print('bot_token_auth', {k:res.get(k) for k in ['ok','user','user_id','bot_id','team','error']})
else:
    print('bot_token_missing')
if secrets.get('SLACK_APP_TOKEN'):
    res=slack('apps.connections.open', secrets['SLACK_APP_TOKEN'])
    print('app_token_socket', {k:res.get(k) for k in ['ok','error']})
else:
    print('app_token_missing')
# compare current process token identity
p='2706939'
try:
    env={}
    for e in open(f'/proc/{p}/environ','rb').read().decode('utf-8','ignore').split('\0'):
        if '=' in e:
            k,v=e.split('=',1); env[k]=v
    if env.get('SLACK_BOT_TOKEN'):
        res=slack('auth.test', env['SLACK_BOT_TOKEN'])
        print('runtime_bot_token_auth', {k:res.get(k) for k in ['ok','user','user_id','bot_id','team','error']})
        print('runtime_matches_infisical_bot_token', env.get('SLACK_BOT_TOKEN') == secrets.get('SLACK_BOT_TOKEN'))
except Exception as e:
    print('runtime_check_error', type(e).__name__, str(e)[:120])
