#!/usr/bin/env python3
"""
Build the Hong Kong (/hk) cinematic page from the KL cinematic page.

    python3 tools/apply_hk.py resources/views/cinematic/home.blade.php resources/views/cinematic/hk.blade.php

Every replacement is anchored on text that exists in the KL template (v9.x / v10.x).
The script prints one line per rule: OK, or MISS when the anchor was not found.
A MISS means the KL page changed after v9.9 - fix that one rule by hand (see HANDOFF.md section 5).
Nothing in the KL file is modified.
"""
import re, sys
SRC, DST = sys.argv[1], sys.argv[2]
A = '/cinematic/hk/assets/'          # HK-only assets (films, photos, phone shot)
t = open(SRC, encoding='utf-8').read()
log = []
def lit(name, old, new, n=None):
    global t
    c = t.count(old)
    if c == 0 or (n is not None and c != n): log.append(f'MISS  {name}  (found {c})'); return
    t = t.replace(old, new); log.append(f'OK    {name}  x{c}')
def rx(name, pat, new, flags=re.S):
    global t
    t2, c = re.subn(pat, new, t, flags=flags)
    if c == 0: log.append(f'MISS  {name}'); return
    t = t2; log.append(f'OK    {name}  x{c}')


# ---------------------------------------------------------------- 0. films
rx('film connect',  r"(['\"])(?:[^'\"]*connect-film[^'\"]*\.(?:mp4|webm)|/_blob/b46358d1b5df530dbc2e89ea78231311)\1", f"'{A}connect-film-v2.mp4'")
rx('film beyond A', r"(['\"])(?:[^'\"]*beyond-a[^'\"]*\.(?:mp4|webm)|/_blob/bbe80baddf80a4adbd91560fbf398a76)\1", f"'{A}beyond-a-v2.mp4'")
rx('film beyond B', r"(['\"])(?:[^'\"]*beyond-b[^'\"]*\.(?:mp4|webm)|/_blob/e9b1ccf77703bdcdbb12bb39ec1fa10e)\1", f"'{A}beyond-b.mp4'")
rx('lid-open film', r"(['\"])(?:[^'\"]*lid-open[^'\"]*\.(?:mp4|webm)|/_blob/f7fce263f7693ec20805da670f461739)\1", f"'{A}lid-open.mp4'")
rx('lap_open still', r'(<img class="lapopen"[^>]*src=")[^"]*(")', r'\g<1>' + A + r'lap_open.webp\g<2>')
rx('header comment', r'^\{\{--.*?--\}\}', '{{-- PropertyLab cinematic page, Hong Kong (/hk). Generated from cinematic/home.blade.php by tools/apply_hk.py. Do not hand-edit; rebuild instead. --}}', flags=0)

# ---------------------------------------------------------------- 1. page meta
lit('title', '<title>PropertyLab AI · Cross-border property, decided on evidence</title>', '<title>PropertyLab AI · Hong Kong property, decided on evidence</title>')

# ---------------------------------------------------------------- 2. Discover laptop screen
rx('country tabs', r'<span>&#127469;&#127472; Hong Kong <em>\d+</em></span><span class="on">&#127474;&#127486; Malaysia <em>67</em></span><span>&#127462;&#127466; United Arab Emirates <em>951</em></span>',
   '<span class="on">&#127469;&#127472; Hong Kong <em>319</em></span><span>&#127474;&#127486; Malaysia <em>67</em></span><span>&#127462;&#127466; United Arab Emirates <em>951</em></span>')
lit('price chips', '<span>Under RM 500k</span><span>RM 500k - 900k</span><span>Over RM 900k</span>', '<span>Under HK$6M</span><span>HK$6M - 10M</span><span>Over HK$10M</span>')
rx('quality chips -> districts', r'<div><b>Project quality</b>.*?</div></div>',
   '<div><b>District</b> <small>Kowloon East</small><div class="d-chips q"><span class="on">Kai Tak</span><span>Kwun Tong</span><span>Kowloon City</span><span>To Kwa Wan</span></div></div>')
rx('assumptions', r'<p class="d-assume">.*?</p>',
   '<p class="d-assume"><b>Cashflow assumptions</b> &middot; Default terms: 70% loan &middot; 3.5% interest &middot; 30 years &middot; management fee HK$3/sf. <b>Change &rarr;</b></p>')
