/* ============================================================
   昆虫整理人格 · 问卷数据与计分
   1=蝴蝶人，2=蟋蟀人，3=瓢虫人，4=蜜蜂人。
   ============================================================ */

const DIMENSIONS = [
  { key: "butterfly", label: "蝴蝶", full: "蝴蝶人", color: "#E0795F", actor: "透明盒" },
  { key: "cricket", label: "蟋蟀", full: "蟋蟀人", color: "#163A32", actor: "标签机" },
  { key: "ladybug", label: "瓢虫", full: "瓢虫人", color: "#5BA8A0", actor: "置物篮" },
  { key: "bee", label: "蜜蜂", full: "蜜蜂人", color: "#F5B547", actor: "洞洞板" },
];

const PERSONAS = {
  butterfly: {
    name: "蝴蝶人",
    role: "视觉丰富 · 分类简单",
    color: "#E0795F",
    line: "你需要看得见，才更容易记得住、拿得回、放得下。",
    blurb: "蝴蝶人的整理系统适合开放、直观、低门槛：常用物放在视线内，分类不要太细，容器最好一眼就能看出里面是什么。你的重点不是把家变成空无一物，而是让喜欢的东西在可见的位置各归其位。",
    strength: ["视觉化", "开放收纳", "简单分类"],
    tip: "使用透明塑料盒、开放式置物架和清晰标签；先清理不常用的物品，再给常用物安排看得见的位置。",
  },
  cricket: {
    name: "蟋蟀人",
    role: "视觉简洁 · 分类精细",
    color: "#163A32",
    line: "你喜欢外表清爽，也享受把内部秩序分得足够细。",
    blurb: "蟋蟀人的整理系统适合隐藏式、精细化、可追踪：文件、单据、工具都需要明确类别和位置。你会从稳定的规则里获得安心，但也要小心别让系统复杂到别人无法一起使用。",
    strength: ["精细分类", "隐藏收纳", "流程感"],
    tip: "创建够用就好的文件系统；用标签机、短期置物篮、长期整理盒和提醒器来降低维护成本。",
  },
  ladybug: {
    name: "瓢虫人",
    role: "视觉简洁 · 分类简单",
    color: "#5BA8A0",
    line: "你喜欢表面清爽，但柜子和抽屉里也需要足够好拿好放。",
    blurb: "瓢虫人的整理系统适合隐藏式、粗颗粒、轻维护：外面保持整洁，里面不必分得过细。你适合用大类容器承接生活，而不是用过于复杂的子类把自己卡住。",
    strength: ["视觉清爽", "大类归位", "低维护"],
    tip: "定时整理、定期清理；使用抽屉分隔板、开放式整理盒和漂亮置物篮，并为每类物品划分专属存放区。",
  },
  bee: {
    name: "蜜蜂人",
    role: "视觉丰富 · 分类精细",
    color: "#F5B547",
    line: "你需要东西看得见，也需要每一类都有自己的小位置。",
    blurb: "蜜蜂人的整理系统适合开放式、细分类、项目化：工具、材料和正在推进的事项最好都能直观看到，并且被清楚分区。你的优势是把空间变成高效工作台，但也要记得给清理和取舍留时间。",
    strength: ["项目箱", "精细分区", "开放展示"],
    tip: "列优先事项清单；使用洞洞板、透明塑料盒、开放式置物架和玻璃罐，同时练习扔东西与做计划。",
  },
};

const W = {
  1: { butterfly: 1 },
  2: { cricket: 1 },
  3: { ladybug: 1 },
  4: { bee: 1 },
};

function opts(items) {
  return items.map((label, i) => ({
    id: String(i + 1),
    label,
    weights: W[i + 1],
  }));
}

