/* =============================================================================
   portal/Worksheets.jsx — interactive worksheets (portal side):
   • RecommenderWorksheet — strengths + development areas per recommender
   • EngagementWorksheet  — sample emails, per-school notes/questions, intro
   • EngagementTracker    — outreach log + events attended
   All auto-save to the shared store (KHSync) per client, and surface read-only
   in the admin. Exposes window.RecommenderWorksheet / EngagementWorksheet /
   EngagementTracker and the shared ws* helpers.
   ============================================================================= */

const WS = window.WORKSHEETS;
// Live lookup, not a frozen snapshot: KHSync.DEMO_ID only becomes the real
// signed-in client's id once App.jsx's applyClientSession() runs (after this
// script has already loaded), so capturing it once at parse time would pin
// every unscoped worksheet call to whatever id existed before sign-in.
function wsDemoId() { return (window.KHSync && KHSync.DEMO_ID) || 'elior-lazarov'; }

/* ---- persistence (one key per worksheet inside the client's store) -------- */
function wsRead(key, fallback, cid) {
  try { if (window.KHSync) { const s = KHSync.read(cid || wsDemoId()); if (s && s.worksheets && s.worksheets[key] != null) return s.worksheets[key]; } } catch (e) {}
  return (typeof fallback === 'function') ? fallback() : fallback;
}
function wsWrite(key, value, cid) {
  if (!window.KHSync) return;
  const id = cid || wsDemoId();
  const s = KHSync.read(id) || {};
  const worksheets = Object.assign({}, s.worksheets, { [key]: value });
  KHSync.patch(id, { worksheets });
  wsCodataSave(id, key, value);
}
// Cross-device durability: localStorage only mirrors within one browser, so a
// client's entry on their own device would never reach Karen's admin on hers.
// Push the same patch into Codata's consultantNotes.meta.worksheets, scoped by
// whichever side is calling (the client's own session, or admin editing any
// client's record — used for the editable Test Score Log).
async function wsCodataSave(cid, key, value) {
  try {
    if (window.CodataAPI && CodataAPI.getCurrentClientId && CodataAPI.getCurrentClientId() === cid) {
      const { meta } = await CodataAPI.getClientMeta();
      await CodataAPI.saveClientMeta({ worksheets: Object.assign({}, meta.worksheets, { [key]: value }) });
    } else if (window.CodataAdmin && CodataAdmin.saveClientMetaById) {
      const meta = await CodataAdmin.getClientMetaRaw(cid);
      await CodataAdmin.saveClientMetaById(cid, { worksheets: Object.assign({}, meta.worksheets, { [key]: value }) });
    }
  } catch (e) { console.error('Codata worksheet save failed:', e); }
}
// debounced autosave hook (client-aware)
function useWorksheet(key, fallback, cid) {
  const [val, setVal] = React.useState(() => wsRead(key, fallback, cid));
  const [saved, setSaved] = React.useState('idle');
  const t = React.useRef(null);
  const set = (next) => {
    setVal(next); setSaved('saving');
    if (t.current) clearTimeout(t.current);
    t.current = setTimeout(() => { wsWrite(key, next, cid); setSaved('saved'); }, 500);
  };
  return [val, set, saved];
}

/* schools the client is targeting (seed) */
function wsTargetSchools(cid) {
  // Prefer the portal's live schools state (Codata-backed, access-filtered)
  if (window.__portalSchools && window.__portalSchools.length) {
    return window.__portalSchools.filter(s => s.access !== false).map(s => ({ key: s.key, name: s.name, short: s.short }));
  }
  try {
    const s = window.KHSync && KHSync.read(cid || wsDemoId());
    if (s && s.schools && s.schools.length) return s.schools.filter(x => x.access !== false).map(x => ({ key: x.key, name: x.name, short: x.short }));
  } catch (e) {}
  return ((window.PORTAL_CONTENT && PORTAL_CONTENT.client.targets) || []).map(n => ({ key: n, name: n, short: n }));
}
// SCHOOLS is defined by schools.js (the canonical master list); just read it.
const WS_SCHOOL_OPTS = (window.SCHOOLS ? SCHOOLS.names : []).concat('Other');