rx('project count', r'67 projects &middot; showing 1-24', '319 projects &middot; showing 1-24')
CARD = lambda img,tags,loc,name,dev,price,extra: (f'<div class="d-card"><div class="d-img" style="background-image:url({A}{img})"><u class="tl">Hong Kong</u>{tags}</div>\n'
        f'              <small>{loc}</small><b>{name}</b><small>by {dev}</small><small class="f">From</small><strong>{price}</strong>{extra}</div>\n')
cards = ('<div class="d-grid">\n' +
  CARD('hk-card-1.jpg','<u class="tr">&#9733; Featured</u><u class="br">New Launch</u>','Kai Tak, Kowloon','Kai Tak New Project','Developer (TBC)','HK$7,980,000',
       '\n              <div class="d-tags"><i class="r">vs area value +6%</i><i class="g">Owners 5-10 yrs +74%</i><i class="g">Area +66% since 2015</i></div>') +
  CARD('hk-card-2.jpg','<u class="br">New Launch</u>','Kwun Tong, Kowloon','Kwun Tong project (TBC)','Developer (TBC)','HK$6,880,000','') +
  CARD('hk-card-3.jpg','<u class="br">New Launch</u>','Kowloon City, Kowloon','Kowloon City project (TBC)','Developer (TBC)','HK$8,650,000','') +
  CARD('hk-card-4.jpg','<u class="br">New Launch</u>','To Kwa Wan, Kowloon','To Kwa Wan project (TBC)','Developer (TBC)','HK$5,980,000','') +
  '          </div>\n          <div class="d-map"')
rx('discover cards', r'<div class="d-grid">.*?</div>\s*<div class="d-map"', cards)
rx('discover map labels', r"\[\['(?:Selayang|Dubai Marina)'.*?\]\]\.forEach",
   "[['Kowloon City',150,170,15],['To Kwa Wan',150,330,14],['Kai Tak',330,300,20],['Ngau Chi Wan',470,120,14],['Kowloon Bay',460,250,15],['Ngau Tau Kok',520,330,14],['Kwun Tong',520,430,17],['Hung Hom',150,470,14],['Victoria Harbour',300,560,15]].forEach")
rx('discover map prices', r"\[\['(?:MYR 2\.7M|AED 29\.9M)'.*?\]\]\.forEach",
   "[['HK$7.98M',330,270],['HK$8.65M',190,210],['HK$5.98M',210,370],['HK$6.88M',520,400],['HK$9.2M',380,210],['HK$11.5M',300,360],['HK$6.1M',470,300],['HK$7.4M',560,190],['HK$4.9M',120,420],['HK$13.8M',420,470]].forEach")

# ---------------------------------------------------------------- 3. Evidence laptop screen
rx('EV_BARS', r'const EV_BARS=\[.*?\];',
   'const EV_BARS=[["This project",18618,\'sub\'],["2015",13400],["2016",12300],["2017",14300],["2018",16300],["2019",16400],["2020",15900],["2021",21100],["2022",18500],["2024",19000],["2025",19000],["2026",22300]];')
lit('chart title', 'Median asking PSF, nearest projects', 'Area PSF by year, 13 estates within 2 km')
lit('banner name', '<div><i>&#10016;</i>BINASTRA<br>COCHRANE</div>', '<div><i>&#10016;</i>KAI TAK<br>NEW PROJECT</div>')
lit('banner count', '<div class="count">5 / 11</div>', '<div class="count">1 / 8</div>')
lit('banner meta', '<span class="pill">Preleased</span><small>Serviced Apartment</small><h3>Binastra Cochrane</h3><div class="loc">Kuala Lumpur, Cochrane by Binastra Group</div>',
    '<span class="pill">New launch</span><small>Residential</small><h3>Kai Tak New Project</h3><div class="loc">Kai Tak, Kowloon East, Hong Kong</div>')
lit('banner price', '<div class="price">RM 655,000 to RM 1,250,000</div>', '<div class="price">From HK$7,980,000</div>')
rx('unit chips', r'<div class="ev-units">Current unit.*?</div>\s*</div>',
   '<div class="ev-units">Current unit\n            <div class="ev-chip">1 Bed<small>Not disclosed</small></div>\n            <div class="ev-chip on">2 Bed<small>HK$7,980,000</small></div>\n            <div class="ev-chip">3 Bed<small>Not disclosed</small></div>\n          </div>')