const SURVEY = {
  id: "insect-organizing-style-v1",
  title: "你独特的整理风格是什么？",
  subtitle: "17 个多选小问题，看看你更接近哪一种昆虫整理人格 · 约 5 分钟",
  dimensions: DIMENSIONS,
  personas: PERSONAS,
  source: {
    bookTitle: "让你摆脱混乱的人生整理术",
    author: "卡桑德拉·阿尔森（Cassandra Aarssen）",
    translator: "吴岭",
    publisher: "浙江教育出版社",
    imprint: "湛庐文化",
    published: "2024-4",
    isbn: "9787572277320",
    authorIntro: "作者是加拿大整理界的代表人物，提出了昆虫整理人格系统；她本人也是 ADHD 确诊者，长期分享自己如何从与整理斗争，到建立适合不同大脑和生活方式的整理方法。",
    usageNote: "本页只是把书中问卷做成方便测试的互动版本。若想了解每一种人格的具体整理操作，以及如何与其他昆虫人格共同生活，建议阅读原书；时间不够时，也可以先跳读自己的结果章节。",
  },
  questions: [
    {
      id: "q1", type: "multi", act: "阅读偏好",
      title: "你喜欢阅读：",
      options: opts([
        "有大量图片的读物。",
        "非虚构类读物。",
        "小说类读物。",
        "新闻或指南类读物。",
      ]),
    },
    {
      id: "q2", type: "multi", act: "困扰画像",
      title: "你觉得自己在整理上的最大问题是：",
      options: opts([
        "家里到处都是东西。",
        "不会收纳文件和重要物品。",
        "柜子、壁橱、抽屉和空房间里都比较乱。",
        "囤积了太多将来可能会用的东西。",
      ]),
    },
    {
      id: "q3", type: "multi",
      title: "你家平时看起来：",
      options: opts([
        "比较乱，摆放着平时用的和喜爱的东西。",
        "整洁，偶尔有堆积的文件或还没来得及处理的东西。",
        "非常整洁，但壁橱和抽屉里可能很乱。",
        "有点乱，某些地方放着正在用的东西。",
      ]),
    },
    {
      id: "q4", type: "multi",
      title: "你发现下列很难丢掉的是：",
      options: opts([
        "漂亮的东西。",
        "贵的或仍然好用的东西。",
        "有感情的东西。",
        "日用品、工具和其他还有用的东西。",
      ]),
    },
    {
      id: "q5", type: "multi", act: "空间观察",
      title: "你个人的卧室平时看起来：",
      options: opts([
        "比较乱，摆满了最爱的和常用的东西。",
        "相对整洁，但有时会有一些需要处理的杂物。",
        "比较整洁，但柜子、壁橱、抽屉和看不见的地方很乱。",
        "有点儿乱，有些地方摆着忘记收拾的日用品。",
      ]),
    },
    {
      id: "q6", type: "multi",
      title: "说到打扫家，你一般：",
      options: opts([
        "会先花时间整理，然后再打扫。",
        "会保持家里是干净整洁的。",
        "喜欢收拾家，因此家里相当干净。",
        "想有个真正干净的家，但家里总有堆积的杂物。",
      ]),
    },
    {
      id: "q7", type: "multi", act: "理想系统",
      title: "你理想中的工作室是：",
      options: opts([
        "明亮多彩，日用品都装在漂亮的容器里，摆在置物架上。",
        "所有东西都被分类装在独立的容器中，放在柜子里。",
        "除了一些漂亮的装饰品外，其他东西都放到看不见的地方。",
        "所有的工具都挂在洞洞板上，方便使用。",
      ]),
    },
    {
      id: "q8", type: "multi",
      title: "你理想中的家居环境是：",
      options: opts([
        "明亮有趣，视觉丰富。",
        "功能实用，视觉简洁。",
        "漂亮诱人，视觉简洁。",
        "实用、有条理，视觉丰富。",
      ]),
    },
    {
      id: "q9", type: "multi",
      title: "最适合你的整理系统是：",
      options: opts([
        "简单易上手的开放系统，有挂钩、置物架上的无盖置物篮等。",
        "分类精细的隐藏式整理系统，有文件柜、多隔整理箱等。",
        "易操作的隐藏式整理系统，有柜子里的置物篮、抽屉分隔器等。",
        "细心规划的开放系统，有洞洞板、透明抽屉等。",
      ]),
    },
    {
      id: "q10", type: "multi", act: "日常反应",
      title: "你在整理工作中最大的挑战是：",
      options: opts([
        "不喜欢把东西藏在看不见的地方，怕自己会忘记。",
        "总是还没有安排好时间整理一些地方。",
        "容易忽视家里的隐蔽区域，比如储藏室。",
        "不喜欢把东西放回原处，因为之后还要再拿出来。",
      ]),
    },
    {
      id: "q11", type: "multi",
      title: "如果有朋友打电话说，他将在十分钟后过来，你会：",
      options: opts([
        "疯狂地尽可能把杂物收起来。",
        "稍微整理一下就行。",
        "擦拭台面，藏起乱七八糟的东西，快速擦洗浴室。",
        "继续做手头的事情。",
      ]),
    },
    {
      id: "q12", type: "multi",
      title: "你更喜欢将日用品：",
      options: opts([
        "放在能轻松拿到的地方，不随意乱放。",
        "细致整理，然后收起来。",
        "摆放在视线外，但仍能轻易找出。",
        "为取用方便，整齐摆放在视野内。",
      ]),
    },
    {
      id: "q13", type: "multi", act: "学习与偏好",
      title: "你学新技能的最佳方法是：",
      options: opts([
        "阅读图示加说明文字。",
        "阅读和研究相关内容。",
        "看他人的示范。",
        "由自己摸索。",
      ]),
    },
    {
      id: "q14", type: "multi",
      title: "请选择最能描述你的句子：",
      options: opts([
        "用完东西后，很难把它们放回原位。",
        "有点儿完美主义，力求减少杂物。",
        "喜欢家里看起来一尘不染，会把东西藏在没人看到的地方。",
        "喜欢功能性强的空间，这样做事更容易。",
      ]),
    },
    {
      id: "q15", type: "multi",
      title: "你喜欢将自己心爱的东西：",
      options: opts([
        "随手放在能经常看到的地方。",
        "精选并收纳起来，以便能长久保存。",
        "以赏心悦目、整齐划一的方式放在外面。",
        "根据实用性放在看得见的固定位置。",
      ]),
    },
    {
      id: "q16", type: "multi", act: "风格收束",
      title: "你喜欢怎么装饰自己家：",
      options: opts([
        "陈列着色彩鲜明的艺术品。",
        "采用极简的中性色。",
        "跟随当前的设计趋势。",
        "摆着实用且功能性强的物品。",
      ]),
    },
    {
      id: "q17", type: "multi",
      title: "你希望自己家是什么样的：",
      options: opts([
        "有趣、明亮、舒适。",
        "实用、简洁。",
        "美丽、简洁。",
        "实用、功能多样。",
      ]),
    },
  ],
};

