/* page-forms.jsx — 三级页：创建/发布表单
   submit_event（发布活动） · upload_work（上传作品） · new_post（发布帖子） */

function FBack({ href, label }) { return <a className="back" href={href}><Arrow size={14} />{label}</a>; }

function Seg({ options, value, onChange }) {
  return (
    <div className="seg">
      {options.map((o) => <span key={o} className={'opt' + (value === o ? ' on' : '')} onClick={() => onChange(o)}>{o}</span>)}
    </div>
  );
}

function DoneBox({ title, text, primary, primaryHref, onReset }) {
  return (
    <div className="panel nm-rise" style={{ maxWidth: 640, margin: '0 auto' }}>
      <div className="done-card">
        <span className="check nm-rise"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round"><path d="M5 13l4 4L19 7" /></svg></span>
        <h3>{title}</h3>
        <p>{text}</p>
        <div style={{ display: 'flex', gap: 12, justifyContent: 'center' }}>
          <a href={primaryHref} className="btn btn-accent">{primary}</a>
          <button className="btn" onClick={onReset}>再发布一个</button>
        </div>
      </div>
    </div>
  );
}

function TipCard({ title, items }) {
  return (
    <div className="panel nm-rise">
      <h2 style={{ fontSize: 16 }}>{title}</h2>
      <ul className="tips">{items.map((t, i) => <li key={i}>{t}</li>)}</ul>
    </div>
  );
}