lit('DMA unit label', '<span style="font-weight:400;color:#7b86a0;font-size:13px">Type A</span>', '<span style="font-weight:400;color:#7b86a0;font-size:13px">2 Bed, 429 sf</span>')
rx('KPIs', r'<div class="ev-kpis">.*?</div>\s*<div class="ev-row">',
   '<div class="ev-kpis">\n              <div class="ev-kpi ev-fade"><div class="l">YOUR PRICE (NEW)</div><div class="v" data-count="7981800" data-pre="HK$">HK$7,981,800</div><div class="s">2 bed, 429 sf, HK$18,618 psf</div></div>\n'
   '              <div class="ev-kpi pred ev-fade"><div class="l">AREA COMPOSITE VALUE</div><div class="v" data-count="7530000" data-pre="HK$">HK$7,530,000</div><div class="s">HK$17,564 psf, range HK$16,969 - 19,329</div></div>\n'
   '              <div class="ev-kpi fair ev-fade"><div class="l">FAIR PRICE CHECK</div><div class="v">Close to fair</div><div class="s">6% above area composite value</div></div>\n            </div>\n            <div class="ev-row">')
lit('comparables chip', '29 properties', '13 estates')
lit('comparables count', 'from the nearest 13 projects', 'from 6 comparable completed estates')
rx('evidence map labels', r'\[\["Kuala Lumpur",150,120,15\].*?\]\],', '[["Kai Tak",170,215,15],["Kowloon City",110,95,12],["Ngau Tau Kok",330,90,12],["Kwun Tong",320,280,11]],')
lit('chart y max', 'YB=262,YT=16,YM=3100', 'YB=262,YT=16,YM=24000')
lit('chart y ticks', '[0,500,1000,1500,2000,2500,3000].forEach', '[0,4000,8000,12000,16000,20000,24000].forEach')
lit('chart currency', '>RM ${t.toLocaleString', '>HK$${t.toLocaleString')
lit('bar colours', 'v>2000?C.r:v>1500?C.o:v>1200?C.y:C.g', 'v>21000?C.r:v>18000?C.o:v>15000?C.y:C.g')
lit('predicted line', 'Y(1002)', 'Y(17564)')
lit('predicted label', "'Predicted RM 1,002'", "'Area value HK$17,564'")
lit('phone chart max', 'PYM=3100', 'PYM=24000')
lit('phone chart ticks', '[0,1000,2000,3000].forEach(v=>ps+=', '[0,8000,16000,24000].forEach(v=>ps+=')
lit('stats asking', '<div>Median asking PSF<b data-count="1082" data-pre="RM ">RM 1,082</b></div>', '<div>Area PSF 2026<b data-count="22300" data-pre="HK$">HK$22,300</b></div>')
lit('stats transacted', '<div>Median transacted PSF<b data-count="1057" data-pre="RM ">RM 1,057</b></div>', '<div>Owners 5-10 yrs, median<b data-count="74" data-pre="+" data-post="%">+74%</b></div>')
lit('stats predicted', '<div class="pr">Predicted PSF<b data-count="1002" data-pre="RM ">RM 1,002</b></div>', '<div class="pr">Area value PSF<b data-count="17564" data-pre="HK$">HK$17,564</b></div>')

# ---------------------------------------------------------------- 4. Evidence phone
lit('phone project', '<div><b>Binastra Cochrane</b><small>Type A, 2 bed, 649 sqft</small></div><div class="pr">RM 649,620</div>',
    '<div><b>Kai Tak New Project</b><small>2 bed, 429 sf</small></div><div class="pr">HK$7.98M</div>')
lit('phone price', '<b data-count="649620" data-pre="RM ">RM 649,620</b></div><div class="ps">649 sqft, RM 1,001 psf</div>',
    '<b data-count="7981800" data-pre="HK$">HK$7,981,800</b></div><div class="ps">429 sf, HK$18,618 psf</div>')
lit('phone predicted value', '<b data-count="650298" data-pre="RM ">RM 650,298</b>', '<b data-count="7530000" data-pre="HK$">HK$7,530,000</b>')
lit('phone predicted psf', 'RM 1,002 psf from 6 comparable completed estates', 'HK$17,564 psf, 6 comparable estates')
lit('phone predicted label', '<div class="pl">Predicted market value</div>', '<div class="pl">Area composite value</div>')
lit('phone fair', '<div class="pc fair"><div class="pl">Fair price check</div><div class="pv"><b>Fairly priced</b></div><div class="ps">0.1% below predicted value</div></div>',
    '<div class="pc fair"><div class="pl">Fair price check</div><div class="pv"><b>Close to fair</b></div><div class="ps">6% above area composite value</div></div>')