/* ---- shared bits ---------------------------------------------------------- */
function WsHeader({ eyebrow, title, intro }) {
  const { C } = UI;
  return (
    <div style={{ marginBottom: 24 }}>
      <div className="kh-eyebrow">{eyebrow}</div>
      <h1 className="kh-display" style={{ fontSize: 'clamp(28px,3.4vw,42px)', marginTop: 12 }}>{title}</h1>
      {intro && <p style={{ fontFamily: C.serif, fontSize: 15.5, lineHeight: 1.6, color: C.carbon70, marginTop: 14, maxWidth: 720 }}>{intro}</p>}
    </div>
  );
}
function WsSaveBadge({ saved }) {
  const { C } = UI;
  return (
    <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6, fontFamily: C.sans, fontSize: 11, color: C.carbon50 }}>
      {saved === 'saved' && <Icon name="check" size={13} color="var(--sch-completed)" />}
      {saved === 'saving' ? 'Saving…' : saved === 'saved' ? 'Saved' : 'Auto-saves as you type'}
    </span>
  );
}
function wsArea(C) {
  return { width: '100%', fontFamily: C.serif, fontSize: 15, lineHeight: 1.6, color: C.carbon, background: '#fff', border: `1px solid var(--border-rule)`, borderRadius: 2, padding: '11px 13px', outline: 'none', resize: 'vertical', boxSizing: 'border-box' };
}
function wsInput(C) {
  return { width: '100%', fontFamily: C.sans, fontSize: 13.5, color: C.carbon, background: '#fff', border: `1px solid var(--border-rule)`, borderRadius: 2, padding: '9px 11px', outline: 'none', boxSizing: 'border-box' };
}
// Download-date stamp, e.g. 20260622 for June 22, 2026 — used in every worksheet's exported filename.
// Standard download filename: "<Worksheet> <First Last> YYYYMMDD.doc"
function wsFileName(worksheet, clientName, ext) {
  const d = new Date();
  const stamp = '' + d.getFullYear() + String(d.getMonth() + 1).padStart(2, '0') + String(d.getDate()).padStart(2, '0');
  const nm = (clientName || '').trim();
  return [worksheet, nm, stamp].filter(Boolean).join(' ') + '.' + (ext || 'doc');
}
window.wsFileName = wsFileName;

// Resolve the real client name for exported worksheets. PORTAL_CONTENT.client is
// the static demo record (name "Client"), so a signed-in client's exports would
// otherwise be headed "Client". Prefer the live Codata session.
function wsResolveClientName(clientName) {
  if (clientName) return clientName;
  try { if (window.CodataAPI && CodataAPI.getCurrentClient) { const c = CodataAPI.getCurrentClient(); if (c && c.name) return c.name; } } catch (e) {}
  return (window.PORTAL_CONTENT && PORTAL_CONTENT.client && PORTAL_CONTENT.client.name) || 'Client';
}
window.wsResolveClientName = wsResolveClientName;

/* ── Real .docx export ────────────────────────────────────────────────────────
   The worksheet exports used to be HTML with a .doc extension, which some apps
   (Google Docs, Pages, Quick Look) open as raw HTML. This converts the same
   generated HTML into a genuine Word document (OOXML zipped with JSZip). Handles
   the limited element set our builders emit: h1/h2, p (with classes), div.answer,
   tables, <strong>, <br>, <span class="empty">. Falls back to the old HTML .doc
   if JSZip/DOMParser aren't available or anything throws. ──────────────────── */
