import json, random, os
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'))
out = json.load(open(f'{D}/match_v3.json'))
random.seed(42)
REVIEW = {'B1a_LIKELY', 'B1b_DOUBTFUL', 'B2_LIKELY_COORDS_DISAGREE', 'C_PART_OF', 'D_AMBIGUOUS'}
AUDIT = {'A_SAME': 100, 'E5_WEAK': 50, 'E3_SAME_NAME_OTHER_PLACE': 40, 'E1_DIFFERENT_PROPERTY_TYPE': 30, 'E4_NOT_IN_CATALOGUE': 30}
rows = [o for o in out if o['tier'] in REVIEW]
for t, k in AUDIT.items():
    pool = [o for o in out if o['tier'] == t and o['top']]
    rows += [dict(o, audit=True) for o in random.sample(pool, k)]
random.shuffle(rows)

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']}

cases, key = [], {}
for n, o in enumerate(rows, 1):
    r = rc[o['scheme_id']]
    cid = f'c{n:04d}'
    top = o['top']
    main = [c for c in top if not c.get('twin')][:3]
    cands = []
    for k, c in enumerate(main):
        x = cand(c, k)
        tw = [cat[t['i']]['project_name'] for t in top if t.get('twin')] if k == 0 else []
        if tw: x['same_listing_also_as'] = tw
        cands.append(x)
    cases.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': cands})
    key[cid] = {'scheme_id': o['scheme_id'], 'tier': o['tier'], 'audit': o.get('audit', False), 'cand_i': [c['i'] for c in main]}

os.makedirs(f'{D}/review', exist_ok=True)
NB = 8
for b in range(NB):
    part = cases[b::NB]
    with open(f'{D}/review/batch_{b+1:02d}_in.jsonl', 'w') as f:
        for c in part: f.write(json.dumps(c, ensure_ascii=False) + '\n')
json.dump(key, open(f'{D}/review/_key.json', 'w'))
print('cases', len(cases), 'per batch ~', len(cases) // NB)
print(open(f'{D}/review/batch_01_in.jsonl').readline())