lit('phone stats', '<span>Asking<b data-count="1082" data-pre="RM ">RM 1,082</b></span><span>Transacted<b data-count="1057" data-pre="RM ">RM 1,057</b></span><span class="p">Predicted<b data-count="1002" data-pre="RM ">RM 1,002</b></span>',
    '<span>2026<b data-count="22300" data-pre="HK$">HK$22,300</b></span><span>5-10 yrs<b data-count="74" data-pre="+" data-post="%">+74%</b></span><span class="p">Value<b data-count="17564" data-pre="HK$">HK$17,564</b></span>')
lit('phone rent', '<b data-count="2450" data-pre="RM ">RM 2,450</b><span>/ month</span>', '<b data-count="16600" data-pre="HK$">HK$16,600</b><span>/ month</span>')
lit('phone rent range', '<span>RM 1,700</span><span>median of 10 nearby units</span><span>RM 3,900</span>', '<span>HK$14,000</span><span>rent estimate, 2-bed</span><span>HK$19,500</span>')
lit('rent marker', '(2450-1700)/(3900-1700)', '(16600-14000)/(19500-14000)')
lit('phone instalment', '<b data-count="2589" data-pre="RM ">RM 2,589</b><span>/ month</span></div>\n          <div class="ps">90% loan, 4.0% interest, 35 years</div>',
    '<b data-count="25089" data-pre="HK$">HK$25,089</b><span>/ month</span></div>\n          <div class="ps">70% loan, 3.5% interest, 30 years</div>')
rx('phone cashflow', r'<div class="wf"><span>Rental</span>.*?<div class="net"><span>Net cashflow</span><b data-count="366"[^<]*</b>',
   '<div class="wf"><span>Rental</span><i><b class="wb in" data-w=".66"></b></i><em>+16,600</em></div>\n          <div class="wf"><span>Instalment</span><i><b class="wb out" data-w="1"></b></i><em>&minus;25,089</em></div>\n          <div class="wf"><span>Management</span><i><b class="wb mt" data-w=".05"></b></i><em>&minus;1,290</em></div>\n          <div class="net"><span>Net cashflow</span><b data-count="9779" data-pre="&minus;HK$" data-post=" / mo">&minus;HK$9,779 / mo</b>')
lit('roi ring text', 'id="roiTxt">8.1%</text>', 'id="roiTxt">+74%</text>')
lit('roi ring label', '>ROI p.a.</text>', '>5-10 yr hold</text>')
lit('roi ring anim', "251.3*(1-.81*ra));$('roiTxt').textContent=(8.1*ra).toFixed(1)+'%'", "251.3*(1-.74*ra));$('roiTxt').textContent='+'+Math.round(74*ra)+'%'")
lit('roi stats', '<div>Projected ROI<b data-count="8.1" data-dec="1" data-post="%">8.1%</b></div><div>Gross yield<b data-count="4.5" data-dec="1" data-post="%">4.5%</b></div><div>Break-even rent<b data-count="2816" data-pre="RM ">RM 2,816</b></div>',
    '<div>Owners 10+ yrs<b data-count="167" data-pre="+" data-post="%">+167%</b></div><div>Gross yield<b data-count="2.5" data-dec="1" data-post="%">2.5%</b></div><div>Real resales<b data-count="2272">2,272</b></div>')

# ---------------------------------------------------------------- 5. AI + Plan
lit('question', 'Is Binastra Cochrane Type A a good buy for me?', 'Is the Kai Tak 2-bed a good buy for me?')
lit('conversation list', '<div class="ai-conv on">Binastra Cochrane, Type A</div><div class="ai-conv">Rental yield vs cashflow</div><div class="ai-conv">Dual-key studios in KL</div><div class="ai-conv">Dubai vs Kuala Lumpur</div>',
    '<div class="ai-conv on">Kai Tak New Project, 2 Bed</div><div class="ai-conv">Hold period vs real gains</div><div class="ai-conv">Kowloon East new launches</div><div class="ai-conv">Hong Kong vs Shenzhen</div>')
