import json, urllib.request, urllib.error, datetime, email.utils, base64, re
from pathlib import Path

TOKEN_PATH = Path.home() / '.hermes' / 'google_token.json'
t = json.loads(TOKEN_PATH.read_text())
access = t['access_token']

ids = json.loads(Path('/tmp/g_ids.json').read_text())

def api(url):
    req = urllib.request.Request(url, headers={'Authorization': f'Bearer {access}'})
    try:
        with urllib.request.urlopen(req, timeout=15) as r:
            return r.status, json.loads(r.read().decode())
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode()[:200]

def extract_body_text(payload):
    if payload.get('body', {}).get('data'):
        raw = payload['body']['data']
        padded = raw + '=' * (-len(raw) % 4)
        try:
            return base64.urlsafe_b64decode(padded).decode('utf-8', 'replace')
        except Exception:
            return ''
    for p in payload.get('parts', []):
        if p.get('mimeType') == 'text/plain':
            raw = p.get('body', {}).get('data', '')
            if raw:
                padded = raw + '=' * (-len(raw) % 4)
                try:
                    return base64.urlsafe_b64decode(padded).decode('utf-8', 'replace')
                except Exception:
                    pass
        t_inner = extract_body_text(p)
        if t_inner:
            return t_inner
    return ''

results = []
for mid in ids:
    s, data = api(f'https://gmail.googleapis.com/gmail/v1/users/me/messages/{mid}?format=full')
    if s != 200:
        results.append({'id': mid, 'error': s})
        continue
    payload = data.get('payload', {})
    headers = {h['name']: h['value'] for h in payload.get('headers', [])}
    from_h = headers.get('From', '')
    subj = headers.get('Subject', '(no subject)')
    date_h = headers.get('Date', '')
    snippet = data.get('snippet', '')
    internal = data.get('internalDate')
    # Decode sender email only
    m = re.search(r'<([^>]+)>', from_h)
    sender = m.group(1) if m else from_h.strip()
    sender_name = from_h.split('<')[0].strip().strip('"') or sender
    # Only extract body if subject suggests tender/deadline
    body = ''
    if re.search(r'tender|RFT|RFP|addendum|EOI|due|closing|cloes|deadline|quot', subj, re.I):
        body = extract_body_text(payload)
    # Internal ms epoch -> Sydney
    ts = ''
    if internal:
        try:
            dt = datetime.datetime.fromtimestamp(int(internal)/1000, tz=datetime.timezone.utc).astimezone(datetime.timezone(datetime.timedelta(hours=10)))
            ts = dt.strftime('%a %H:%M')
        except Exception:
            ts = ''
    results.append({
        'id': mid,
        'from': sender,
        'from_name': sender_name,
        'subject': subj,
        'date': date_h,
        'ts': ts,
        'snippet': snippet[:180],
        'body_excerpt': body[:600] if body else '',
        'labels': data.get('labelIds', []),
    })

Path('/tmp/g_results.json').write_text(json.dumps(results, indent=2))
for r in results[:15]:
    print(f"[{r.get('ts','')}] {r.get('from','')[:30]} | {r.get('subject','')[:60]}")
    if r.get('body_excerpt'):
        print(f"   BODY: {r['body_excerpt'][:200]}")
    else:
        print(f"   SNIP: {r.get('snippet','')[:120]}")
    print()
