import json, random, collections
D = '/var/www/html/peta/storage/app/propertylab-catalogue-match'
rc = {r['scheme_id']: r for r in json.load(open(f'{D}/realtycheck_schemes.json'))}
cat = json.load(open(f'{D}/catalogue_my_projects.json'))
final = json.load(open(f'{D}/final.json'))
flagged = set(json.load(open(f'{D}/review/_hr_confident_flagged.json')))
HR = {'Condo/Apartment', 'Serviced Apartment', 'Flat'}
UNCERTAIN = {'SAME - probable', 'PART OF (phase / block / sub-estate)', 'NEEDS HUMAN CHECK'}
hr, rest = [], []
for f in final:
    r = rc[f['scheme_id']]
    if f['status'] in UNCERTAIN or f['scheme_id'] in flagged:
        (hr if r['category'] in HR else rest).append(f)
def cand(c, k):
    p = cat[c['i']]
    return {'k': k, 'name': p['project_name'], 'area': p['area'], 'state': p['state'], 'type': p['property_type'],
            'dist_m': c['dist_m'], 'psf_median': p['psf_median'], 'price_median': p['price_median'],
            'completion_year': p['completion_year'], 'sale_status': p['sale_status'], 'tenure': p['tenure']}
key, packs = {}, {'hr': [], 'rest': []}
n = 0
for group, rows in (('hr', hr), ('rest', rest)):
    random.seed(99 if group == 'hr' else 98); random.shuffle(rows)
    for f in rows:
        n += 1; cid = f'v{n:04d}'
        r = rc[f['scheme_id']]
        # the matcher's candidate order (not the earlier AI choice) keeps the review blind; make sure the earlier pick is present
        order = [c['i'] for c in f['top_all']]
        if f['cat_i'] is not None and f['cat_i'] not in order: order.insert(0, f['cat_i'])
        seen, cands = set(), []
        for i in order:
            if i in seen: continue
            seen.add(i)
            d = next((c['dist_m'] for c in f['top_all'] if c['i'] == i), None)
            cands.append({'i': i, 'dist_m': d})
            if len(cands) == 4: break
        packs[group].append({'case': cid, 'realtycheck': {'name': r['display_name'], 'category': r['category'], 'state': r['state'],
                             'district': r['district'], 'mukim': r['mukim'], 'coord_precision': r['precision'],
                             'psf': r['reported_psf'], 'median_price_rm': r['median_rm']},
                             'catalogue_candidates': [cand(c, k) for k, c in enumerate(cands)]})
        key[cid] = {'scheme_id': f['scheme_id'], 'group': group, 'prior_status': f['status'], 'cand_i': [c['i'] for c in cands]}
nb = {'hr': 4, 'rest': 4}
for group, rows in packs.items():
    for b in range(nb[group]):
        with open(f'{D}/review/v_{group}_{b+1:02d}_in.jsonl', 'w') as fh:
            for c in rows[b::nb[group]]: fh.write(json.dumps(c, ensure_ascii=False) + '\n')
json.dump(key, open(f'{D}/review/_key3.json', 'w'))
print({g: len(v) for g, v in packs.items()}, collections.Counter(k['prior_status'] for k in key.values()))