lit('chat header', '<div class="ai-ch">Binastra Cochrane, Type A<div class="ai-ctx"><span>Market value</span><span>Cashflow</span><span>13 comparables</span></div></div>',
    '<div class="ai-ch">Kai Tak New Project, 2 Bed<div class="ai-ctx"><span>Area value</span><span>Real resales</span><span>13 estates</span></div></div>')
lit('answer 1', 'data-t="Short answer: the price is fair, but as a whole-unit rental it costs you about RM 366 a month to hold."',
    'data-t="Short answer: the price is close to fair, 6% above the area value, and owners here who held 5 to 10 years made a median 74%."')
lit('chips desktop', '<div class="ai-chip ok">Fair price<b>0.1% below market</b></div><div class="ai-chip neg">Cashflow<b>&minus;RM 366 / mo</b></div><div class="ai-chip roi">Projected ROI<b>8.1% p.a.</b></div>',
    '<div class="ai-chip ok">Owners 5-10 yrs<b>+74% median</b></div><div class="ai-chip neg">vs area value<b>+6%</b></div><div class="ai-chip roi">Area PSF<b>+66% since 2015</b></div>')
lit('answer 2', 'data-t="Two ways to make the numbers work for you:"', 'data-t="Two things to plan for:"')
lit('answer 3', 'data-t="1. Rent by room. At about RM 2,900 a month in total, cashflow turns positive at +RM 84."',
    'data-t="1. Negotiate toward HK$7.53M, the composite value of 6 comparable completed estates."')
lit('answer 4', 'data-t="2. Hold for the long run. At 3.5% yearly growth, your equity reaches about RM 2.17 million in 35 years."',
    'data-t="2. Treat it as a 5-year-plus hold. As a rental it costs about HK$9,800 a month to carry with a 70% loan."')
lit('answer 5', 'data-t="Want me to turn this into a full purchase plan with your income and budget?"', 'data-t="Want me to turn this into a full purchase plan with your income and budget?"')
lit('actions', '<span>Compare with Type B</span>', '<span>Compare Kowloon East launches</span>')
lit('phone answer 1', 'data-t="The price is fair, but as a whole-unit rental it costs about RM 366 a month to hold."',
    'data-t="Close to fair (+6%), and 5 to 10 year owners here made a median 74%."')
lit('phone chips', '<div class="ai-chip ok">Fair price<b>0.1% below</b></div><div class="ai-chip neg">Cashflow<b>&minus;RM 366</b></div><div class="ai-chip roi">ROI<b>8.1%</b></div>',
    '<div class="ai-chip ok">Owners<b>+74%</b></div><div class="ai-chip neg">vs value<b>+6%</b></div><div class="ai-chip roi">Since 2015<b>+66%</b></div>')
lit('phone answer 2', 'data-t="Rent by room at about RM 2,900 and cashflow turns positive. Hold 35 years and your equity grows to about RM 2.17 million."',
    'data-t="Negotiate toward HK$7.53M and hold 5 years or more. Your equity grows to about HK$6.4 million in 10 years."')
lit('phone plan bar', '&#8592;</span>Binastra Cochrane<span', '&#8592;</span>Kai Tak New Project<span')
lit('phone equity value', '<div class="eqv"><small>RM</small><span id="eqVal">2,165,567</span></div><div class="eqs">Final equity after 35 years</div>',
    '<div class="eqv"><small>HK$</small><span id="eqVal">6,400,831</span></div><div class="eqs">Equity after 10 years</div>')
lit('phone milestones', '<div class="mil"><div>Year 10<b>RM 425,914</b></div><div>Year 20<b>RM 942,632</b></div><div>Loan paid off<b>Year 35</b></div></div>',
    '<div class="mil"><div>Year 3<b>HK$3.47M</b></div><div>Year 5<b>HK$4.24M</b></div><div>Year 10<b>HK$6.40M</b></div></div>')
