/* ===== Planning tools: hub + Needs / Retirement / Education / Tax ===== */
const { useState:useStatePL } = React;

const PlnSlider = ({label, val, min, max, step, money=true, unit='', onCh}) => (
  <div className="field">
    <label className="flexrow" style={{justifyContent:'space-between'}}>
      <span>{label}</span>
      <b className="navy-t" style={{fontSize:16}}>{money?THB(val):(val.toLocaleString('en-US')+(unit?' '+unit:''))}</b>
    </label>
    <input type="range" min={min} max={max} step={step} value={val} onChange={e=>onCh(+e.target.value)} style={{width:'100%',accentColor:'var(--navy-700)',height:30}}/>
  </div>
);

const ResultStat = ({label, value, color='var(--ink)', big}) => (
  <div className="flexrow" style={{justifyContent:'space-between',alignItems:'baseline',padding:'9px 0'}}>
    <span className="muted" style={{fontSize:14}}>{label}</span>
    <b style={{fontSize:big?22:16,color,letterSpacing:'-.01em'}}>{value}</b>
  </div>
);

// compare bars: target (full) vs have (portion), gap highlighted
const GapBars = ({have, need, color='var(--navy-700)'}) => {
  const max=Math.max(need,have,1);
  return (
    <div className="stack" style={{gap:14}}>
      <div>
        <div className="flexrow" style={{marginBottom:6}}><span style={{fontSize:13.5,fontWeight:600}}>ทุนที่ควรมี</span><div className="spacer"/><b>{THB(need)}</b></div>
        <div style={{height:16,borderRadius:99,background:'var(--line)',overflow:'hidden'}}><div style={{height:'100%',width:(need/max*100)+'%',borderRadius:99,background:color}}/></div>
      </div>
      <div>
        <div className="flexrow" style={{marginBottom:6}}><span style={{fontSize:13.5,fontWeight:600}}>ทุนปัจจุบัน</span><div className="spacer"/><b>{THB(have)}</b></div>
        <div style={{height:16,borderRadius:99,background:'var(--line)',overflow:'hidden'}}><div style={{height:'100%',width:(have/max*100)+'%',borderRadius:99,background:'var(--ok)'}}/></div>
      </div>
    </div>
  );
};