/* 云端模式下的真实文件上传（图片/视频 → Supabase Storage）。本地模式用 image-slot，不显示此控件。 */
function CoverPicker({ db, label, onUrl }) {
  const [busy, setBusy] = React.useState(false);
  const [preview, setPreview] = React.useState(null);
  const [err, setErr] = React.useState('');
  if (!db.cloud) return null;
  const pick = async (e) => {
    const file = e.target.files && e.target.files[0]; if (!file) return;
    setErr(''); setBusy(true);
    const r = await db.uploadMedia(file);
    setBusy(false);
    if (r.ok) { setPreview({ url: r.url, video: /^video\//.test(file.type) }); onUrl(r.url); }
    else setErr(r.error || '上传失败');
  };
  return (
    <div className="fld">
      <label>{label}</label>
      {preview && (preview.video
        ? <video src={preview.url} controls style={{ width: '100%', borderRadius: 14, marginBottom: 10, display: 'block' }} />
        : <img src={preview.url} alt="" style={{ width: '100%', borderRadius: 14, marginBottom: 10, display: 'block' }} />)}
      <input type="file" accept="image/*,video/*" onChange={pick} style={{ fontSize: 14 }} />
      {busy && <div className="muted" style={{ fontSize: 13, marginTop: 8 }}>上传中…</div>}
      {err && <div style={{ color: '#e0524d', fontSize: 13, marginTop: 8, fontWeight: 500 }}>{err}</div>}
    </div>
  );
}

/* ---------------- 发布活动 ---------------- */
const WEEK = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
function fmtDate(v) {
  if (!v) return { date: '待定', day: '' };
  const d = new Date(v + 'T00:00:00');
  if (isNaN(d)) return { date: '待定', day: '' };
  const mm = String(d.getMonth() + 1).padStart(2, '0'), dd = String(d.getDate()).padStart(2, '0');
  return { date: mm + ' / ' + dd, day: WEEK[d.getDay()] };
}

function SubmitEventPage({ routeParam }) {
  const db = useKadaDB();
  const isEnt = routeParam === 'e';
  const [done, setDone] = React.useState(false);
  const [newKey, setNewKey] = React.useState(null);
  const types = isEnt ? ['发布会', '黑客松', '开放日', '训练营', '招聘'] : ['Meetup', '分享会', '工作坊', '黑客松', '直播'];
  const [type, setType] = React.useState(types[0]);
  const [mode, setMode] = React.useState('线下');
  const [f, setF] = React.useState({ title: '', org: '', place: '', date: '', time: '', desc: '', link: '', cover: '' });
  const set = (k) => (e) => setF((s) => ({ ...s, [k]: e.target.value }));
  const back = isEnt ? '#enterprise' : '#community';

  const submit = async (e) => {
    e.preventDefault();
    const dt = fmtDate(f.date);
    const city = mode === '线上' ? '线上' : (f.place || '待定');
    let res;
    if (isEnt) {
      res = await db.addEvent('e', { date: dt.date, title: f.title, company: f.org || '某企业', type, mode, city, status: '报名中', feat: false, desc: f.desc, link: f.link, time: f.time, cover: f.cover });
    } else {
      res = await db.addEvent('c', { date: dt.date, day: dt.day || '周六', time: f.time || '14:00', title: f.title, org: f.org || '社区', mode, city, tag: type, seats: '报名中', hot: false, desc: f.desc, link: f.link, cover: f.cover });
    }
    if (!res || !res.event) return;
    setNewKey((isEnt ? 'e' : 'c') + res.idx);
    setDone(true);
  };

  if (done) return <div className="kc dview"><FBack href={back} label="返回" /><DoneBox title="活动已发布！" text="你的活动已上线并展示在列表中，社区成员现在就能查看详情并报名。" primary="查看活动" primaryHref={'#event/' + newKey} onReset={() => { setF({ title: '', org: '', place: '', date: '', time: '', desc: '', link: '' }); setDone(false); }} /></div>;

  return (
    <div className="kc dview">
      <FBack href={back} label={isEnt ? '返回企业活动' : '返回社区活动'} />
      <div className="dhead"><h1>{isEnt ? '挂出企业活动' : '发布社区活动'}</h1><p className="muted" style={{ margin: 0 }}>{isEnt ? '企业方或社区成员都可提交，无需合作关系。' : '把你的 Meetup、分享会或工作坊提交到咔嗒Lab，让全行业看到。'}</p></div>
      <div className="dcols">
        <form className="dmain" onSubmit={submit}>
          <div className="panel nm-rise">
            <div className="fld"><label>活动名称</label><input className="input" required placeholder="例如：多模态 Agent 实战工作坊" value={f.title} onChange={set('title')} /></div>
            <div className="fld"><label>活动类型</label><Seg options={types} value={type} onChange={setType} /></div>
            <div className="fld"><label>{isEnt ? '主办企业' : '主办方 / 社区'}</label><input className="input" required placeholder={isEnt ? '例如：智谱 AI' : '例如：上海 AI 俱乐部'} value={f.org} onChange={set('org')} /></div>
            <div className="fld-2">
              <div className="fld"><label>形式</label><Seg options={['线下', '线上']} value={mode} onChange={setMode} /></div>
              <div className="fld"><label>{mode === '线上' ? '直播平台' : '城市'}</label><input className="input" placeholder={mode === '线上' ? '如：视频号 / B站' : '如：上海'} value={f.place} onChange={set('place')} /></div>
            </div>
            <div className="fld-2">
              <div className="fld"><label>日期</label><input className="input" type="date" value={f.date} onChange={set('date')} /></div>
              <div className="fld"><label>开始时间</label><input className="input" type="time" value={f.time} onChange={set('time')} /></div>
            </div>
            <div className="fld"><label>活动简介</label><textarea className="input ta" placeholder="介绍活动议程、嘉宾与亮点…" value={f.desc} onChange={set('desc')} /></div>
            <div className="fld"><label>报名 / 详情链接（可选）</label><input className="input" placeholder="https://…" value={f.link} onChange={set('link')} /></div>
            {!db.cloud && <div className="fld"><label>活动封面（可选）</label><image-slot id="ev-cover" class="form-slot" shape="rounded" radius="14" placeholder="拖入封面图（建议 16:9）"></image-slot></div>}
            <CoverPicker db={db} label="活动封面（可选，图片/视频，存到云）" onUrl={(u) => setF((s) => ({ ...s, cover: u }))} />
            <button className="btn btn-accent btn-full" type="submit" style={{ marginTop: 8 }}>提交活动 <Arrow /></button>
          </div>
        </form>
        <aside className="dside">
          <TipCard title="发布须知" items={['信息真实、与 AI 主题相关', '线上活动请填写可访问的直播 / 会议链接', '提交后即时上线，展示在列表与详情页', '社区成员可直接报名你的活动']} />
        </aside>
      </div>
    </div>
  );
}

/* ---------------- 上传作品 ---------------- */
function UploadWorkPage() {
  const db = useKadaDB();
  const [done, setDone] = React.useState(false);
  const [newIdx, setNewIdx] = React.useState(null);
  const types = ['模型', '工具', 'Skill', '数据集', 'Agent'];
  const [type, setType] = React.useState('模型');
  const [f, setF] = React.useState({ name: '', task: '', blurb: '', hf: '', gh: '', arxiv: '', cover: '' });
  const set = (k) => (e) => setF((s) => ({ ...s, [k]: e.target.value }));
  const submit = async (e) => {
    e.preventDefault();
    const w = await db.addWork({ name: f.name, type, task: f.task || '通用', blurb: f.blurb, cover: f.cover, links: { hf: f.hf, gh: f.gh, arxiv: f.arxiv } });
    if (!w) return;
    setNewIdx(0); setDone(true);
  };
  if (done) return <div className="kc dview"><FBack href="#demo" label="返回技术广场" /><DoneBox title="作品已发布！" text="你的作品已上线技术广场，社区成员可以查看 README、下载文件并在 Comments 中与你交流。" primary="查看作品" primaryHref={'#demo_item/' + newIdx} onReset={() => { setF({ name: '', task: '', blurb: '', hf: '', gh: '', arxiv: '' }); setDone(false); }} /></div>;
  return (
    <div className="kc dview">
      <FBack href="#demo" label="返回技术广场" />
      <div className="dhead"><h1>上传作品</h1><p className="muted" style={{ margin: 0 }}>发布你的模型、工具、Skill、数据集或 Agent，让社区一键体验与交流。</p></div>
      <div className="dcols">
        <form className="dmain" onSubmit={submit}>
          <div className="panel nm-rise">
            <div className="fld"><label>名称</label><input className="input" required placeholder="例如：中文长文本摘要 Skill" value={f.name} onChange={set('name')} /></div>
            <div className="fld"><label>类型</label><Seg options={types} value={type} onChange={setType} /></div>
            <div className="fld"><label>任务 / 领域</label><input className="input" placeholder="例如：文本摘要、OCR、自主任务…" value={f.task} onChange={set('task')} /></div>
            <div className="fld"><label>简介 README（支持 Markdown）</label><textarea className="input ta" style={{ minHeight: 140 }} placeholder="介绍它能做什么、如何使用、效果如何…" value={f.blurb} onChange={set('blurb')} /></div>
          </div>
          <div className="panel nm-rise">
            <h2 className="with-rule">外部链接（可选）</h2>
            <div className="fld"><label>Hugging Face</label><input className="input" placeholder="https://huggingface.co/…" value={f.hf} onChange={set('hf')} /></div>
            <div className="fld"><label>GitHub</label><input className="input" placeholder="https://github.com/…" value={f.gh} onChange={set('gh')} /></div>
            <div className="fld"><label>arXiv</label><input className="input" placeholder="https://arxiv.org/abs/…" value={f.arxiv} onChange={set('arxiv')} /></div>
          </div>
          <div className="panel nm-rise">
            <h2 className="with-rule">封面与文件</h2>
            {!db.cloud && <div className="fld"><label>封面 / 演示图（可选）</label><image-slot id="work-cover" class="form-slot" shape="rounded" radius="14" placeholder="拖入封面图 / 截图"></image-slot></div>}
            <CoverPicker db={db} label="封面 / 演示图（可选，图片或视频，存到云）" onUrl={(u) => setF((s) => ({ ...s, cover: u }))} />
            <div className="dropzone"><IcUp style={{ width: 26, height: 26 }} /><div className="dz-t">拖拽权重 / 配置 / 文档到此处</div><div className="dz-s">支持 .safetensors / .json / .md / .zip 等</div></div>
            <button className="btn btn-accent btn-full" type="submit" style={{ marginTop: 20 }}>发布作品 <Arrow /></button>
          </div>
        </form>
        <aside className="dside">
          <TipCard title="发布须知" items={['注明开源许可证，便于他人使用', '提供清晰的 README 与使用示例', '图片 / 视频会展示在作品的 Card 页', '尊重数据与模型的版权与来源']} />
        </aside>
      </div>
    </div>
  );
}

/* ---------------- 发布帖子 ---------------- */
function NewPostPage() {
  const db = useKadaDB();
  const [done, setDone] = React.useState(false);
  const kinds = ['讨论', '提问', '作品', '分享'];
  const [kind, setKind] = React.useState('讨论');
  const [f, setF] = React.useState({ title: '', body: '', tags: '', link: '' });
  const [newId, setNewId] = React.useState(null);
  const set = (k) => (e) => setF((s) => ({ ...s, [k]: e.target.value }));
  const submit = async (e) => {
    e.preventDefault();
    const p = await db.addPost({ kind, title: f.title, body: f.body + (f.link ? '\n\n🔗 ' + f.link : ''), tags: f.tags });
    if (!p) return;
    setNewId(p.id); setDone(true);
  };
  if (done) return <div className="kc dview"><FBack href="#post" label="返回社区发帖" /><DoneBox title="帖子已发布！" text="你的帖子已出现在社区发帖里，大家可以点赞、评论与你交流。" primary="查看帖子" primaryHref={'#post_item/' + newId} onReset={() => { setF({ title: '', body: '', tags: '', link: '' }); setKind('讨论'); setDone(false); }} /></div>;
  return (
    <div className="kc dview">
      <FBack href="#post" label="返回社区发帖" />
      <div className="dhead"><h1>发布帖子</h1><p className="muted" style={{ margin: 0 }}>人人都是社区主理人——分享想法、作品或抛出一个问题。</p></div>
      <div className="dcols">
        <form className="dmain" onSubmit={submit}>
          <div className="panel nm-rise">
            <div className="fld"><label>类型</label><Seg options={kinds} value={kind} onChange={setKind} /></div>
            <div className="fld"><label>标题</label><input className="input" required placeholder="一句话说清你想聊什么" value={f.title} onChange={set('title')} /></div>
            <div className="fld"><label>正文</label><textarea className="input ta" style={{ minHeight: 180 }} placeholder="展开说说…支持贴代码、链接与思路" value={f.body} onChange={set('body')} /></div>
            <div className="fld"><label>话题标签</label><input className="input" placeholder="如：#RAG 实践 #Agent 开发（空格分隔）" value={f.tags} onChange={set('tags')} /></div>
            <div className="fld"><label>附件 / Demo 链接（可选）</label><input className="input" placeholder="https://…" value={f.link} onChange={set('link')} /></div>
            <button className="btn btn-accent btn-full" type="submit" style={{ marginTop: 8 }}>发布帖子 <Arrow /></button>
          </div>
        </form>
        <aside className="dside">
          <TipCard title="发帖小贴士" items={['标题具体一点，更容易被看到', '提问时附上你已经试过的方案', '作品贴可以链接到技术广场的条目', '友善交流，拒绝人身攻击']} />
        </aside>
      </div>
    </div>
  );
}

Object.assign(window.__KADA_PAGES = window.__KADA_PAGES || {}, {
  submit_event: { Comp: SubmitEventPage, active: (p) => p === 'e' ? 'enterprise' : 'community' },
  upload_work: { Comp: UploadWorkPage, active: 'demo' },
  new_post: { Comp: NewPostPage, active: 'post' },
});