lit('duo check', 'data-t="Here is my price check on Type A."', 'data-t="Here is my price check on the 2-bed."')
lit('duo verdict', '<span class="pill">&#10003; Fairly priced</span><small>0.1% below market value</small>', '<span class="pill">Close to fair</span><small>6% above area value</small>')
lit('duo gauge', '<span><i class="dm"></i>Market RM 650,298</span><span><i class="dy"></i>You RM 649,620</span>', '<span><i class="dm"></i>Area HK$7.53M</span><span><i class="dy"></i>You HK$7.98M</span>')
lit('duo gauge marks', "cov.querySelector('.mm').style.left=(51.5*g)+'%'; cov.querySelector('.my').style.left=(48.1*g)+'%';",
    "cov.querySelector('.mm').style.left=(50*g)+'%'; cov.querySelector('.my').style.left=(56*g)+'%';")
lit('duo tiles', '<div class="tile neg"><small>Whole unit</small><b>&minus;RM 366</b><small>/ month</small></div><div class="tile pos"><small>Rent by room</small><b>+RM 84</b><small>/ month</small></div>',
    '<div class="tile neg"><small>As a rental</small><b>&minus;HK$9.8k</b><small>/ month</small></div><div class="tile pos"><small>Owners 5-10 yrs</small><b>+74%</b><small>median</small></div>')
lit('plan header', '<span>Binastra Cochrane, Type A</span>', '<span>Kai Tak New Project, 2 Bed</span>')
lit('plan big', '<small>RM</small><span class="eqv">2,165,567</span>', '<small>HK$</small><span class="eqv">6,400,831</span>')
lit('plan sub', '<div class="sub">after 35 years at 3.5% yearly growth</div>', '<div class="sub">after 10 years, 70% loan, 3% yearly growth</div>')
rx('plan table', r'<div class="card amort"><div class="lbl">Amortization schedule.*?</tbody></table></div>',
   '<div class="card amort"><div class="lbl">Amortization schedule <span class="lt">70% loan, HK$25,089 / month</span></div>\n      <table><thead><tr><th>Year</th><th>Value</th><th>Loan balance</th><th>Equity</th></tr></thead><tbody>'
   '<tr><td>Year 1</td><td>8,221,254</td><td>5,480,033</td><td class="e">2,741,221</td></tr>'
   '<tr><td>Year 3</td><td>8,721,928</td><td>5,254,003</td><td class="e">3,467,925</td></tr>'
   '<tr><td>Year 5</td><td>9,253,094</td><td>5,011,609</td><td class="e">4,241,485</td></tr>'
   '<tr><td>Year 7</td><td>9,816,607</td><td>4,751,665</td><td class="e">5,064,942</td></tr>'
   '<tr><td>Year 10</td><td>10,726,872</td><td>4,326,041</td><td class="e">6,400,831</td></tr></tbody></table></div>')
lit('plan cashflow line', '<span>Rent by room: RM 2,900 rent, RM 2,589 instalment, RM 227 maintenance</span><b class="netv">+RM 84 / mo</b>',
    '<span>As a rental: HK$16,600 rent, HK$25,089 instalment, HK$1,290 management</span><b class="netv">&minus;HK$9,779 / mo</b>')
lit('plan summary pills', '<div class="ca sum"><span class="pill ok">&#10003; Fairly priced</span><span class="pill neg">&minus;RM 366 / mo as a whole unit</span></div>',
    '<div class="ca sum"><span class="pill ok">Close to fair, +6%</span><span class="pill neg">&minus;HK$9,779 / mo as a rental</span></div>')
lit('plan intro', 'data-t="Here is your plan. Renting by room is the better setup for this unit."', 'data-t="Here is your plan. Buy it to hold for growth, not for rental income."')
rx('plan compare', r'<div class="rc cmp">.*?</div></div>\s*<div class="rc eqm">',
   '<div class="rc cmp"><div class="opt"><span>As a rental</span><b class="neg">&minus;HK$9.8k</b><small>a month with a 70% loan</small><i><em data-w=".3" style="background:#e5484d"></em></i></div>\n'
   '          <div class="opt best"><span>Hold 10 years <u>Plan</u></span><b class="pos">HK$6.4M</b><small>equity at 3% yearly growth</small><i><em data-w="1" style="background:#3cc27a"></em></i></div></div>\n        <div class="rc eqm">')
lit('plan equity', '<small>Equity in 35 years</small><b>RM 2.17M</b><span class="x">&#8599; 3.3x your purchase price</span>',
    '<small>Equity in 10 years</small><b>HK$6.40M</b><span class="x">&#8599; 2.7x your down payment</span>')