/* ---------- 计分引擎 ---------- */
function scoreSurvey(survey, answers) {
  const raw = {};
  survey.dimensions.forEach((d) => (raw[d.key] = 0));
  const maxRaw = {};
  survey.dimensions.forEach((d) => (maxRaw[d.key] = 0));

  const addW = (w, factor = 1) => {
    if (!w) return;
    Object.entries(w).forEach(([k, v]) => { if (k in raw) raw[k] += v * factor; });
  };
  const addMax = (w, factor = 1) => {
    if (!w) return;
    Object.entries(w).forEach(([k, v]) => { if (k in maxRaw) maxRaw[k] += Math.abs(v) * factor; });
  };

  survey.questions.forEach((q) => {
    const a = answers[q.id];
    if (q.type === "single" || q.type === "image") {
      const perDim = {};
      q.options.forEach((o) => Object.entries(o.weights || {}).forEach(([k, v]) => {
        perDim[k] = Math.max(perDim[k] || 0, v);
      }));
      addMax(perDim);
      if (a != null) {
        const opt = q.options.find((o) => o.id === a);
        addW(opt && opt.weights);
      }
    } else if (q.type === "multi") {
      const cap = q.max || q.options.length;
      q.options.forEach((o) => addMax(o.weights, cap / q.options.length));
      if (Array.isArray(a)) a.forEach((id) => {
        const opt = q.options.find((o) => o.id === id);
        addW(opt && opt.weights);
      });
    } else if (q.type === "scale") {
      const span = (q.max - q.min);
      const norm = a != null ? (a - q.min) / span : 0;
      addMax({ [q.dim]: q.per }); if (q.also) addMax(q.also);
      if (a != null) {
        addW({ [q.dim]: q.per }, norm);
        if (q.also) addW(q.also, norm);
      }
    } else if (q.type === "rank") {
      const n = q.items.length;
      q.items.forEach((it) => addMax(it.weights, n));
      if (Array.isArray(a)) a.forEach((id, i) => {
        const it = q.items.find((x) => x.id === id);
        addW(it && it.weights, n - i);
      });
    }
  });

  const scores = {};
  survey.dimensions.forEach((d) => {
    const m = maxRaw[d.key] || 1;
    scores[d.key] = Math.max(0, Math.min(100, Math.round((raw[d.key] / m) * 100)));
  });
  return scores;
}

function topPersona(survey, scores) {
  let best = survey.dimensions[0].key, bestV = -1;
  survey.dimensions.forEach((d) => {
    if (scores[d.key] > bestV) { bestV = scores[d.key]; best = d.key; }
  });
  return { key: best, persona: survey.personas[best] };
}

Object.assign(window, { SURVEY, DIMENSIONS, PERSONAS, scoreSurvey, topPersona });
