#!/usr/bin/env python3
"""Bandingkan kunci JSON yang dibaca layar Flutter dengan keluaran API sungguhan."""
import re, os, json, subprocess, collections

BASE = os.environ.get('SIMAP_API', 'http://127.0.0.1:8081')
# Jalur proyek dihitung dari lokasi skrip agar bisa dipindah ke mana saja
AKAR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MOBILE = os.path.join(AKAR, 'mobile') + '/'

DB = os.environ.get('SIMAP_DB_NAME', 'simap_db')

def sql(q):
    return subprocess.run(['mariadb', DB, '-N', '-e', q], capture_output=True, text=True).stdout.strip()

def curl(jalur, tok):
    out = subprocess.run(['curl','-s',f'{BASE}/{jalur}','-H',f'Authorization: Bearer {tok}'],
                         capture_output=True, text=True).stdout
    try: return json.loads(out)
    except Exception: return None

hp = sql("SELECT no_hp FROM users WHERE ref_type='ORTU' LIMIT 1")
tok = json.loads(subprocess.run(['curl','-s','-X','POST',f'{BASE}/auth/login',
      '-H','Content-Type: application/json',
      '-d', json.dumps({'username': hp, 'password': 'simap123'})],
      capture_output=True, text=True).stdout)['data']['token']

anak = curl('anak', tok)['data'][0]['id']
rap = curl(f'anak/{anak}/rapor', tok)['data']
rid = rap[0]['id'] if rap else None

PETA = {
    'lib/models/anak.dart':               ['anak'],
    'lib/screens/beranda_screen.dart':    [f'anak/{anak}/beranda', 'anak'],
    'lib/screens/absensi_screen.dart':    [f'anak/{anak}/absensi'],
    'lib/screens/nilai_screen.dart':      [f'anak/{anak}/nilai'],
    'lib/screens/rapor_screen.dart':      [f'anak/{anak}/rapor'] + ([f'rapor/{rid}'] if rid else []),
    'lib/screens/literasi_screen.dart':   [f'anak/{anak}/literasi'],
    'lib/screens/tagihan_screen.dart':    [f'anak/{anak}/tagihan'],
    'lib/screens/bayar_screen.dart':      [f'anak/{anak}/tagihan/belum', f'anak/{anak}/bayar'],
    'lib/screens/izin_screen.dart':       [f'anak/{anak}/izin'],
    'lib/screens/profil_screen.dart':     [f'anak/{anak}/profil'],
    'lib/screens/notifikasi_screen.dart': ['notifikasi'],
    'lib/screens/pesan_screen.dart':      [f'pesan?anak_id={anak}'],
}

def kumpulkan(o, h=None):
    if h is None: h = set()
    if isinstance(o, dict):
        for k, v in o.items(): h.add(k); kumpulkan(v, h)
    elif isinstance(o, list):
        for v in o[:5]: kumpulkan(v, h)
    return h

POLA = re.compile(r"""\[\s*['"]([a-z_][a-z0-9_]*)['"]\s*\]""", re.I)
ABAIKAN = {'simap_token', 'simap_anak_aktif', 'Authorization', 'Content-Type', 'Accept',
           'data', 'ok', 'pesan', 'meta', 'token'}

total = 0
for berkas, daftar in PETA.items():
    jalur = MOBILE + berkas
    if not os.path.isfile(jalur):
        print(f"### {berkas}: berkas tidak ada"); total += 1; continue

    tersedia, gagal = set(), False
    for e in daftar:
        r = curl(e, tok)
        if not r or not r.get('ok'):
            print(f"### {berkas}: API {e} GAGAL -> {str(r)[:80]}"); total += 1; gagal = True; continue
        tersedia |= kumpulkan(r.get('data'))
        tersedia |= kumpulkan(r.get('meta', {}))
    if gagal: continue

    dibaca = set(POLA.findall(open(jalur).read())) - ABAIKAN
    hilang = sorted(dibaca - tersedia)
    if hilang:
        print(f"### {berkas}   (endpoint: {', '.join(daftar)})")
        for h in hilang:
            print(f"    '{h}' dibaca aplikasi, TIDAK ADA di balasan API")
            total += 1
        print()

print(f"Layar diperiksa: {len(PETA)} | Ketidakcocokan: {total}")