lit('plan slot', '<small>Book a viewing of the Type A show unit</small>', '<small>Book a viewing of the 2-bed show flat</small>')
lit('plan source', 'Based on 13 comparables, 10 nearby rentals and your budget', 'Based on 13 estates, 2,272 real resales and your budget')
lit('plan mobile label', '<div class="lbl">Equity in 35 years</div>', '<div class="lbl">Equity in 10 years</div>')
rx('plan mobile table', r'<table><thead><tr><th>Year</th><th>Loan</th><th>Equity</th></tr></thead><tbody>.*?</tbody></table>',
   '<table><thead><tr><th>Year</th><th>Loan</th><th>Equity</th></tr></thead><tbody><tr><td>Yr 1</td><td>5,480,033</td><td class="e">2,741,221</td></tr><tr><td>Yr 3</td><td>5,254,003</td><td class="e">3,467,925</td></tr><tr><td>Yr 5</td><td>5,011,609</td><td class="e">4,241,485</td></tr><tr><td>Yr 10</td><td>4,326,041</td><td class="e">6,400,831</td></tr></tbody></table>')
lit('plan mobile text', 'data-t="Rent by room and you keep about RM 84 a month. Your equity grows to about RM 2.17 million in 35 years. Book a viewing?"',
    'data-t="Hold it for growth: your equity grows to about HK$6.4 million in 10 years. Book a viewing?"')
rx('EQ data', r'const EQ=\[\[0, 64962, 584658\].*?\]\];',
   'const EQ=[[0,2394540,5587260],[1,2741221,5480033],[2,3098899,5368993],[3,3467925,5254003],[4,3848663,5134924],[5,4241485,5011609],[6,4646779,4883908],[7,5064942,4751665],[8,5496387,4614719],[9,5941537,4472902],[10,6400831,4326041]];')
lit('EQ scale', 'YM=3000000,X=t=>X0+(X1-X0)*t/35', 'YM=7500000,X=t=>X0+(X1-X0)*t/10')
lit('EQ ticks', "[0,1e6,2e6,3e6].forEach(v=>s+=", "[0,2.5e6,5e6,7.5e6].forEach(v=>s+=")
lit('EQ tick label', "${v?'RM '+v/1e6+'M':'RM 0'}", "${v?'HK$'+v/1e6+'M':'HK$0'}")
lit('EQ year labels', '[1,10,20,35].forEach(t=>s+=', '[1,4,7,10].forEach(t=>s+=')
lit('EQ end x', '${X(35)}', '${X(10)}')
lit('EQ tip', 'Y(EQ[35][1])', 'Y(EQ[10][1])')
lit('EQ counter', 'Math.round(2165567*e)', 'Math.round(6400831*e)')
lit('netv counter', '`+RM ${Math.round(84*ease(k2(.45,.62)))} / mo`', "`\u2212HK$${Math.round(9779*ease(k2(.45,.62))).toLocaleString('en-US')} / mo`")
lit('full plan title', '<h3>Your plan for Binastra Cochrane, Type A</h3><p>Prepared by PropertyLab AI from 13 comparables, nearby rents and your budget.</p>',
    '<h3>Your plan for Kai Tak New Project, 2 Bed</h3><p>Prepared by PropertyLab AI from 13 estates, 2,272 real resales and your budget.</p>')
lit('full plan sub', 'Projected equity after 35 years at 3.5% yearly growth', 'Projected equity after 10 years, 70% loan, 3% yearly growth')
rx('full plan cashflow', r'<div class="lbl">Monthly cashflow, rented by room</div>.*?<div class="net"><span>Net cashflow</span><b class="netv">\+RM 84 / mo</b></div>',
   '<div class="lbl">Monthly cashflow, as a rental</div>\n        <div class="wf"><span>Rent</span><i><b data-w=".66" style="background:#3cc27a"></b></i><em>+16,600</em></div>\n        <div class="wf"><span>Instalment</span><i><b data-w="1" style="background:#2f6bff"></b></i><em>&minus;25,089</em></div>\n        <div class="wf"><span>Management</span><i><b data-w=".05" style="background:#9aa6bf"></b></i><em>&minus;1,290</em></div>\n        <div class="net"><span>Net cashflow</span><b class="netv">&minus;HK$9,779 / mo</b></div>')