// ---------- Planner hub ----------
const PlannerHub = ({go, back}) => {
  const tools=[
    {k:'triangle',i:'chartBar',t:'พีระมิดวางแผนการเงิน',s:'แมพหลัก — แตะวางแผนทีละชั้น (แนะนำ)',c:'#1e3a8a',hot:true},
    {k:'needs',i:'shieldCheck',t:'คำนวณทุนที่ควรมี',s:'Needs Analysis — ทุนชีวิตที่เหมาะสมกับภาระ',c:'#1e40af'},
    {k:'planInvest',i:'chartBar',t:'วางแผนการลงทุน',s:'จัดพอร์ตตามระดับความเสี่ยง (ผ่าน KYC)',c:'#7c3aed',kyc:true},
    {k:'planRetire',i:'coins',t:'วางแผนเกษียณ',s:'เป้าเงินเกษียณและเงินออมที่ต้องเตรียม',c:'#2547c4'},
    {k:'planEdu',i:'seedling',t:'วางแผนการศึกษาบุตร',s:'ทุนการศึกษาและการออมรายเดือน',c:'#0d9488'},
    {k:'planLegacy',i:'crown',t:'วางแผนมรดก',s:'ส่งต่อความมั่งคั่งอย่างมีประสิทธิภาพ',c:'#d97706'},
    {k:'planTax',i:'wallet',t:'วางแผนภาษี',s:'ลดหย่อนภาษีด้วยประกันชีวิต/บำนาญ',c:'#5b21b6'},
  ];
  return (
    <div className="screen">
      <StatusBar/>
      <AppBar onBack={back} title="เครื่องมือวางแผน" sub="คำนวณและนำเสนอแผนการเงินให้ลูกค้า"/>
      <div className="scroll">
        <div className="pad maxw" style={{paddingTop:4}}>
          <div className="grid2" style={{gap:16}}>
            {tools.map(tl=>(
              <button key={tl.k} className="card" style={{textAlign:'left',padding:22,display:'flex',gap:16,alignItems:'flex-start',position:'relative',border:tl.hot?'1.5px solid var(--gold)':'1px solid var(--line)'}} onClick={()=>go(tl.kyc?'kyc':tl.k, tl.kyc?{next:tl.k}:{})}>
                {tl.hot && <span className="chip gold" style={{position:'absolute',top:16,right:16,height:24,fontSize:11}}>แนะนำ</span>}
                <div style={{width:52,height:52,borderRadius:15,background:tl.c+'18',color:tl.c,display:'flex',alignItems:'center',justifyContent:'center',flex:'0 0 auto'}}><Icon name={tl.i} size={26}/></div>
                <div style={{flex:1}}>
                  <div style={{fontSize:17.5,fontWeight:800}}>{tl.t}</div>
                  <div style={{fontSize:13,color:'var(--muted)',marginTop:3,lineHeight:1.45}}>{tl.s}</div>
                </div>
              </button>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
};

const PlanShell = ({title, sub, back, go, cid, inputs, result}) => (
  <div className="screen">
    <StatusBar/>
    <AppBar onBack={back} title={title} sub={sub}/>
    <div className="scroll">
      <div className="pad maxw" style={{paddingTop:4}}>
        <div className="cols c-2" style={{alignItems:'start'}}>
          <div className="card">{inputs}</div>
          <div className="stack" style={{gap:16}}>{result}</div>
        </div>
      </div>
    </div>
  </div>
);

// ---------- Needs analysis ----------
const NeedsAnalysis = ({go, back, params, toast}) => {
  const cust = params.cid && CUSTOMERS.find(c=>c.id===params.cid);
  const haveDefault = cust ? Object.values(cust.coverage).reduce((a,b)=>a+b,0) : 2000000;
  const [income,setIncome]=useStatePL(cust?cust.income:50000);
  const [years,setYears]=useStatePL(10);
  const [debt,setDebt]=useStatePL(1000000);
  const [depFund,setDep]=useStatePL(2000000);
  const [assets,setAssets]=useStatePL(500000);
  const [have,setHave]=useStatePL(haveDefault);
  const need = Math.max(0, income*12*years + debt + depFund - assets);
  const gap = Math.max(0, need - have);
  return (
    <PlanShell title="คำนวณทุนที่ควรมี" sub={cust?cust.name:'Needs Analysis'} back={back} go={go}
      inputs={<>
        <PlnSlider label="รายได้ต่อเดือน" val={income} min={15000} max={500000} step={5000} onCh={setIncome}/>
        <PlnSlider label="จำนวนปีที่ต้องทดแทนรายได้" val={years} min={1} max={30} step={1} money={false} unit="ปี" onCh={setYears}/>
        <PlnSlider label="หนี้สินคงค้าง" val={debt} min={0} max={20000000} step={100000} onCh={setDebt}/>
        <PlnSlider label="ค่าเลี้ยงดู / ทุนการศึกษาบุตร" val={depFund} min={0} max={20000000} step={100000} onCh={setDep}/>
        <PlnSlider label="สินทรัพย์ / เงินออมที่มี" val={assets} min={0} max={20000000} step={100000} onCh={setAssets}/>
        <div className="divider"/>
        <PlnSlider label="ทุนประกันปัจจุบัน" val={have} min={0} max={30000000} step={100000} onCh={setHave}/>
      </>}
      result={<>
        <div className="navy-panel">
          <div className="glow"/>
          <div style={{fontSize:13,color:'rgba(255,255,255,.7)'}}>ช่องว่างความคุ้มครอง</div>
          <div style={{fontSize:38,fontWeight:800,letterSpacing:'-.02em',marginTop:4,color:gap>0?'var(--gold)':'#4ade80'}}>{THB(gap)}</div>
          <div style={{fontSize:13,color:'rgba(255,255,255,.75)',marginTop:4}}>{gap>0?'ทุนที่ลูกค้ายังขาดเพื่อคุ้มครองครบ':'ความคุ้มครองเพียงพอแล้ว 🎉'}</div>
        </div>
        <div className="card">
          <div className="card-h"><div className="ch-title">เปรียบเทียบทุนประกัน</div></div>
          <GapBars have={have} need={need}/>
          <div className="divider"/>
          <ResultStat label="รายได้ที่ต้องทดแทน" value={THB(income*12*years)}/>
          <ResultStat label="+ หนี้สิน" value={THB(debt)}/>
          <ResultStat label="+ ค่าเลี้ยงดู/การศึกษา" value={THB(depFund)}/>
          <ResultStat label="− สินทรัพย์ที่มี" value={'-'+THB(assets)} color="var(--ok)"/>
          <div className="divider"/>
          <ResultStat label="ทุนที่ควรมีรวม" value={THB(need)} big color="var(--navy-800)"/>
        </div>
        {gap>0 && <button className="btn btn-gold block btn-lg" onClick={()=>cust?go('present',{id:cust.id}):toast('เลือกลูกค้าเพื่อนำเสนอ')}><Icon name="send" size={20}/> นำเสนอแผนเติมเต็มช่องว่าง</button>}
        <ProductRec type="needs" cust={cust} go={go} toast={toast}/>
      </>}/>
  );
};

// ---------- Retirement ----------
const RetirementPlan = ({go, back, toast}) => {
  const [ageNow,setAgeNow]=useStatePL(35);
  const [ageRet,setAgeRet]=useStatePL(60);
  const [expense,setExpense]=useStatePL(30000);
  const [savings,setSavings]=useStatePL(500000);
  const [monthly,setMonthly]=useStatePL(8000);
  const toRet=Math.max(0,ageRet-ageNow), after=Math.max(0,85-ageRet);
  const goal=expense*12*after;
  const projected=Math.round(savings*Math.pow(1.03,toRet) + monthly*12*toRet*1.03);
  const pct=Math.min(100,Math.round(projected/goal*100));
  const gap=Math.max(0,goal-projected);
  const reqMonthly=toRet>0?Math.round(gap/(toRet*12)):0;
  return (
    <PlanShell title="วางแผนเกษียณ" sub="Retirement Planning" back={back} go={go}
      inputs={<>
        <PlnSlider label="อายุปัจจุบัน" val={ageNow} min={20} max={60} step={1} money={false} unit="ปี" onCh={setAgeNow}/>
        <PlnSlider label="อายุที่ต้องการเกษียณ" val={ageRet} min={50} max={70} step={1} money={false} unit="ปี" onCh={setAgeRet}/>
        <PlnSlider label="ค่าใช้จ่ายต่อเดือนหลังเกษียณ" val={expense} min={10000} max={200000} step={5000} onCh={setExpense}/>
        <PlnSlider label="เงินออมเพื่อเกษียณปัจจุบัน" val={savings} min={0} max={20000000} step={100000} onCh={setSavings}/>
        <PlnSlider label="ออมเพิ่มต่อเดือน" val={monthly} min={0} max={100000} step={1000} onCh={setMonthly}/>
      </>}
      result={<>
        <div className="card" style={{display:'flex',alignItems:'center',gap:20}}>
          <Ring pct={pct} size={140} stroke={14} color={pct>=100?'#16a34a':pct>=60?'var(--navy-700)':'#f59e0b'}>
            <div style={{fontSize:30,fontWeight:800}} className="navy-t">{pct}%</div>
            <div style={{fontSize:11.5,color:'var(--muted)'}}>ของเป้าหมาย</div>
          </Ring>
          <div style={{flex:1}}>
            <div style={{fontSize:13,color:'var(--muted)'}}>เป้าเงินเกษียณ (ถึงอายุ 85)</div>
            <div style={{fontSize:24,fontWeight:800,letterSpacing:'-.02em'}} className="navy-t">{THBshort(goal)}</div>
            <div style={{fontSize:12.5,color:'var(--muted)',marginTop:8}}>คาดว่าจะมี {THBshort(projected)}</div>
          </div>
        </div>
        <div className="card">
          <ResultStat label="ระยะเวลาออม" value={toRet+' ปี'}/>
          <ResultStat label="เป้าหมายเงินเกษียณ" value={THB(goal)}/>
          <ResultStat label="คาดว่าจะมี ณ เกษียณ" value={THB(projected)} color="var(--ok)"/>
          <div className="divider"/>
          <ResultStat label={gap>0?'ยังขาดอีก':'เกินเป้าหมาย'} value={THB(gap)} big color={gap>0?'var(--gold-600)':'var(--ok)'}/>
        </div>
        {gap>0 && (
          <div className="card" style={{background:'var(--gold-50)',border:'1.5px solid var(--gold)',display:'flex',gap:13,alignItems:'center'}}>
            <Icon name="coins" size={26} c="var(--gold-600)"/>
            <div style={{flex:1,fontSize:14,lineHeight:1.5}}>ควรออมเพิ่มอีก <b className="gold-t">{THB(reqMonthly)}/เดือน</b> เพื่อให้ถึงเป้าเกษียณ — แนะนำประกันบำนาญ</div>
          </div>
        )}
        <ProductRec type="retire" cust={null} go={go} toast={toast}/>
      </>}/>
  );
};

// ---------- Education ----------
const EducationPlan = ({go, back}) => {
  const [childAge,setChildAge]=useStatePL(5);
  const [startAge,setStartAge]=useStatePL(18);
  const [tuition,setTuition]=useStatePL(200000);
  const [yrs,setYrs]=useStatePL(4);
  const [savings,setSavings]=useStatePL(100000);
  const [monthly,setMonthly]=useStatePL(3000);
  const toStart=Math.max(0,startAge-childAge);
  const goal=tuition*yrs;
  const projected=Math.round(savings*Math.pow(1.025,toStart)+monthly*12*toStart);
  const pct=Math.min(100,Math.round(projected/goal*100));
  const gap=Math.max(0,goal-projected);
  const reqMonthly=toStart>0?Math.round(gap/(toStart*12)):0;
  return (
    <PlanShell title="วางแผนการศึกษาบุตร" sub="Education Planning" back={back} go={go}
      inputs={<>
        <PlnSlider label="อายุบุตรปัจจุบัน" val={childAge} min={0} max={17} step={1} money={false} unit="ปี" onCh={setChildAge}/>
        <PlnSlider label="อายุที่เริ่มใช้ทุน" val={startAge} min={6} max={22} step={1} money={false} unit="ปี" onCh={setStartAge}/>
        <PlnSlider label="ค่าเล่าเรียนต่อปี" val={tuition} min={50000} max={1000000} step={10000} onCh={setTuition}/>
        <PlnSlider label="จำนวนปีที่ศึกษา" val={yrs} min={1} max={8} step={1} money={false} unit="ปี" onCh={setYrs}/>
        <PlnSlider label="เงินออมเพื่อการศึกษาปัจจุบัน" val={savings} min={0} max={5000000} step={50000} onCh={setSavings}/>
        <PlnSlider label="ออมเพิ่มต่อเดือน" val={monthly} min={0} max={50000} step={1000} onCh={setMonthly}/>
      </>}
      result={<>
        <div className="card" style={{display:'flex',alignItems:'center',gap:20}}>
          <Ring pct={pct} size={140} stroke={14} color={pct>=100?'#16a34a':'#0d9488'}>
            <div style={{fontSize:30,fontWeight:800,color:'#0d9488'}}>{pct}%</div>
            <div style={{fontSize:11.5,color:'var(--muted)'}}>ของเป้าหมาย</div>
          </Ring>
          <div style={{flex:1}}>
            <div style={{fontSize:13,color:'var(--muted)'}}>ทุนการศึกษาที่ต้องเตรียม</div>
            <div style={{fontSize:24,fontWeight:800,letterSpacing:'-.02em',color:'#0d7a6f'}}>{THBshort(goal)}</div>
            <div style={{fontSize:12.5,color:'var(--muted)',marginTop:8}}>เริ่มใช้ในอีก {toStart} ปี</div>
          </div>
        </div>
        <div className="card">
          <ResultStat label="ทุนการศึกษารวม" value={THB(goal)}/>
          <ResultStat label="คาดว่าจะมี" value={THB(projected)} color="var(--ok)"/>
          <div className="divider"/>
          <ResultStat label={gap>0?'ยังขาดอีก':'เพียงพอแล้ว'} value={THB(gap)} big color={gap>0?'#0d9488':'var(--ok)'}/>
        </div>
        {gap>0 && (
          <div className="card" style={{background:'#effdfa',border:'1.5px solid #5eead4',display:'flex',gap:13,alignItems:'center'}}>
            <Icon name="seedling" size={26} c="#0d9488"/>
            <div style={{flex:1,fontSize:14,lineHeight:1.5}}>ควรออมเพิ่มอีก <b style={{color:'#0d7a6f'}}>{THB(reqMonthly)}/เดือน</b> — แนะนำประกันสะสมทรัพย์เพื่อการศึกษา</div>
          </div>
        )}
        <ProductRec type="edu" cust={null} go={go} toast={toast}/>
      </>}/>
  );
};

// ---------- Tax ----------
function thaiTax(taxable){
  const b=[[150000,0],[150000,.05],[200000,.10],[250000,.15],[250000,.20],[1000000,.25],[3000000,.30],[Infinity,.35]];
  let tax=0, rem=Math.max(0,taxable);
  for(const [size,rate] of b){ if(rem<=0)break; const amt=Math.min(rem,size); tax+=amt*rate; rem-=amt; }
  return Math.round(tax);
}
const TaxPlan = ({go, back}) => {
  const [income,setIncome]=useStatePL(1200000);
  const [deduct,setDeduct]=useStatePL(150000);
  const [life,setLife]=useStatePL(0);
  const [pension,setPension]=useStatePL(0);
  const expense=Math.min(income*0.5,100000);
  const personal=60000;
  const taxableBefore=Math.max(0, income-expense-personal-deduct);
  const taxableAfter=Math.max(0, taxableBefore-life-pension);
  const taxBefore=thaiTax(taxableBefore), taxAfter=thaiTax(taxableAfter);
  const saved=taxBefore-taxAfter;
  const max=Math.max(taxBefore,1);
  return (
    <PlanShell title="วางแผนภาษี" sub="ลดหย่อนภาษีด้วยประกัน" back={back} go={go}
      inputs={<>
        <PlnSlider label="รายได้รวมต่อปี" val={income} min={300000} max={10000000} step={50000} onCh={setIncome}/>
        <PlnSlider label="ค่าลดหย่อนอื่น ๆ (มีอยู่)" val={deduct} min={0} max={500000} step={10000} onCh={setDeduct}/>
        <div className="divider"/>
        <div style={{fontSize:13,fontWeight:700,color:'var(--muted)',marginBottom:10}}>เพิ่มลดหย่อนด้วยประกัน</div>
        <PlnSlider label="เบี้ยประกันชีวิต (สูงสุด ฿100,000)" val={life} min={0} max={100000} step={5000} onCh={setLife}/>
        <PlnSlider label="ประกันบำนาญ (สูงสุด ฿200,000)" val={pension} min={0} max={200000} step={5000} onCh={setPension}/>
      </>}
      result={<>
        <div className="navy-panel">
          <div className="glow"/>
          <div style={{fontSize:13,color:'rgba(255,255,255,.7)'}}>ภาษีที่ประหยัดได้</div>
          <div style={{fontSize:38,fontWeight:800,letterSpacing:'-.02em',marginTop:4,color:'var(--gold)'}}>{THB(saved)}</div>
          <div style={{fontSize:13,color:'rgba(255,255,255,.75)',marginTop:4}}>จากการลดหย่อนเบี้ยประกัน {THB(life+pension)}</div>
        </div>
        <div className="card">
          <div className="card-h"><div className="ch-title">เปรียบเทียบภาษี</div></div>
          <div className="stack" style={{gap:14}}>
            <div>
              <div className="flexrow" style={{marginBottom:6}}><span style={{fontSize:13.5,fontWeight:600}}>ก่อนวางแผน</span><div className="spacer"/><b>{THB(taxBefore)}</b></div>
              <div style={{height:16,borderRadius:99,background:'var(--line)',overflow:'hidden'}}><div style={{height:'100%',width:(taxBefore/max*100)+'%',borderRadius:99,background:'var(--danger)'}}/></div>
            </div>
            <div>
              <div className="flexrow" style={{marginBottom:6}}><span style={{fontSize:13.5,fontWeight:600}}>หลังวางแผน</span><div className="spacer"/><b className="navy-t">{THB(taxAfter)}</b></div>
              <div style={{height:16,borderRadius:99,background:'var(--line)',overflow:'hidden'}}><div style={{height:'100%',width:(taxAfter/max*100)+'%',borderRadius:99,background:'var(--ok)'}}/></div>
            </div>
          </div>
          <div className="divider"/>
          <ResultStat label="เงินได้สุทธิ (หลังลดหย่อน)" value={THB(taxableAfter)}/>
          <ResultStat label="ประหยัดภาษี" value={THB(saved)} big color="var(--gold-600)"/>
        </div>
        <ProductRec type="tax" cust={null} go={go} toast={toast}/>
      </>}/>
  );
};

Object.assign(window, { PlnSlider, PlannerHub, NeedsAnalysis, RetirementPlan, EducationPlan, TaxPlan });
