import json
IN = "/var/www/html/peta/storage/app/propertylab-catalogue-match/review/v_hr_04_in.jsonl"
OUT = "/var/www/html/peta/storage/app/propertylab-catalogue-match/review/v_hr_04_out.jsonl"
S, P, D, U = "SAME", "PART_OF", "DIFFERENT", "UNSURE"
RC, CR = "R_in_C", "C_in_R"
# case: (verdict, cand, conf, relation, reason, web)
V = {
"v0004": (S,0,75,None,"Bukit Jambul Indah apartments exist (web); PSF agrees; R point geocoded by name, 2 km off.",True),
"v0008": (S,0,82,None,"Exact distinctive name, 18 m, Brickfields; PSF ratio 0.71 conflicts.",False),
"v0012": (S,0,72,None,"Taman Wangsa Klang mixed estate; R is its flats, so price differs.",False),
"v0016": (S,0,75,None,"Web: Taman Pinggiran Indah low-cost flats, Selayang, 657 sqft = R; C row typed terrace.",True),
"v0020": (S,0,72,None,"PSF equals MKH Boulevard; R lacks 'II', but both towers sit on Jalan Bukit (web).",True),
"v0024": (S,1,95,None,"Tropez Residences Danga Bay; name, 29 m and price all agree.",False),
"v0028": (P,0,72,RC,"R is the flats bucket of Seksyen 2 BBB; C is the whole section.",False),
"v0032": (S,3,72,None,"Only Penang Pangsapuri Melur (Bagan Jermal, web); R geocoded to KL namesake; price high.",True),
"v0036": (S,1,95,None,"Diamond Villa, Tanjung Bungah/Tokong; 30 m, price matches.",False),
"v0040": (P,0,55,RC,"R is condo bucket of Bandar Nusajaya township; C row is landed, unclear.",False),
"v0044": (S,2,93,None,"Fortune Perdana Lakeside, Kepong; 9 m, price agrees.",False),
"v0048": (S,2,93,None,"G Residence, Plentong JB; ~40 m, price agrees.",False),
"v0052": (S,3,68,None,"R point 54 m from Jubilee Phase 3; its 700 sqft units match R (web).",True),
"v0056": (S,1,95,None,"Casa Green Cheras, Selangor; 77 m, price matches.",False),
"v0060": (S,0,85,None,"Exact name, 38 m; luxury, few sales, PSF ratio 1.40 conflicts.",False),
"v0064": (S,0,92,None,"Desa Acacia, George Town; name exact, 12 m.",False),
"v0068": (S,0,82,None,"Taman Lita, Sungai Pinang, Penang; name exact; mixed estate, no price.",False),
"v0072": (S,0,92,None,"Indah Alam = Subang Andaman (C alias); price agrees; Shah Alam.",False),
"v0076": (U,None,60,None,"No state; Taman Pinggiran flats exist in Kajang and Batu Caves at similar prices.",False),
"v0080": (S,1,88,None,"Web: Mewah Court is Taman Cheras Mewah's apartment; size and price agree.",True),
"v0084": (P,3,68,RC,"PV21 (Platinum Lake, web) stands inside Taman Danau Kota; no PV21 row.",True),
"v0088": (S,0,65,None,"Flat on Jalan Bedara, 172 m; R PSF 2.3x C.",False),
"v0092": (S,0,93,None,"Web: Pangsapuri Telaga Emas, Butterworth, 1,330 sqft units = R's.",True),
"v0096": (S,2,95,None,"Web: Residensi Rimbunan is Petalz Residences, Old Klang Road; price matches.",True),
"v0100": (P,2,75,CR,"R covers Simfoni 1 and 2; C is Simfoni 1; 225 m.",False),
"v0104": (S,1,78,None,"Flats of Bandar Baru Sentul; price within 10%; R lacks state.",False),
"v0108": (S,0,90,None,"Web: Pangsapuri Permata Austin = Austin Suites; 72 m; R unit = largest layout.",True),
"v0112": (S,0,70,None,"Exact name, 5 m, Puchong; R unit size below project's 818 sqft minimum (web).",True),
"v0116": (S,1,95,None,"Abdullah Hukum apartment, 36 m; price agrees.",False),
"v0120": (S,0,86,None,"Web: Sri Pinang, Jalan Logan, 1993, 1,000-1,200 sqft fits R; C price odd.",True),
"v0124": (S,0,85,None,"Jalan (Sultan) Abdul Samad flats, Brickfields; price within 16%.",False),
"v0128": (S,0,86,None,"PV9 Residences Setapak, 79 m; C PSF looks wrong (ratio 1.71).",False),
"v0132": (S,1,95,None,"Seri Atria, Subang Bestari; 23 m, price matches.",False),
"v0136": (S,0,95,None,"Desa Penaga, Jelutong; name and price identical.",False),
"v0140": (S,2,88,None,"Aster Residence Cheras KL; PSF matches; C rows' coordinates disagree.",False),
"v0144": (S,0,70,None,"Taman Bahtera, Hulu Selangor, 121 m; mixed estate, price differs.",False),
"v0148": (S,0,90,None,"Residensi Nexus Kajang; name and price agree; coordinates 10 km off.",False),
"v0152": (S,0,93,None,"1Tebrau / One Tebrau Residence; price agrees.",False),
"v0156": (S,0,90,None,"PPR Sri Pantai exact, KL; standard PPR price.",False),
"v0160": (S,0,96,None,"Residensi Wangsa Meranti; name and price identical.",False),
"v0164": (S,1,92,None,"Web: Angkasa Impian 2 is a separate scheme, so R = tower 1; 17 m, price agrees.",True),
"v0168": (S,3,78,None,"Price matches Sri Saujana, Sungai Dua; R has no state; several namesakes.",False),
"v0172": (S,1,58,None,"Estate matches; C mixes low-cost Jati flats (web); R PSF double.",True),
"v0176": (S,2,92,None,"Apartment Bayu, Damansara Damai; price agrees; R point misplaced.",False),
"v0180": (S,0,75,None,"Taman Selayang Mulia estate; R is its flats; C price junk.",False),
"v0184": (P,0,68,RC,"Sri Kristal is a block inside Bandar Baru Air Itam township.",False),
"v0188": (S,0,95,None,"Apartment Tropika, Bandar Bukit Tinggi; price identical.",False),
"v0192": (S,1,93,None,"D'Tasek Residences (Tasek Impian), JB; 41 m, price agrees.",False),
"v0196": (S,0,66,None,"Taman Alam Indah, Shah Alam, mixed estate; R lacks location.",False),
"v0200": (P,0,70,RC,"R is the condo bucket inside the PJS 11 locality row.",False),
"v0204": (S,0,90,None,"Web: D'Rapport Residences = Festa + Heros phases, Ampang Hilir; 163 m.",True),
"v0208": (S,0,85,None,"Taman Wilayah Selayang, 117 m; mixed estate, no price.",False),
"v0212": (S,0,88,None,"Selayang Makmur apartments; price within 11%.",False),
"v0216": (S,0,72,None,"Taman Bukit Panchor Indah estate; R is its flats.",False),
"v0220": (S,0,86,None,"Web: 'Kajang 2' is the township, not a phase; same project; R PSF lower.",True),
"v0224": (S,0,72,None,"Name matches Sunshine Central residence; Sunshine Tower price coincides, name differs.",False),
"v0228": (S,3,80,None,"Sri Jati 1, Old Klang Road; 27 m, price agrees; R may include Sri Jati 2.",False),
"v0232": (S,0,80,None,"Taman Kajang Utama; price agrees; mixed estate.",False),
"v0236": (S,0,86,None,"C carries both names United Garden / Taman Lee Yan Lian; mixed estate.",False),
"v0240": (S,0,90,None,"Pangsapuri SS19, Subang Jaya; price identical.",False),
"v0244": (S,1,70,None,"Taman Putra Kajang mixed estate; R is its flats.",False),
"v0248": (S,0,62,None,"Taman Kuang Raya estate; R low-cost flats; C typed terrace.",False),
"v0252": (S,0,90,None,"Mutiara Ville Cyberjaya; price agrees.",False),
"v0256": (S,1,93,None,"One Medini, Iskandar Puteri; price agrees.",False),
"v0260": (S,1,96,None,"Palmyra Bangsar; 13 m, price identical.",False),
"v0264": (S,2,62,None,"Taman Pandan Perdana estate row; R lacks location; no price.",False),
"v0268": (S,0,92,None,"PPR Sri Semarak, Setapak; PPR price identical.",False),
"v0272": (S,0,86,None,"Taman Evergreen Apartment, Tanjung Tokong; no price.",False),
"v0276": (S,1,93,None,"Flat UDA, Tanjung Tokong; price identical.",False),
"v0280": (U,None,55,None,"No Sutera Residences condo row; web shows landed namesake and Sutera Apartment BTHO.",True),
"v0284": (P,0,70,RC,"Makmur apartment inside PJS 8 locality.",False),
"v0288": (S,3,76,None,"Unnumbered name suggests Casa Kiara 1; 72 m; price within band.",False),
"v0292": (S,0,92,None,"Villa Tropika Apartment, Kajang; price identical.",False),
"v0296": (U,0,55,None,"Name exact but R PSF 4.7x; R's 695 sqft unit below Orion's 1,161 minimum (web).",True),
"v0300": (S,0,90,None,"Oxley Towers KLCC; 72 m.",False),
"v0304": (P,0,85,RC,"Kelana Puteri condo inside SS7 Kelana Jaya locality.",False),
"v0308": (S,3,88,None,"C alias Residensi Nest; serviced apartment; price agrees; R point geocoded to namesake.",False),
"v0312": (S,1,90,None,"The Elements @ Ampang; 20 m, Mukim Ampang.",False),
"v0316": (S,1,92,None,"Antara, Genting Highlands; 32 m.",False),
"v0320": (S,0,82,None,"Pangsapuri Tanjung Tokong exact; Flat 16 row's price also matches.",False),
"v0324": (P,0,82,RC,"Indah Court flats inside PJS 11 locality.",False),
"v0328": (S,0,85,None,"Selasih Court PJ, 179 m; C price data inconsistent.",False),
"v0332": (S,2,80,None,"Low-cost flats of Prima Setapak; R unit size small, category flat.",False),
"v0336": (S,3,92,None,"Idaman Lavender 4; phase and price match.",False),
"v0340": (S,0,92,None,"Ara Mas, Sungai Ara; price agrees.",False),
"v0344": (S,0,92,None,"100 Residency, Setapak; price identical.",False),
"v0348": (S,1,92,None,"Taman Kristal, Penang; price identical.",False),
"v0352": (P,3,60,RC,"R flats sit in Sungai Sering, Bukit Antarabangsa locality.",False),
"v0356": (S,1,92,None,"Seri Mutiara, Putra Heights; price agrees.",False),
"v0360": (S,1,90,None,"C alias Jasmine Court = Pangsapuri Jasmine; 25 m; price within 17%.",False),
"v0364": (P,0,58,RC,"R serviced apartments inside SS 8 locality row.",False),
"v0368": (S,3,86,None,"University Tower PJ; price within band.",False),
"v0372": (S,3,90,None,"Villa Pandan in Pandan Indah; PSF agrees.",False),
"v0376": (S,0,68,None,"Taman Ampang Hilir estate, 969 m; no price.",False),
"v0380": (S,0,90,None,"Alix Residences Dutamas; luxury price rules out RUMAWIP Residensi Dutamas.",False),
"v0384": (S,0,78,None,"Pangsapuri Seri Jasa; price agrees; R lacks district.",False),
"v0388": (S,1,72,None,"Taman Janggus Jaya flats; R price high for low-cost flats.",False),
"v0392": (S,1,96,None,"You Residences @ You City; price identical.",False),
"v0396": (S,2,85,None,"Puncak Ukay (Ukay Heights) exact; C price mixed.",False),
"v0400": (P,0,66,RC,"R condo bucket inside Seksyen 26 Shah Alam locality.",False),
"v0404": (S,2,94,None,"Pudu Impian 4 @ D Alamanda; PSF identical.",False),
"v0408": (S,0,92,None,"Setia Sky Seputeh; 38 m.",False),
"v0412": (S,0,93,None,"Serini Melawati; 13 m.",False),
"v0416": (S,1,96,None,"Akasa Residence, Cheras South; price identical.",False),
"v0420": (S,1,58,None,"Taman Bukit Suria estate; C typed landed; R lacks district.",False),
"v0424": (S,0,84,None,"Apartment BNM, Subang Jaya, 20 m; phase label ambiguous.",False),
"v0428": (S,2,93,None,"Web: PJS One 1,016 sqft units = R; price agrees.",True),
"v0432": (S,0,90,None,"BB Wangsa Maju Seksyen 2 flats; price agrees.",False),
"v0436": (S,1,96,None,"Putra Place, Penang; price identical.",False),
"v0440": (D,None,65,None,"R is Sunway Velocity phase 1 (web, freehold); candidates are Velocity Two/3.",True),
"v0444": (S,0,92,None,"Flat Sri Rasau; PSF identical.",False),
"v0448": (S,0,85,None,"Seri Sempadan, Ayer Itam; name, no price.",False),
"v0452": (S,0,86,None,"PPR Kampung Limau, 29 m; C price not at PPR level.",False),
"v0456": (S,0,90,None,"D'Mayang KLCC; name and location.",False),
"v0460": (S,0,78,None,"Taman Perbadanan Islam Larkin, JB; no price.",False),
"v0464": (S,0,66,None,"Taman Keramat Hujung estate; C price mixed with land.",False),
"v0468": (S,0,93,None,"Eclipse Residence Cyberjaya; price agrees.",False),
"v0472": (S,0,92,None,"Tanah Emas (Golden Sands), JB; 51 m.",False),
"v0476": (S,0,94,None,"K Residence KLCC; price identical.",False),
"v0480": (S,0,94,None,"Twin Arkz, Bukit Jalil; price agrees.",False),
"v0484": (P,1,70,RC,"AU1A flats inside AU 1 (Datuk Keramat) area.",False),
"v0488": (P,0,65,RC,"R is PPR Taman Wahyu phase II; C unnumbered; 145 m.",False),
"v0492": (S,0,94,None,"Desa View Towers; price identical.",False),
"v0496": (S,1,96,None,"Pudu Impian I; price identical.",False),
"v0500": (S,0,90,None,"Ruvena Villa, Taman Putra Perdana (Dengkil); PSF agrees.",False),
"v0504": (S,0,94,None,"UNO Promenade, Sungai Besi; 7 m.",False),
"v0508": (S,1,95,None,"Langat Jaya condo; price identical.",False),
"v0512": (S,0,82,None,"Rumah Pangsa Pandamaran exact; price 27-48% higher.",False),
"v0516": (S,0,90,None,"BB Wangsa Maju Seksyen 1 flats; price agrees.",False),
"v0520": (S,0,88,None,"Villa Aman, Ampang Hilir; price 1.08, PSF 1.34.",False),
"v0524": (S,0,90,None,"Plaza GM apartments; 2 m.",False),
"v0528": (S,0,75,None,"PPR Desa Petaling exact; R price 40% lower.",False),
"v0532": (S,0,62,None,"Taman Batu, Jinjang; PSF matches; generic name, R lacks state.",False),
"v0536": (S,1,80,None,"Dedaun exact, 7 m; luxury few sales, PSF 2.2x.",False),
"v0540": (S,0,65,None,"Bayu Sekamat estate, 23 m; C typed terrace.",False),
"v0544": (S,0,85,None,"Taman Samak Flat; 11 m; Medan Samak is a different condo.",False),
"v0548": (S,1,85,None,"Taman Tun Hussein Onn Flat, Perai; 150 m.",False),
"v0552": (P,0,62,RC,"R condo bucket inside East Ledang township.",False),
"v0556": (S,0,72,None,"Taman Bukit Permai, Ampang; PSF agrees; mixed estate.",False),
"v0560": (P,0,58,RC,"Condo inside Taman Serdang Perdana; CHCC unidentified (web).",True),
"v0564": (S,0,72,None,"Taman Bayu Puteri estate row covering Bayu Puteri 1-3.",False),
"v0568": (S,1,72,None,"Apartments of Taman Austin Perdana; 128 m.",False),
"v0572": (S,0,88,None,"BSP 21 serviced apartments; price 23% lower.",False),
"v0576": (S,0,95,None,"Eaton Residences KLCC; PSF identical.",False),
"v0580": (S,1,78,None,"Pangsapuri Puchong Permai; price agrees.",False),
"v0584": (S,1,96,None,"Springfield, Sungai Ara; price identical.",False),
"v0588": (P,1,76,CR,"R is Calisa Residences; C is tower Calisa M.",False),
"v0592": (S,2,97,None,"Paragon Residences @ Straits View; price identical.",False),
"v0596": (S,1,90,None,"C alias Tunas Residency; 17 m; price agrees.",False),
"v0600": (S,0,75,None,"Taman D'Utama Baru flat; 122 m; no price.",False),
"v0604": (S,2,65,None,"Gasing Indah estate flats; PSF agrees; estate duplicated across PJ/KL.",False),
"v0608": (S,0,72,None,"Web: Lavender Park is Taman Kemacahaya's alias; R is its flats.",True),
"v0612": (S,0,92,None,"Grande Residences (Pangsapuri Seri Mewah), Butterworth; 41 m.",False),
"v0616": (S,3,66,None,"Pangsapuri Cempaka in Taman Salak Maju; price agrees.",False),
"v0620": (S,1,92,None,"Green Acre Park, Sungai Long; price agrees.",False),
"v0624": (S,1,93,None,"Sunny Ville, Desa Riang, Batu Uban; price agrees.",False),
"v0628": (U,0,50,None,"Sri Sarawak is 663 sqft low-cost (web); R implies 915 sqft units.",True),
"v0632": (S,0,72,None,"Seri Warisan, Sepang; price agrees; 14 km apart.",False),
"v0636": (P,0,80,CR,"R covers all Taman Raintree condos; C is the Penaga block.",False),
"v0640": (S,0,90,None,"Menara Bintang Goldhill; PSF agrees.",False),
"v0644": (S,0,96,None,"Vista Sentul Residence; price identical.",False),
"v0648": (S,0,82,None,"Seri Raja Chulan exact; PSF ratio 1.51 conflicts.",False),
"v0652": (S,1,80,None,"Web: Pangsapuri Persanda, Seksyen 13, serviced apartments.",True),
"v0656": (S,1,94,None,"Apartment Permata, Bandar Perda; price agrees.",False),
"v0660": (S,0,82,None,"Residensi Sateria, completed 2020; the other row is a new launch.",False),
"v0664": (P,1,62,RC,"R flats bucket inside Sungai Ara area row.",False),
"v0668": (S,1,96,None,"The Plaza Condominium TTDI; price identical.",False),
"v0672": (S,1,85,None,"Residensi Lanai, Bukit Jalil; 89 m; no price.",False),
"v0676": (P,0,66,RC,"R condo bucket inside Bandar Cassia township.",False),
"v0680": (S,0,95,None,"Verve Suites KL South; price agrees.",False),
"v0684": (S,1,93,None,"Petaling Indah condo; price agrees.",False),
"v0688": (P,1,68,CR,"R covers Taman Damai Mewah apartments; C is block A.",False),
"v0692": (P,0,65,RC,"R flats bucket inside Bandar Seberang Jaya.",False),
"v0696": (S,1,94,None,"Rimbun @ Embassy Row; price identical.",False),
"v0700": (S,0,95,None,"West Court, Taman Sri Sentosa; price agrees.",False),
"v0704": (S,0,90,None,"Seri Anugerah, JB; 52 m; PSF within 10%.",False),
"v0708": (P,2,62,RC,"Pandan Heights apartment inside Taman Pandan Perdana.",False),
"v0712": (S,1,88,None,"Taman Terubong Indah; price agrees; C alias Majestic Heights questionable.",False),
"v0716": (S,0,88,None,"Ritze Perdana 1; 27 m; price agrees.",False),
"v0720": (S,0,88,None,"Taman Gombak Permai; price agrees.",False),
"v0724": (S,0,92,None,"USJ One (You One); 79 m.",False),
"v0728": (S,1,82,None,"Flat Sentul Utama in Sentul Murni; price identical.",False),
"v0732": (S,0,65,None,"Taman Maharani Ayu, Muar, estate; C typed cluster.",False),
"v0736": (S,0,62,None,"Flat Thamby Abdullah, 217 m; R prices anomalous.",False),
"v0740": (S,0,82,None,"Taman Desa Relau Flat; 90 m.",False),
"v0744": (S,0,82,None,"Web: Straits Garden 2016 blocks (suites + condo); Plot A is this project.",True),
"v0748": (S,0,93,None,"Queens Residences Q1 exact; umbrella row price agrees.",False),
"v0752": (S,0,86,None,"Lake View Suites, JB; name exact; no price.",False),
"v0756": (S,0,92,None,"D'Tasek Residences (Tasek Impian); 31 m.",False),
"v0760": (S,0,86,None,"Villa Lagenda Condo, Selayang-KL border; 65 m.",False),
"v0764": (S,0,94,None,"Kampar Lake Campus; 44 m.",False),
"v0768": (S,0,88,None,"Flat Taman Bukit Angkasa; estate price agrees.",False),
"v0772": (S,0,62,None,"Taman Happy Valley mixed estate; R price unlike the apartment row.",False),
}
cases = [json.loads(l) for l in open(IN)]
assert len(cases) == len(V), (len(cases), len(V))
out = []
for c in cases:
    cid = c["case"]
    verdict, cand, conf, rel, reason, web = V[cid]
    ks = {x["k"] for x in c["catalogue_candidates"]}
    if cand is not None:
        assert cand in ks, (cid, cand, ks)
    if verdict == D:
        assert cand is None, cid
    if verdict == P:
        assert rel in (RC, CR), cid
    else:
        assert rel is None, cid
    assert len(reason.split()) <= 20, (cid, len(reason.split()), reason)
    out.append({"case": cid, "verdict": verdict, "cand": cand, "confidence_pct": conf,
                "relation": rel, "reason": reason, "web": web})
with open(OUT, "w") as f:
    for o in out:
        f.write(json.dumps(o, ensure_ascii=False) + "\n")
from collections import Counter
print("lines:", len(out))
print(Counter(o["verdict"] for o in out))
print(">=90:", sum(o["confidence_pct"] >= 90 for o in out))
print("web:", sum(o["web"] for o in out))
print("PART_OF relations:", Counter(o["relation"] for o in out if o["verdict"] == P))