lit('full plan step 1', 'Book a viewing<small>Binastra Cochrane show unit, Kuala Lumpur</small>', 'Book a viewing<small>Kai Tak show flat, Kowloon East</small>')
lit('full plan step 2', 'Get mortgage pre-approval<small>90% loan at about 4.0%, 35 years</small>', 'Get mortgage pre-approval<small>70% loan at about 3.5%, 30 years</small>')
lit('full plan step 3', '<small>Room-rental setup and tenancy plan</small>', '<small>Hold strategy and leasing setup</small>')

# ---------------------------------------------------------------- 6. Connect + Beyond copy and film captions
lit('connect step 3', 'Offer, booking fee, loan approval, SPA and handover, followed step by step in your PropertyLab app.',
    'Offer, preliminary agreement, mortgage approval, assignment and handover, followed step by step in your PropertyLab app.')
lit('film captions', "const CAPS=['Booking your viewing with a verified partner agent','Meet your licensed partner agent, on the ground in Kuala Lumpur','Viewing confirmed: Saturday 14:00, Binastra Cochrane','Offer, loan, SPA and keys, tracked to the end'];",
    "const CAPS=['Booking your viewing with a verified partner agent','Meet your licensed partner agent, on the ground in Hong Kong','Viewing confirmed: Saturday 14:00, Kai Tak show flat','Offer, mortgage, assignment and keys, tracked to the end'];")
lit('beyond step 3', 'Rent collection, tenant requests and maintenance in your PropertyLab app, even from Hong Kong.',
    'Rent collection, tenant requests and maintenance in your PropertyLab app, even from Shenzhen.')
lit('evidence beat 3', "'Then, the cashflow.'", "'Then, the real gains.'")
lit('beyond film comment', '(film, two parts: KL then Hong Kong)', '(film, two parts: Hong Kong then Shenzhen)')

# ---------------------------------------------------------------- 7. App section phone + footer
rx('app phone shot', r'(<img class="ph4-shot" src=")[^"]*(" alt=")[^"]*(")', r'\g<1>' + A + r'hk-phone-shot.jpg\g<2>PropertyLab app, Analyze: Kai Tak New Project, Hong Kong\g<3>')
lit('app chip 1', '<div class="ph3-chip c1"><i class="dot g"></i>Fairly priced<small>0.1% below market</small></div>', '<div class="ph3-chip c1"><i class="dot g"></i>Owners 5-10 yrs<small>+74% median gain</small></div>')
lit('app chip 2', '<div class="ph3-chip c2"><b>8.1%</b><small>Projected ROI</small></div>', '<div class="ph3-chip c2"><b>+6%</b><small>vs area value</small></div>')
lit('fallback map unit', 'Your unit · KL', 'Your unit · Kai Tak')
lit('fallback map labels', "[['Kuala Lumpur',200,196,12],['Cheras',230,150,9],['Ampang',240,60,9]]", "[['Kai Tak',200,196,12],['Kowloon City',230,150,9],['Kwun Tong',240,60,9]]")
lit('footer note', 'Viewings and transactions are handled by licensed partners. Kuala Lumpur · Hong Kong.', 'Viewings and transactions are handled by licensed partners. Hong Kong · Kuala Lumpur · Dubai.')
lit('cursor comment', 'cursor clicks Binastra Cochrane', 'cursor clicks Kai Tak New Project')
rx('discover link', r'<a class="textlink" href="[^"]*">Open Analyze Property</a>', '<a class="textlink" href="/analyze-property/new-projects?country=hk">Open Analyze Property</a>')

# ---------------------------------------------------------------- 8. style overrides
STYLE = ('<style id="hk-overrides">\n'
 f'.ev-banner{{background:#1b1d24 url({A}hk-banner.jpg) center 40%/cover}}\n'
 '.ev-banner .p1,.ev-banner .p2,.ev-banner .p3,.ev-banner .p4{visibility:hidden}\n'
 f'.ev-thumbs{{background:url({A}hk-thumbs.jpg) left center/auto 100% no-repeat}}\n'
 f'.a-ph{{background-image:url({A}hk-card-1.jpg)}}\n'
 '</style>\n')
lit('style block', '</head>', STYLE + '</head>', n=1)

open(DST, 'w', encoding='utf-8').write(t)
print('\n'.join(log))
miss = sum(l.startswith('MISS') for l in log)
print(f'\n{len(log)-miss} OK, {miss} MISS  ->  {DST}')
sys.exit(1 if miss else 0)
