/* 家庭管理：子女切换 + 勾选横向对比（家长专属） */
function comboTrendOf(child) {
  return ['2025-12','2026-01','2026-02','2026-03','2026-04','2026-05'].map(ym=>{
    const e = child.exams.find(x=>x.date.slice(0,7)===ym && x.seed);
    return e ? Math.round(Selectors.examRate(e)) : null;
  });
}

function Family() {
  const { state, dispatch } = useStore();
  const { go } = useNav();
  // 前端去重：确保同一个 id 只出现一次
  const seenIds = new Set();
  const kids = state.children.filter(k => {
    if (seenIds.has(k.id)) return false;
    seenIds.add(k.id);
    return true;
  });
  const [sel,setSel] = React.useState(kids.map(k=>k.id));
  const [addOpen,setAddOpen] = React.useState(false);
  const [bindUsername,setBindUsername] = React.useState('');
  const [bindDisplayName,setBindDisplayName] = React.useState('');
  const [bindGrade,setBindGrade] = React.useState('小学');
  const [bindLoading,setBindLoading] = React.useState(false);
  const [codeModalOpen,setCodeModalOpen] = React.useState(false);
  const [familyCode,setFamilyCode] = React.useState(null);
  const [codeLoading,setCodeLoading] = React.useState(false);
  const [localToast,setLocalToast] = React.useState(null);
  const needsSetup = state.role === 'parent' && state.requiresFamilySetup;

  React.useEffect(()=>{
    setSel(s=>{
      const kidIds = kids.map(k=>k.id);
      const next = s.filter(id=>kidIds.includes(id));
      return next.length ? next : kidIds;
    });
  }, [kids]);

  const toggle = id => setSel(s=> s.includes(id) ? s.filter(x=>x!==id) : [...s,id]);
  const selKids = kids.filter(k=>sel.includes(k.id));

  const lineColors = ['#4ea3dd','#5fcfa0','#f5a35e','#9b8cf0'];
  const trendLines = selKids.map((c,i)=>({ name:c.name, color:lineColors[i%4], data:comboTrendOf(c), area:i===0 }));
  const allSubs = [...new Set(selKids.flatMap(c=>c.subjectList))];
  const barGroups = selKids.map((c,i)=>{ const avg=Selectors.subjectAvg(c); return { name:c.name, data:allSubs.map(s=>avg[s]?Math.round(avg[s]):0) }; });

  const switchTo = (id)=>{ dispatch({type:'SET_CHILD',childId:id}); go('home'); };
  const showLocalToast = (type, msg)=>{
    setLocalToast({ type, msg });
    setTimeout(()=>setLocalToast(null), 2600);
  };
  const generateFamilyCode = async ()=>{
    if (!state.token) {
      showLocalToast('error', '请先登录后再生成家庭码');
      return;
    }
    setCodeLoading(true);
    try {
      const response = await fetch('/api/family/code', { headers: { Authorization: `Bearer ${state.token}` } });
      const result = await response.json().catch(() => ({}));
      if (!response.ok || !result.success || !result.data || !result.data.code) {
        showLocalToast('error', result.message || '家庭码生成失败，请稍后重试');
        return;
      }
      setFamilyCode(result.data.code);
    } catch (e) {
      showLocalToast('error', '网络异常，家庭码生成失败');
    } finally {
      setCodeLoading(false);
    }
  };
  const copyFamilyCode = async ()=>{
    if (!familyCode) return;
    try {
      await navigator.clipboard.writeText(familyCode);
      showLocalToast('success', '家庭码已复制');
    } catch (e) {
      showLocalToast('error', '复制失败，请手动复制家庭码');
    }
  };
  const openFamilyCodeModal = ()=>{
    setCodeModalOpen(true);
    if (!familyCode) generateFamilyCode();
  };
  const handleBindChild = async ()=>{
    if (!bindUsername.trim()) { showLocalToast('error', '请输入学生的用户名'); return; }
    setBindLoading(true);
    try {
      const resp = await fetch('/api/family/children', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${state.token}` },
        body: JSON.stringify({
          username: bindUsername.trim(),
          displayName: bindDisplayName.trim() || undefined
        })
      });
      const result = await resp.json();
      if (!resp.ok || !result.success) {
        showLocalToast('error', result.message || '绑定失败，请检查用户名是否正确');
        return;
      }
      // 刷新 auth 数据获取最新的子女列表
      const meResp = await fetch('/api/auth/me', {
        headers: { Authorization: `Bearer ${state.token}` }
      });
      const meResult = await meResp.json();
      if (meResp.ok && meResult.success && meResult.data) {
        dispatch({
          type: 'AUTH_SUCCESS',
          token: meResult.data.token,
          user: meResult.data.user,
          children: meResult.data.children,
          nextPage: meResult.data.nextPage,
          message: null
        });
      } else {
        window.location.reload();
      }
      setAddOpen(false);
      setBindUsername('');
      setBindDisplayName('');
      showLocalToast('success', `已成功绑定子女「${result.message || ''}」`);
    } catch (e) {
      showLocalToast('error', '网络异常，绑定失败');
    } finally {
      setBindLoading(false);
    }
  };
  const bindModal = <Modal open={addOpen} onClose={()=>setAddOpen(false)} title="新增绑定子女">
    <div className="field"><label>学生的用户名 <span className="req">*</span></label>
      <input className="input" value={bindUsername} onChange={e=>setBindUsername(e.target.value)} placeholder="输入孩子的学生用户名"/></div>
    <div className="row2">
      <div className="field"><label>家庭展示昵称</label>
        <input className="input" value={bindDisplayName} onChange={e=>setBindDisplayName(e.target.value)} placeholder="方便区分多个孩子"/></div>
      <div className="field"><label>年级学段</label>
        <select className="select" value={bindGrade} onChange={e=>setBindGrade(e.target.value)}>
          <option>小学</option><option>初中</option><option>高中</option>
        </select></div>
    </div>
    <div style={{fontSize:12,color:'var(--ink-3)',lineHeight:1.6,background:'var(--surface-2)',padding:'10px 12px',borderRadius:8}}>
      需要该学生已注册账号。绑定后，家长即可查看该学生的完整学情数据。
    </div>
    <div style={{display:'flex',gap:12,justifyContent:'flex-end',marginTop:22}}>
      <Button variant="ghost" onClick={()=>setAddOpen(false)}>取消</Button>
      <Button variant="warm" onClick={handleBindChild} disabled={bindLoading || !bindUsername.trim()}>
        {bindLoading ? '绑定中...' : '确认绑定'}
      </Button>
    </div>
  </Modal>;
  const codeModal = <Modal open={codeModalOpen} onClose={()=>setCodeModalOpen(false)} title="家庭码">
    <div style={{textAlign:'center'}}>
      <div style={{fontSize:42,fontWeight:900,letterSpacing:8,color:'var(--orange-500)',fontFamily:'var(--font-num)',margin:'6px 0 12px'}}>{codeLoading ? '生成中' : (familyCode || '------')}</div>
      <div style={{fontSize:13.5,color:'var(--ink-2)',lineHeight:1.8,background:'var(--surface-2)',padding:'12px 14px',borderRadius:10,textAlign:'left'}}>请让孩子在学生端输入该 6 位家庭码完成加入。家庭码仅用于绑定当前家长账号和学生账号，请勿公开分享。</div>
      <div style={{display:'flex',gap:12,justifyContent:'flex-end',marginTop:22}}>
        <Button variant="ghost" onClick={()=>setCodeModalOpen(false)}>关闭</Button>
        <Button variant="warm" onClick={copyFamilyCode} disabled={codeLoading || !familyCode}>复制家庭码</Button>
      </div>
    </div>
  </Modal>;
  const localToastNode = localToast ? <div style={{position:'fixed', top:22, left:'50%', transform:'translateX(-50%)', zIndex:999,
    background:'#fff', border:'1px solid var(--line)', borderLeft:`4px solid ${localToast.type === 'error' ? 'var(--coral)' : '#5fcfa0'}`, borderRadius:12,
    padding:'13px 20px', boxShadow:'var(--shadow-lg)', display:'flex', alignItems:'center', gap:10, fontWeight:700, fontSize:13.5, animation:'toastIn .3s'}}>
    <span style={{width:20,height:20,borderRadius:'50%',background:localToast.type === 'error' ? 'var(--coral)' : '#5fcfa0',color:'#fff',display:'grid',placeItems:'center'}}><Ico d={Icons.check} size={13} sw={3.5}/></span>
    {localToast.msg}
  </div> : null;

  if (needsSetup) {
    return <>
      <div className="fam-head">
        <div className="stat" style={{flex:'0 0 auto',padding:'14px 22px',display:'flex',alignItems:'center',gap:14}}>
          <div className="ico bg-orange-soft" style={{margin:0}}><Ico d={Icons.users} size={22}/></div>
          <div><div className="value" style={{fontSize:26}}>待绑定孩子</div><div className="label">添加后可查看学情数据</div></div>
        </div>
        <div style={{marginLeft:'auto',display:'flex',gap:12}}>
          <Button variant="warm" icon={<Ico d={Icons.users} size={17}/>} onClick={openFamilyCodeModal}>生成家庭码</Button>
          <Button variant="warm" icon={<Ico d={Icons.plus} size={17}/>} onClick={()=>setAddOpen(true)}>新增绑定子女</Button>
        </div>
      </div>

      <Card style={{marginBottom:18,background:'var(--orange-50)',borderColor:'var(--orange-100)'}}>
        <div className="card-head"><h3 style={{color:'var(--orange-500)'}}>还没有绑定孩子</h3></div>
        <div style={{fontSize:13.5,color:'var(--ink-2)',lineHeight:1.7}}>请先添加孩子后查看学情。方式一：点击「生成家庭码」分享给学生，学生输入家庭码即可加入；方式二：点击「新增绑定子女」直接输入学生的用户名完成绑定。</div>
      </Card>

      <div className="child-grid">
        <div className="add-card" onClick={()=>setAddOpen(true)}>
          <div className="ac"><Ico d={Icons.plus} size={26}/></div>
          <div style={{fontWeight:700,fontSize:14}}>新增绑定子女</div>
          <div style={{fontSize:12}}>输入学生用户名 · 无绑定数量上限</div>
        </div>
      </div>

      {localToastNode}
      {codeModal}
      {bindModal}
    </>;
  }

  return <>
    <div className="fam-head">
      <div className="stat" style={{flex:'0 0 auto',padding:'14px 22px',display:'flex',alignItems:'center',gap:14}}>
        <div className="ico bg-orange-soft" style={{margin:0}}><Ico d={Icons.users} size={22}/></div>
        <div><div className="value" style={{fontSize:26}}>{kids.length} <small>名子女</small></div><div className="label">已绑定 · 数据实时同步</div></div>
      </div>
      <div style={{marginLeft:'auto',display:'flex',gap:12}}>
        <Button variant="warm" icon={<Ico d={Icons.users} size={17}/>} onClick={openFamilyCodeModal}>生成家庭码</Button>
        <Button variant="warm" icon={<Ico d={Icons.plus} size={17}/>} onClick={()=>setAddOpen(true)}>新增绑定子女</Button>
      </div>
    </div>

    <div className="cmp-bar">
      <Tag tone="orange" dot>已选 {sel.length} 名</Tag>
      <span style={{fontSize:13.5,fontWeight:600,color:'var(--ink-2)'}}>勾选 2 名及以上子女，即可进行横向学情对比（下方图表实时刷新）</span>
    </div>

    <div className="child-grid">
      {kids.map(c=>{
        const on = sel.includes(c.id);
        const prog = Selectors.monthProgress(c);
        return <div className={'child-card '+(on?'sel':'')} key={c.id}>
          <div className="ck-box" onClick={()=>toggle(c.id)}>{on && <Ico d={Icons.check} size={14} sw={3}/>}</div>
          <div className="top"><div className={'avt '+c.avatar}>{c.initial}</div><div><div className="nm">{c.name}</div><div className="gr">{c.grade} · {c.stage}</div></div></div>
          <div className="mts">
            <div className="mt2"><div className="mv">{Selectors.avgRate(c).toFixed(0)}%</div><div className="ml">近期综合得分率</div></div>
            <div className="mt2"><div className="mv" style={{color:'var(--green-600)'}}>{prog>=0?'+':''}{prog}</div><div className="ml">本月进步分</div></div>
          </div>
          <div className="acts" style={{display:'flex',gap:8}}>
            <Button variant="soft" size="sm" onClick={()=>switchTo(c.id)}>查看数据</Button>
            <Button variant="warm" size="sm" onClick={()=>go('family-report')}>生成报告</Button>
          </div>
        </div>;
      })}
      <div className="add-card" onClick={()=>setAddOpen(true)}>
        <div className="ac"><Ico d={Icons.plus} size={26}/></div>
        <div style={{fontWeight:700,fontSize:14}}>新增绑定子女</div>
        <div style={{fontSize:12}}>输入学生用户名 · 无绑定数量上限</div>
      </div>
    </div>

    <div className="section-title"><span className="bar" style={{background:'var(--orange-400)'}}></span>多子女横向对比 <span className="muted" style={{fontWeight:500,marginLeft:6}}>{selKids.map(k=>k.name).join(' vs ')||'请至少勾选一名子女'} · 近6月</span></div>
    {selKids.length>=1 && <>
      <div className="cmp-row" style={{marginBottom:18}}>
        <Card>
          <div className="card-head"><h3>综合得分率趋势</h3><div className="spacer"></div>
            <div style={{display:'flex',gap:6}}>{selKids.map((c,i)=><Tag key={c.id} tone="gray"><span className="dt" style={{background:lineColors[i%4]}}></span>{c.name}</Tag>)}</div>
          </div>
          <EChart option={ChartOpt.trend(MONTH_LABEL, trendLines, 70, 100, true)} height={250}/>
        </Card>
        <Card>
          <div className="card-head"><h3>各科得分率横向对比</h3><div className="spacer"></div></div>
          <EChart option={ChartOpt.barGroup(allSubs, barGroups, 50, 100)} height={250}/>
        </Card>
      </div>
      <Card style={{background:'var(--orange-50)',borderColor:'var(--orange-100)'}}>
        <div className="card-head"><h3 style={{whiteSpace:'nowrap',color:'var(--orange-500)'}}>👨‍👩‍👧‍👦 家庭学情小结</h3><div className="spacer"></div></div>
        <div className="grid g2" style={{gap:16}}>
          {selKids.map(c=>{ const avg=Selectors.subjectAvg(c); const r=c.subjectList.slice().sort((a,b)=>avg[b]-avg[a]); return (
            <div key={c.id} style={{background:'#fff',borderRadius:'var(--r)',padding:16,fontSize:13,lineHeight:1.7,color:'var(--ink-2)'}}>
              <b style={{color:c.avatar==='av-blue'?'var(--blue-600)':'var(--green-600)'}}>{c.name}（{c.grade}）</b>：优势学科 {r[0]}、{r[1]}，{r[r.length-1]} 相对薄弱；整体{Selectors.avgRate(c)>=88?'表现优异':'稳步提升'}，建议针对性辅导。
            </div>
          );})}
        </div>
      </Card>
    </>}

    {localToastNode}
    {codeModal}
    {bindModal}
  </>;
}
Object.assign(window, { Family });