function wsHtmlToDocxBlob(html) {
  if (!window.JSZip || typeof DOMParser === 'undefined') return null;
  const xe = (s) => String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
  const doc = new DOMParser().parseFromString(html, 'text/html');

  function textRun(text, o) {
    o = o || {};
    if (text === '') return '';
    const rPr = `<w:rPr><w:rFonts w:ascii="Georgia" w:hAnsi="Georgia"/>${o.bold ? '<w:b/>' : ''}${o.italic ? '<w:i/>' : ''}${o.size ? `<w:sz w:val="${o.size}"/>` : ''}${o.color ? `<w:color w:val="${o.color}"/>` : ''}</w:rPr>`;
    const t = String(text).split('\n').map((p, i) => `${i ? '<w:br/>' : ''}<w:t xml:space="preserve">${xe(p)}</w:t>`).join('');
    return `<w:r>${rPr}${t}</w:r>`;
  }
  function inlineRuns(node, inherit) {
    inherit = inherit || {};
    let xml = '';
    node.childNodes.forEach(ch => {
      if (ch.nodeType === 3) xml += textRun(ch.nodeValue, inherit);
      else if (ch.nodeType === 1) {
        const tag = ch.tagName.toLowerCase();
        if (tag === 'br') xml += '<w:r><w:br/></w:r>';
        else if (tag === 'strong' || tag === 'b') xml += inlineRuns(ch, Object.assign({}, inherit, { bold: true }));
        else if (tag === 'span' && (ch.className || '').indexOf('empty') >= 0) xml += inlineRuns(ch, Object.assign({}, inherit, { italic: true, color: '999999' }));
        else xml += inlineRuns(ch, inherit);
      }
    });
    return xml;
  }
  function para(runsXml, o) {
    o = o || {};
    const spacing = (o.before || o.after) ? `<w:spacing ${o.before ? `w:before="${o.before}" ` : ''}${o.after ? `w:after="${o.after}"` : ''}/>` : '';
    const jc = o.align ? `<w:jc w:val="${o.align}"/>` : '';
    const shd = o.shade ? `<w:shd w:val="clear" w:color="auto" w:fill="${o.shade}"/>` : '';
    const bdr = o.box ? '<w:pBdr><w:top w:val="single" w:sz="4" w:space="4" w:color="CCCCCC"/><w:left w:val="single" w:sz="4" w:space="4" w:color="CCCCCC"/><w:bottom w:val="single" w:sz="4" w:space="4" w:color="CCCCCC"/><w:right w:val="single" w:sz="4" w:space="4" w:color="CCCCCC"/></w:pBdr>' : '';
    const pPr = (spacing || jc || shd || bdr) ? `<w:pPr>${spacing}${jc}${bdr}${shd}</w:pPr>` : '';
    return `<w:p>${pPr}${runsXml || ''}</w:p>`;
  }
  function tableXml(table) {
    let trs = '';
    Array.prototype.forEach.call(table.querySelectorAll('tr'), tr => {
      let tcs = '';
      Array.prototype.forEach.call(tr.children, cell => {
        const isH = cell.tagName.toLowerCase() === 'th';
        const runs = inlineRuns(cell, isH ? { bold: true, size: 17 } : { size: 20 });
        tcs += `<w:tc><w:tcPr><w:tcW w:w="0" w:type="auto"/>${isH ? '<w:shd w:val="clear" w:color="auto" w:fill="EEEEEE"/>' : ''}</w:tcPr>${para(runs)}</w:tc>`;
      });
      trs += `<w:tr>${tcs}</w:tr>`;
    });
    const borders = '<w:tblBorders><w:top w:val="single" w:sz="4" w:color="999999"/><w:left w:val="single" w:sz="4" w:color="999999"/><w:bottom w:val="single" w:sz="4" w:color="999999"/><w:right w:val="single" w:sz="4" w:color="999999"/><w:insideH w:val="single" w:sz="4" w:color="CCCCCC"/><w:insideV w:val="single" w:sz="4" w:color="CCCCCC"/></w:tblBorders>';
    return `<w:tbl><w:tblPr><w:tblW w:w="5000" w:type="pct"/>${borders}</w:tblPr>${trs}</w:tbl>${para('')}`;
  }
  function blocksFrom(container) {
    let xml = '';
    container.childNodes.forEach(node => {
      if (node.nodeType !== 1) return;
      const tag = node.tagName.toLowerCase();
      const cls = node.className || '';
      if (tag === 'h1') xml += para(inlineRuns(node, { bold: true, size: 40 }), { after: 40 });
      else if (tag === 'h2') xml += para(inlineRuns(node, { bold: true, size: 24 }), { before: 260, after: 120 });
      else if (tag === 'p') {
        if (cls.indexOf('worksheet-title') >= 0) xml += para(inlineRuns(node, { bold: true, size: 26 }), { after: 40 });
        else if (cls.indexOf('lbl') >= 0) xml += para(inlineRuns(node, { bold: true, size: 19 }), { before: 160, after: 40 });
        else if (cls.indexOf('eyebrow') >= 0) xml += para(inlineRuns(node, { size: 16, color: '6B6B6B' }), { after: 40 });
        else if (cls.indexOf('meta') >= 0) xml += para(inlineRuns(node, { size: 16, color: '6B6B6B' }), { after: 60 });
        else if (cls.indexOf('intro') >= 0) xml += para(inlineRuns(node, { italic: true, color: '444444' }), { after: 120 });
        else xml += para(inlineRuns(node), { after: 80 });
      }
      else if (tag === 'div') {
        if (cls.indexOf('answer') >= 0) xml += para(inlineRuns(node), { box: true, shade: 'FAFAFA', after: 80 });
        else xml += blocksFrom(node);
      }
      else if (tag === 'table') xml += tableXml(node);
    });
    return xml;
  }

  const bodyXml = blocksFrom(doc.body);
  const documentXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body>' + bodyXml + '<w:sectPr><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440"/></w:sectPr></w:body></w:document>';
  const contentTypes = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/></Types>';
  const rels = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/></Relationships>';

  const docRels = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>';
  const zip = new window.JSZip();
  zip.file('[Content_Types].xml', contentTypes);
  zip.folder('_rels').file('.rels', rels);
  const word = zip.folder('word');
  word.file('document.xml', documentXml);
  word.folder('_rels').file('document.xml.rels', docRels);
  return zip.generateAsync({ type: 'blob', mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
}
// Generate a real .docx from worksheet HTML and download it; fall back to the
// legacy HTML .doc if the OOXML path is unavailable or fails.
function wsDownloadDocx(html, filename) {
  const trigger = (blob, nameOverride) => {
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url; a.download = nameOverride || filename;
    document.body.appendChild(a); a.click(); a.remove();
    setTimeout(() => URL.revokeObjectURL(url), 1000);
  };
  const legacy = () => trigger(new Blob(['﻿' + html], { type: 'application/msword' }), filename.replace(/\.docx$/i, '.doc'));
  try {
    const p = wsHtmlToDocxBlob(html);
    if (p && typeof p.then === 'function') p.then(b => trigger(b)).catch(legacy);
    else legacy();
  } catch (e) { legacy(); }
}
window.wsHtmlToDocxBlob = wsHtmlToDocxBlob;
window.wsDownloadDocx = wsDownloadDocx;

window.wsRead = wsRead;
window.useWorksheet = useWorksheet;
window.wsTargetSchools = wsTargetSchools;
window.WsHeader = WsHeader;
window.WsSaveBadge = WsSaveBadge;
window.wsArea = wsArea;
window.wsInput = wsInput;
window.WS_SCHOOL_OPTS = WS_SCHOOL_OPTS;

/* ---- Word (.doc) export for the School Engagement Worksheet --------------- */
function wsEscape(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'); }
function wsPara(text) {
  // preserve line breaks within a field
  return wsEscape(text).replace(/\n/g, '<br/>');
}
function downloadEngagementDoc(cid, clientName) {
  const D = WORKSHEETS.engagement;
  const intro = wsRead('engageIntro', '', cid);
  const schools = wsRead('engageSchools', [], cid) || [];
  const name = window.wsResolveClientName ? wsResolveClientName(clientName) : (clientName || 'Client');

  let body = '';
  body += `<p class="intro">${wsEscape(D.intro)}</p>`;

  // 30-second intro
  body += `<h2>${wsEscape(D.introPrompt)}</h2>`;
  body += `<div class="answer">${intro ? wsPara(intro) : '<span class="empty">[Not yet drafted]</span>'}</div>`;

  // Per-school
  body += `<h2>By school</h2>`;
  if (!schools.length) {
    body += `<div class="answer"><span class="empty">[No schools added yet]</span></div>`;
  } else {
    schools.forEach(sc => {
      body += `<h3>${wsEscape(sc.name)}</h3>`;
      body += `<p class="lbl">${wsEscape(D.perSchool.interestsLabel)}</p><div class="answer">${sc.interests ? wsPara(sc.interests) : '<span class="empty">[Blank]</span>'}</div>`;
      body += `<p class="lbl">${wsEscape(D.perSchool.questionsLabel)}</p><div class="answer">${sc.questions ? wsPara(sc.questions) : '<span class="empty">[Blank]</span>'}</div>`;
      body += `<p class="lbl">${wsEscape(D.perSchool.draftLabel)}</p><div class="answer">${sc.draft ? wsPara(sc.draft) : '<span class="empty">[Blank]</span>'}</div>`;
    });
  }

  // Sample emails appendix (for reference)
  body += `<h2>Sample outreach (for reference)</h2>`;
  body += `<p class="intro">${wsEscape(D.initialOutreachNote)}</p>`;
  D.samples.forEach(s => {
    body += `<h3>${wsEscape(s.title)}</h3><div class="sample">${wsPara(s.body)}</div>`;
  });

  const html = `<!doctype html><html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
<head><meta charset="utf-8"/><title>School Engagement Worksheet — ${wsEscape(name)}</title>
<style>
  body { font-family: Georgia, 'Times New Roman', serif; font-size: 11pt; color: #1d1d1d; line-height: 1.5; }
  .doc-head { border-bottom: 2px solid #1d1d1d; padding-bottom: 10px; margin-bottom: 18px; }
  .eyebrow { font-family: Arial, sans-serif; font-size: 8pt; letter-spacing: 2px; text-transform: uppercase; color: #6b6b6b; }
  h1 { font-family: Arial, sans-serif; font-size: 20pt; margin: 6px 0 4px; }
  .meta { font-family: Arial, sans-serif; font-size: 9pt; color: #6b6b6b; }
  h2 { font-family: Arial, sans-serif; font-size: 12pt; letter-spacing: 1px; text-transform: uppercase; border-bottom: 1px solid #1d1d1d; padding-bottom: 3px; margin: 22px 0 10px; }
  h3 { font-family: Arial, sans-serif; font-size: 11pt; margin: 16px 0 6px; }
  .lbl { font-family: Arial, sans-serif; font-size: 9.5pt; font-weight: bold; margin: 10px 0 3px; }
  .answer { border: 1px solid #cccccc; background: #fafafa; padding: 8px 10px; margin-bottom: 8px; min-height: 18px; }
  .sample { border-left: 3px solid #cccccc; padding: 4px 0 4px 12px; margin-bottom: 10px; color: #333; }
  .intro { color: #444; }
  .empty { color: #999999; font-style: italic; }
</style></head><body>
<div class="doc-head"><div class="eyebrow">Karen Hamou Consulting · School Engagement Worksheet</div><h1>${wsEscape(name)}</h1><div class="meta">Exported ${new Date().toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })}</div></div>
${body}
</body></html>`;

  wsDownloadDocx(html, wsFileName('School Engagement Worksheet', name, 'docx'));
}
window.downloadEngagementDoc = downloadEngagementDoc;

/* ---- Word (.doc) export for the Recommender Packet Worksheet -------------- */
function downloadRecommenderDoc(cid, clientName) {
  const recs = wsRead('recommender', [], cid) || [];
  const name = window.wsResolveClientName ? wsResolveClientName(clientName) : (clientName || 'Client');
  const D = WORKSHEETS.recommender;
  let body = `<p class="intro">${wsEscape(D.intro)}</p>`;
  if (!recs.length) {
    body += `<div class="answer"><span class="empty">[No recommenders added yet]</span></div>`;
  } else {
    recs.forEach((rec, i) => {
      body += `<h2>Recommender ${i + 1}${rec.name ? ' — ' + wsEscape(rec.name) : ''}</h2>`;
      body += `<p class="lbl">Strengths to highlight</p>`;
      body += `<table class="grid"><tr><th>Key strength</th><th>Example</th></tr>`;
      (rec.strengths || []).forEach(s => {
        body += `<tr><td>${s.strength ? wsPara(s.strength) : '<span class="empty">[Blank]</span>'}</td><td>${s.example ? wsPara(s.example) : '<span class="empty">[Blank]</span>'}</td></tr>`;
      });
      body += `</table>`;
      body += `<p class="lbl">Development area — How has this recommender seen you grow?</p><div class="answer">${rec.devFeedback ? wsPara(rec.devFeedback) : '<span class="empty">[Blank]</span>'}</div>`;
      body += `<p class="lbl">Example of improvement</p><div class="answer">${rec.devExample ? wsPara(rec.devExample) : '<span class="empty">[Blank]</span>'}</div>`;
    });
  }
  const html = `<!doctype html><html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
<head><meta charset="utf-8"/><title>Recommender Packet Worksheet — ${wsEscape(name)}</title>
<style>
  body { font-family: Georgia, 'Times New Roman', serif; font-size: 11pt; color: #1d1d1d; line-height: 1.5; }
  .doc-head { border-bottom: 2px solid #1d1d1d; padding-bottom: 10px; margin-bottom: 18px; }
  .eyebrow { font-family: Arial, sans-serif; font-size: 8pt; letter-spacing: 2px; text-transform: uppercase; color: #6b6b6b; }
  h1 { font-family: Arial, sans-serif; font-size: 20pt; margin: 6px 0 4px; }
  .meta { font-family: Arial, sans-serif; font-size: 9pt; color: #6b6b6b; }
  h2 { font-family: Arial, sans-serif; font-size: 12pt; letter-spacing: 1px; text-transform: uppercase; border-bottom: 1px solid #1d1d1d; padding-bottom: 3px; margin: 22px 0 10px; }
  .lbl { font-family: Arial, sans-serif; font-size: 9.5pt; font-weight: bold; margin: 12px 0 4px; }
  .answer { border: 1px solid #cccccc; background: #fafafa; padding: 8px 10px; margin-bottom: 8px; min-height: 18px; }
  table.grid { border-collapse: collapse; width: 100%; margin-bottom: 6px; }
  table.grid th { font-family: Arial, sans-serif; font-size: 9pt; text-transform: uppercase; letter-spacing: 1px; text-align: left; background: #f0efe9; border: 1px solid #cccccc; padding: 6px 9px; }
  table.grid td { border: 1px solid #cccccc; padding: 7px 9px; vertical-align: top; width: 50%; }
  .intro { color: #444; }
  .empty { color: #999999; font-style: italic; }
</style></head><body>
<div class="doc-head"><div class="eyebrow">Karen Hamou Consulting · Recommender Packet Worksheet</div><h1>${wsEscape(name)}</h1><div class="meta">Exported ${new Date().toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })}</div></div>
${body}
</body></html>`;
  wsDownloadDocx(html, wsFileName('Recommender Packet Worksheet', name, 'docx'));
}
window.downloadRecommenderDoc = downloadRecommenderDoc;

/* ---- Word (.doc) export for the Interview Preparation Worksheet ----------- */
function downloadInterviewDoc(cid, clientName) {
  const D = WORKSHEETS.interview;
  const name = window.wsResolveClientName ? wsResolveClientName(clientName) : (clientName || 'Client');
  const general = wsRead('ivGeneral', {}, cid) || {};
  const personal = wsRead('ivPersonal', {}, cid) || {};
  const stories = wsRead('ivStories', [], cid) || [];
  const schools = wsRead('ivSchools', [], cid) || [];
  const ans = (t) => (t && String(t).trim()) ? wsPara(t) : '<span class="empty">[Blank]</span>';

  let body = `<p class="intro">${wsEscape(D.intro)}</p>`;
  body += `<h2>General questions</h2>`;
  D.general.forEach(q => { body += `<p class="lbl">${wsEscape(q.label)}</p><div class="answer">${ans(general[q.id])}</div>`; });
  body += `<h2>Personal qualities</h2>`;
  D.personal.forEach(q => { body += `<p class="lbl">${wsEscape(q.label)}</p><div class="answer">${ans(personal[q.id])}</div>`; });
  body += `<h2>Behavioral questions · STAR stories</h2>`;
  if (!stories.length) body += `<div class="answer"><span class="empty">[No stories yet]</span></div>`;
  else stories.forEach((s, i) => {
    body += `<h3>STAR Story #${i + 1}${s.title ? ' — ' + wsEscape(s.title) : ''}</h3>`;
    [['situation', 'Situation'], ['task', 'Task'], ['action', 'Action'], ['result', 'Result']].forEach(([k, lbl]) => {
      body += `<p class="lbl">${lbl}</p><div class="answer">${ans(s[k])}</div>`;
    });
  });
  body += `<h2>School specifics</h2>`;
  if (!schools.length) body += `<div class="answer"><span class="empty">[No schools added]</span></div>`;
  else schools.forEach(sc => {
    body += `<h3>${wsEscape(sc.name)}</h3>`;
    const a = sc.answers || {};
    body += `<p class="lbl">Interviewer</p><div class="answer">${(a._interviewerName || a._interviewerType) ? wsEscape([a._interviewerName, a._interviewerType].filter(Boolean).join(' · ')) : '<span class="empty">[Blank]</span>'}</div>`;
    D.schoolQuestions.forEach(q => { body += `<p class="lbl">${wsEscape(q.label)}</p><div class="answer">${ans(a[q.key])}</div>`; });
  });

  const html = `<!doctype html><html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
<head><meta charset="utf-8"/><title>Interview Preparation Worksheet — ${wsEscape(name)}</title>
<style>
  body { font-family: Georgia, 'Times New Roman', serif; font-size: 11pt; color: #1d1d1d; line-height: 1.5; }
  .doc-head { border-bottom: 2px solid #1d1d1d; padding-bottom: 10px; margin-bottom: 18px; }
  .eyebrow { font-family: Arial, sans-serif; font-size: 8pt; letter-spacing: 2px; text-transform: uppercase; color: #6b6b6b; }
  h1 { font-family: Arial, sans-serif; font-size: 20pt; margin: 6px 0 4px; }
  .meta { font-family: Arial, sans-serif; font-size: 9pt; color: #6b6b6b; }
  h2 { font-family: Arial, sans-serif; font-size: 12pt; letter-spacing: 1px; text-transform: uppercase; border-bottom: 1px solid #1d1d1d; padding-bottom: 3px; margin: 22px 0 10px; }
  h3 { font-family: Arial, sans-serif; font-size: 11pt; margin: 16px 0 6px; }
  .lbl { font-family: Arial, sans-serif; font-size: 9.5pt; font-weight: bold; margin: 10px 0 3px; }
  .answer { border: 1px solid #cccccc; background: #fafafa; padding: 8px 10px; margin-bottom: 8px; min-height: 16px; }
  .intro { color: #444; }
  .empty { color: #999999; font-style: italic; }
</style></head><body>
<div class="doc-head"><div class="eyebrow">Karen Hamou Consulting · Interview Preparation Worksheet</div><h1>${wsEscape(name)}</h1><div class="meta">Exported ${new Date().toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })}</div></div>
${body}
</body></html>`;

  wsDownloadDocx(html, wsFileName('Interview Preparation Worksheet', name, 'docx'));
}
window.downloadInterviewDoc = downloadInterviewDoc;

/* ---- Word (.doc) export for the Kellogg / MIT Sloan Video Prep Worksheet - */
function downloadVideoPrepDoc(cid, clientName, variant = 'kellogg') {
  const full = variant !== 'mit';
  const kp = full ? 'vp' : 'mvp';
  const D = full ? WORKSHEETS.videoPrep : WORKSHEETS.mitVideoPrep;
  const name = window.wsResolveClientName ? wsResolveClientName(clientName) : (clientName || 'Client');
  const selling = wsRead(kp + 'Selling', [], cid) || [];
  const core = full ? (wsRead('vpCore', {}, cid) || {}) : {};
  const stories = wsRead(kp + 'Stories', [], cid) || [];
  const strengths = full ? (wsRead('vpStrengths', [], cid) || []) : [];
  const funFacts = full ? (wsRead('vpFunFacts', [], cid) || []) : [];
  const ans = (t) => (t && String(t).trim()) ? wsPara(t) : '<span class="empty">[Blank]</span>';

  let body = `<p class="intro">${wsEscape(D.intro)}</p>`;
  body += `<h2>Key selling points</h2>`;
  const sp = selling.filter(x => x && x.trim());
  if (!sp.length) body += `<div class="answer"><span class="empty">[Blank]</span></div>`;
  else body += '<ol>' + sp.map(x => `<li>${wsEscape(x)}</li>`).join('') + '</ol>';
  if (full) {
    body += `<h2>Core questions</h2>`;
    D.coreQuestions.forEach(q => { body += `<p class="lbl">${wsEscape(q.label)}</p><div class="answer">${ans(core[q.id])}</div>`; });
  }
  body += `<h2>STAR stories</h2>`;
  if (!stories.length) body += `<div class="answer"><span class="empty">[No stories yet]</span></div>`;
  else stories.forEach((s, i) => {
    body += `<h3>Story #${i + 1}${s.title ? ' — ' + wsEscape(s.title) : ''}</h3>`;
    body += `<p class="lbl">Selling point(s) this proves</p><div class="answer">${ans(s.sellingPoint)}</div>`;
    [['situation', 'Situation'], ['task', 'Task'], ['action', 'Action'], ['result', 'Result']].forEach(([k, lbl]) => {
      body += `<p class="lbl">${lbl}</p><div class="answer">${ans(s[k])}</div>`;
    });
  });
  if (full) {
    body += `<h2>Strengths &amp; development areas</h2>`;
    const sr = strengths.filter(s => (s.strength && s.strength.trim()) || (s.dev && s.dev.trim()));
    if (!sr.length) body += `<div class="answer"><span class="empty">[Blank]</span></div>`;
    else {
      body += `<h3>Strengths</h3>`;
      sr.forEach((s, i) => { body += `<p class="lbl">Strength ${i + 1}</p><div class="answer">${ans(s.strength)}</div>`; });
      body += `<h3>Development areas</h3>`;
      sr.forEach((s, i) => { body += `<p class="lbl">Development area ${i + 1}</p><div class="answer">${ans(s.dev)}</div>`; });
    }
    body += `<h2>Fun facts</h2>`;
    const ff = funFacts.filter(x => x && x.trim());
    if (!ff.length) body += `<div class="answer"><span class="empty">[Blank]</span></div>`;
    else body += '<ol>' + ff.map(x => `<li>${wsEscape(x)}</li>`).join('') + '</ol>';
  }

  const html = `<!doctype html><html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
<head><meta charset="utf-8"/><title>Video Prep Worksheet — ${wsEscape(name)}</title>
<style>
  body { font-family: Georgia, 'Times New Roman', serif; font-size: 11pt; color: #1d1d1d; line-height: 1.5; }
  .doc-head { border-bottom: 2px solid #1d1d1d; padding-bottom: 10px; margin-bottom: 18px; }
  .eyebrow { font-family: Arial, sans-serif; font-size: 8pt; letter-spacing: 2px; text-transform: uppercase; color: #6b6b6b; }
  h1 { font-family: Arial, sans-serif; font-size: 20pt; margin: 6px 0 4px; }
  .meta { font-family: Arial, sans-serif; font-size: 9pt; color: #6b6b6b; }
  h2 { font-family: Arial, sans-serif; font-size: 12pt; letter-spacing: 1px; text-transform: uppercase; border-bottom: 1px solid #1d1d1d; padding-bottom: 3px; margin: 22px 0 10px; }
  h3 { font-family: Arial, sans-serif; font-size: 11pt; margin: 16px 0 6px; }
  .lbl { font-family: Arial, sans-serif; font-size: 9.5pt; font-weight: bold; margin: 10px 0 3px; }
  .answer { border: 1px solid #cccccc; background: #fafafa; padding: 8px 10px; margin-bottom: 8px; min-height: 16px; }
  .intro { color: #444; }
  .empty { color: #999999; font-style: italic; }
  ol { margin: 0 0 8px 18px; }
  li { margin-bottom: 4px; }
</style></head><body>
<div class="doc-head"><div class="eyebrow">Karen Hamou Consulting · ${full ? 'Kellogg' : 'MIT Sloan'} Video Prep Worksheet</div><h1>${wsEscape(name)}</h1><div class="meta">Exported ${new Date().toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })}</div></div>
${body}
</body></html>`;

  wsDownloadDocx(html, wsFileName('Video Prep Worksheet', name, 'docx'));
}
window.downloadVideoPrepDoc = downloadVideoPrepDoc;
