/* data.jsx — Real curriculum data from PDF
   อ้างอิง: หลักสูตรวิชาเอกวิทยาศาสตร์สุขภาพ พ.ศ. 2568
   โรงเรียนสาธิตมหาวิทยาลัยศรีนครินทรวิโรฒ ปทุมวัน
*/

const LEVEL_NAMES = [
  { n: 1, label: "เริ่มต้น",       short: "L1", color: "#ef4444" },
  { n: 2, label: "กำลังพัฒนา",     short: "L2", color: "#f97316" },
  { n: 3, label: "ใช้ได้ดี",       short: "L3", color: "#eab308" },
  { n: 4, label: "ดีมาก",          short: "L4", color: "#0ea5e9" },
  { n: 5, label: "เชี่ยวชาญ",     short: "L5", color: "#10b981" },
];

/* ---------- 6 Core competencies (school-wide) ---------- */
const CORE_COMPETENCIES = [
  { key: "self",   short: "การจัดการตนเอง",        full: "สมรรถนะการจัดการตนเอง",
    desc: "รู้จัก/เห็นคุณค่าตนเอง ตั้งเป้าหมาย จัดการอารมณ์-ความเครียด ใช้ชีวิตอย่างสมดุล" },
  { key: "think",  short: "การคิดขั้นสูง",          full: "สมรรถนะการคิดขั้นสูง",
    desc: "คิดวิเคราะห์ สังเคราะห์ คิดเชิงระบบ คิดสร้างสรรค์ ตัดสินใจอย่างมีวิจารณญาณ" },
  { key: "comm",   short: "การสื่อสาร",              full: "สมรรถนะการสื่อสาร",
    desc: "รับ-ตีความ-ส่งสาร เลือกใช้กลวิธีที่เหมาะสม รู้เท่าทันสื่อ" },
  { key: "team",   short: "การรวมพลังทำงานเป็นทีม", full: "สมรรถนะการรวมพลังทำงานเป็นทีม",
    desc: "ทำงานร่วมกับผู้อื่น มีภาวะผู้นำ จัดการความขัดแย้งสร้างสรรค์" },
  { key: "civic",  short: "การเป็นพลเมืองที่เข้มแข็ง", full: "สมรรถนะการเป็นพลเมืองที่เข้มแข็ง",
    desc: "ตระหนักรู้-ปฏิบัติตนเป็นพลเมืองคุณภาพ เคารพสิทธิ-เสรีภาพ" },
  { key: "nature", short: "อยู่ร่วมกับธรรมชาติฯ",    full: "สมรรถนะการอยู่ร่วมกับธรรมชาติและวิทยาการอย่างยั่งยืน",
    desc: "ใช้ทรัพยากรอย่างรู้คุณค่า เป็นมิตรต่อสิ่งแวดล้อม รู้เท่าทันเทคโนโลยี" },
];

/* ---------- 4 Specialized/professional competencies with sub-components ---------- */
const SPEC_COMPETENCIES = [
  {
    key: "inquiry",
    short: "ใฝ่รู้และสืบเสาะหาความรู้",
    full: "มีความใฝ่รู้และการสืบเสาะหาความรู้ (Scientific Curiosity and Inquiry)",
    desc: "แสวงหาความรู้เชิงวิทยาศาสตร์ด้วยความสนใจใคร่รู้ ผ่านการสำรวจ-ทดลอง-วิเคราะห์-อ้างอิงหลักฐานอย่างมีวิจารณญาณ",
    color: "primary",
    subs: [
      {
        key: "1.1", name: "ความสนใจใคร่รู้",
        levels: [
          "แสดงความสนใจในประเด็นทางวิทยาศาสตร์เมื่อได้รับการกระตุ้น",
          "แสดงความสนใจในประเด็นที่ตนสนใจ และเริ่มค้นคว้าด้วยตนเอง",
          "แสดงความกระตือรือร้นในการเรียนรู้ประเด็นใหม่ๆ อย่างสม่ำเสมอ",
          "ริเริ่มตั้งคำถามหรือโครงงานจากความสนใจของตนเองอย่างต่อเนื่อง",
          "เป็นผู้นำการเรียนรู้หรือสร้างแรงบันดาลใจให้ผู้อื่นเกิดความใฝ่รู้",
        ],
      },
      {
        key: "1.2", name: "การสืบเสาะหาความรู้และคิดอย่างเป็นระบบ",
        levels: [
          "ตั้งคำถามง่ายๆ และหาคำตอบจากแหล่งใกล้ตัวได้เมื่อมีแนวทาง",
          "ตั้งคำถามเชิงสำรวจและค้นคว้าจากแหล่งที่มีความน่าเชื่อถือบางส่วน",
          "ออกแบบการสืบค้นข้อมูลจากหลายแหล่ง และวิเคราะห์ข้อมูลเบื้องต้นได้",
          "ออกแบบและดำเนินกระบวนการสืบเสาะโดยใช้วิธีการทางวิทยาศาสตร์อย่างเป็นระบบ",
          "ประเมินความน่าเชื่อถือของข้อมูลและสังเคราะห์สร้างองค์ความรู้ใหม่ได้",
        ],
      },
      {
        key: "1.3", name: "การสื่อสารความรู้",
        levels: [
          "สื่อสารข้อมูลวิทยาศาสตร์ในรูปแบบพื้นฐาน เช่น บอกเล่า/เขียนตามแบบฝึก",
          "ถ่ายทอดความรู้ด้วยภาษาของตนเอง พร้อมอธิบายสิ่งที่ตนเข้าใจ",
          "สื่อสารเชิงวิทยาศาสตร์อย่างมีลำดับเหตุผล ปรับให้เหมาะกับผู้รับสาร",
          "สื่อสารและแลกเปลี่ยนองค์ความรู้กับผู้อื่นโดยใช้หลักฐานและเหตุผลชัดเจน",
          "ถ่ายทอดความรู้เชิงซ้อนในรูปแบบสร้างสรรค์ ปรับให้เหมาะกับบริบทผู้รับสารที่หลากหลาย",
        ],
      },
      {
        key: "1.4", name: "การเรียนรู้ตลอดชีวิต",
        levels: [
          "เข้าร่วมกิจกรรมเรียนรู้เมื่อได้รับมอบหมาย",
          "เลือกเรียนรู้จากแหล่งเพิ่มเติมด้วยความสมัครใจในบางโอกาส",
          "กำหนดเป้าหมายการเรียนรู้ของตนเองและติดตามความก้าวหน้า",
          "มีแผนการพัฒนาตนเองระยะยาวและติดตามการเติบโตของตนอย่างต่อเนื่อง",
          "มีแนวทางเรียนรู้ตลอดชีวิตที่หลากหลาย ใช้การเรียนรู้เป็นเครื่องมือพัฒนาตนอย่างต่อเนื่อง",
        ],
      },
    ],
    tools: [
      "บันทึกสะท้อนคิดในแฟ้มสะสมผลงาน",
      "รายงานการสืบค้นข้อมูล / โครงงานวิทยาศาสตร์",
      "งานเขียนบทความ + การสังเกตการนำเสนอ",
      "แผนการเรียนรู้รายบุคคล + บันทึกการเข้าร่วมกิจกรรม",
    ],
  },
  {
    key: "empath",
    short: "การเข้าอกเข้าใจผู้อื่น",
    full: "มีความเข้าอกเข้าใจ (Empathic Communication and Collaboration)",
    desc: "ฟัง-เข้าใจมุมมอง ความรู้สึก ความคิดเห็นของผู้อื่นโดยไม่ตัดสิน สื่อสารเปิดใจด้วยภาษาทางบวก สร้างบรรยากาศเคารพ-ไว้วางใจ",
    color: "teal",
    subs: [
      {
        key: "2.1", name: "ฟังอย่างเข้าใจและไม่ตัดสิน",
        levels: [
          "ฟังผู้อื่นโดยไม่แสดงอาการเบื่อหน่าย เมื่อได้รับคำชี้แนะ",
          "ตั้งใจฟังอย่างไม่ขัดจังหวะ พยายามเข้าใจมุมมองของผู้อื่น",
          "ฟังเพื่อเข้าใจเจตนาของผู้อื่นและตั้งคำถามเพื่อขยายความเข้าใจ",
          "ฟังเชิงลึกและสามารถสรุปความเข้าใจจากสิ่งที่ผู้อื่นสื่อสารได้อย่างชัดเจน",
          "เป็นผู้ฟังที่มีทักษะการสรุปและสะท้อนความเข้าใจต่อความรู้สึกของผู้อื่น",
        ],
      },
      {
        key: "2.2", name: "ยอมรับความหลากหลายทางความคิด",
        levels: [
          "รับฟังความคิดเห็นต่างได้แม้ยังไม่เข้าใจหรือเห็นด้วย",
          "ยอมรับว่าผู้อื่นอาจคิดต่างจากตนโดยไม่แสดงการต่อต้าน",
          "เปิดใจเมื่อมีความเห็นหลากหลาย และให้เกียรติมุมมองที่แตกต่าง",
          "สนับสนุนการแสดงความคิดเห็นของเพื่อนแม้เห็นต่าง ส่งเสริมการแลกเปลี่ยน",
          "สร้างบรรยากาศปลอดภัยทางความคิดในกลุ่ม ชวนให้ผู้อื่นกล้าแสดงความคิดเห็น",
        ],
      },
      {
        key: "2.3", name: "สื่อสารทางบวก",
        levels: [
          "พยายามใช้ถ้อยคำสุภาพเมื่อพูดคุยในกลุ่ม",
          "ใช้คำพูดสร้างสรรค์เมื่อต้องให้ข้อเสนอแนะ",
          "สื่อสารด้วยความเห็นอกเห็นใจ หลีกเลี่ยงคำพูดเชิงลบ",
          "ไกล่เกลี่ยความขัดแย้งย่อยในกลุ่มด้วยการสื่อสารทางบวก",
          "สื่อสารเพื่อปรับความเข้าใจและรักษาความสัมพันธ์แม้ในสถานการณ์ยาก",
        ],
      },
      {
        key: "2.4", name: "ร่วมมือและแบ่งบทบาท",
        levels: [
          "แบ่งบทบาทในกลุ่มได้ตามหน้าที่ที่ได้รับมอบหมาย",
          "ร่วมมือกับผู้อื่นในการวางแผนและตัดสินใจในกลุ่มอย่างสร้างสรรค์",
          "รับผิดชอบต่อบทบาทของตน และช่วยเหลือสมาชิกในกลุ่มอย่างเต็มที่",
          "บริหารความร่วมมือของกลุ่มให้เกิดประสิทธิภาพ ส่งเสริมผู้อื่นให้ทำงานได้ดี",
          "เป็นผู้นำสร้างพลวัตในทีม ทำให้ทีมบรรลุผลและพัฒนาความสัมพันธ์ระยะยาว",
        ],
      },
    ],
    tools: [
      "แบบประเมินการฟังและสรุปใจความ",
      "แบบฝึกแสดงความคิดเห็น + แบบสังเกตพฤติกรรมในกิจกรรมกลุ่ม",
      "แบบฝึกการให้ข้อเสนอแนะเชิงบวก",
      "แบบประเมินการทำงานกลุ่มในแฟ้มสะสมผลงาน",
    ],
  },
  {
    key: "ethics",
    short: "จริยธรรมและความรับผิดชอบ",
    full: "มีจริยธรรมและความรับผิดชอบ (Ethical Reasoning and Responsibility)",
    desc: "ใช้กรอบความคิดทางจริยธรรมวิเคราะห์สถานการณ์ในชีวิตประจำวัน รับผิดชอบต่อการกระทำของตนเอง คำนึงถึงผลกระทบต่อสังคม",
    color: "purple",
    subs: [
      {
        key: "3.1", name: "แยกแยะประเด็นทางจริยธรรมในสถานการณ์ต่างๆ",
        levels: [
          "รับฟังประเด็นทางจริยธรรมเมื่อได้รับคำอธิบาย",
          "แยกแยะว่าพฤติกรรมใดเหมาะสมหรือไม่ในสถานการณ์ทั่วไป",
          "อภิปรายถึงทางเลือกที่มีจริยธรรมแตกต่างกันได้อย่างมีเหตุผล",
          "ตั้งคำถามและตั้งข้อสังเกตประเด็นทางจริยธรรมในสถานการณ์ซับซ้อนได้",
          "เป็นผู้นำการตั้งประเด็นและแลกเปลี่ยนความคิดเห็นเชิงจริยธรรมกับผู้อื่น",
        ],
      },
      {
        key: "3.2", name: "ตัดสินใจบนหลักความถูกต้อง ไม่เอื้อประโยชน์ส่วนตน",
        levels: [
          "ตัดสินใจตามคำแนะนำโดยไม่เข้าใจหลักการเบื้องหลัง",
          "พยายามตัดสินใจด้วยตนเองโดยยึดหลักความถูกต้องในบริบทง่าย",
          "ตัดสินใจโดยคำนึงถึงผลกระทบต่อผู้อื่น และยึดถือหลักความถูกต้อง",
          "ยึดมั่นในความถูกต้องแม้ต้องเสียผลประโยชน์ส่วนตน",
          "ตัดสินใจอย่างซื่อตรง โดยใช้เหตุผลเชิงจริยธรรมในสถานการณ์ท้าทาย",
        ],
      },
      {
        key: "3.3", name: "เคารพสิทธิของผู้อื่น",
        levels: [
          "หลีกเลี่ยงการละเมิดสิทธิผู้อื่นเมื่อได้รับการเตือน",
          "ปฏิบัติตามข้อตกลงร่วมกับผู้อื่น ไม่แสดงพฤติกรรมล่วงละเมิด",
          "เคารพความเป็นส่วนตัว ทรัพย์สิน และความคิดเห็นของผู้อื่นในกลุ่ม",
          "เป็นแบบอย่างในการเคารพสิทธิและเสรีภาพของผู้อื่น",
          "สนับสนุนให้ผู้อื่นตระหนักและเคารพสิทธิเสรีภาพของกันและกัน",
        ],
      },
      {
        key: "3.4", name: "แสดงความรับผิดชอบในสิ่งที่ทำ",
        levels: [
          "ยอมรับผลลัพธ์ของการกระทำเมื่อมีผู้ชี้ให้เห็น",
          "แสดงความรับผิดชอบในงานของตนเมื่อต้องส่งผลงานหรือรายงาน",
          "รับผิดชอบต่อหน้าที่ที่ได้รับมอบหมายโดยไม่ต้องมีการติดตาม",
          "ยอมรับข้อผิดพลาดและแก้ไขโดยไม่ผลักภาระให้ผู้อื่น",
          "รับผิดชอบต่อการกระทำของตนในระยะยาว และเป็นแบบอย่างที่ดีในกลุ่ม",
        ],
      },
    ],
    tools: [
      "แบบฝึกวิเคราะห์สถานการณ์ทางจริยธรรม",
      "ใบงานวิเคราะห์การตัดสินใจ + สถานการณ์จำลอง",
      "แบบสังเกตพฤติกรรมในชั้นเรียน",
      "แผนการรับผิดชอบงาน + แบบประเมินตนเอง",
    ],
  },
  {
    key: "resil",
    short: "ยืดหยุ่นและปรับตัว",
    full: "ยืดหยุ่นและปรับตัวได้ (Resilience and Adaptability)",
    desc: "ฟื้นตัวจากอุปสรรค/ความล้มเหลว ปรับตัวต่อสถานการณ์ใหม่อย่างสร้างสรรค์ เรียนรู้จากประสบการณ์เพื่อพัฒนาตน",
    color: "pink",
    subs: [
      {
        key: "4.1", name: "มองอุปสรรคเป็นโอกาสในการเรียนรู้",
        levels: [
          "แสดงอาการท้อแท้เมื่อเจออุปสรรค ต้องการให้ผู้อื่นช่วยเหลือทันที",
          "พยายามหาทางออกเมื่อมีปัญหา แม้ยังต้องพึ่งพาผู้อื่น",
          "อธิบายสิ่งที่เรียนรู้จากอุปสรรคที่พบเจอได้",
          "ใช้ประสบการณ์จากอุปสรรคมาเป็นแนวทางวางแผนในอนาคต",
          "สนับสนุนผู้อื่นให้เรียนรู้จากอุปสรรค ถอดบทเรียนร่วมกัน",
        ],
      },
      {
        key: "4.2", name: "กลับมาลงมือทำใหม่แม้เคยล้มเหลว",
        levels: [
          "ไม่ต้องการกลับมาทำซ้ำเมื่องานล้มเหลว และหลีกเลี่ยงการพูดถึง",
          "กลับมาทำใหม่ได้ในบางกรณีที่ล้มเหลว หากมีการสนับสนุน",
          "เริ่มกลับมาทำใหม่ด้วยความตั้งใจ แม้ไม่มีใครบังคับ",
          "สะท้อนความล้มเหลวและใช้เป็นแรงผลักดัน",
          "นำประสบการณ์ล้มเหลวไปสื่อสารสร้างแรงบันดาลใจให้ทีม",
        ],
      },
      {
        key: "4.3", name: "ยืดหยุ่นต่อการเปลี่ยนแปลงในทีมหรือแผนงาน",
        levels: [
          "แสดงความกังวลหรือสับสนเมื่อแผนงานเปลี่ยนไป",
          "ปรับตัวได้บ้างเมื่อมีการเปลี่ยนแปลงในทีม",
          "ร่วมมือกับผู้อื่นในการปรับแผนเมื่อเกิดการเปลี่ยนแปลง",
          "ปรับบทบาทของตนเองให้เหมาะสมกับสถานการณ์ที่เปลี่ยนไป",
          "เป็นผู้นำในการปรับแผนอย่างยืดหยุ่น สร้างบรรยากาศความร่วมมือ",
        ],
      },
      {
        key: "4.4", name: "เปิดรับ feedback และนำไปปรับปรุงตนเอง",
        levels: [
          "รับฟัง feedback แต่ไม่สามารถนำไปใช้ปรับปรุงพฤติกรรมได้",
          "พยายามเลือก feedback ที่ตนยอมรับได้ไปปรับใช้บางส่วน",
          "นำ feedback มาปรับปรุงงานของตน และยอมรับข้อเสนอแนะเชิงสร้างสรรค์",
          "ตั้งเป้าหมายการพัฒนาตนจาก feedback ได้อย่างต่อเนื่อง",
          "เป็นแบบอย่างในการเปิดรับ feedback อย่างจริงใจ และใช้พัฒนาตนอย่างลึกซึ้ง",
        ],
      },
    ],
    tools: [
      "แบบสะท้อนคิดหลังการทำงาน",
      "บันทึก after-action review",
      "บันทึกข้อเสนอแนะที่ได้รับและการนำไปใช้",
      "แผนพัฒนาตนเองจาก feedback",
    ],
  },
];

/* ---------- Real courses with competency level targets ---------- */
const COURSES = [
  // ม.4
  { grade: "ม.4", code: "ว31105", name: "ชีววิทยา 1", credits: 1.5,
    scope: "การศึกษาชีววิทยาและชีวจริยธรรม กล้องจุลทรรศน์ เซลล์ การลำเลียงสาร การแบ่งเซลล์ การถ่ายทอดลักษณะทางพันธุกรรม",
    targets: { inquiry:2, empath:2, ethics:null, resil:null } },
  { grade: "ม.4", code: "ว31242", name: "ชีวเคมี", credits: 1.5,
    scope: "เคมีพื้นฐานของสิ่งมีชีวิต โครงสร้าง-หน้าที่ชีวโมเลกุล เอนไซม์ การหายใจระดับเซลล์ พันธุศาสตร์โมเลกุล เทคโนโลยี DNA",
    targets: { inquiry:2, empath:2, ethics:null, resil:null } },
  // ม.5
  { grade: "ม.5", code: "ว32243", name: "กายวิภาคศาสตร์และสรีรวิทยาของสัตว์ 1", credits: 1.5,
    scope: "เนื้อเยื่อสัตว์ ระบบย่อยอาหาร ระบบหายใจ ระบบไหลเวียนเลือด ระบบภูมิคุ้มกัน ระบบขับถ่าย",
    targets: { inquiry:3, empath:3, ethics:null, resil:null } },
  { grade: "ม.5", code: "ว32244", name: "กายวิภาคศาสตร์และสรีรวิทยาของสัตว์ 2", credits: 1.5,
    scope: "ระบบประสาท ต่อมไร้ท่อ สืบพันธุ์และการเจริญ การเคลื่อนที่ พฤติกรรมสัตว์",
    targets: { inquiry:3, empath:3, ethics:null, resil:null } },
  // ม.6
  { grade: "ม.6", code: "ว33243", name: "พืชและวิวัฒนาการของสิ่งมีชีวิต", credits: 1.5,
    scope: "โครงสร้างพืช การสืบพันธุ์พืชดอก การลำเลียงและคายน้ำ การตอบสนองของพืช วิวัฒนาการ",
    targets: { inquiry:3, empath:3, ethics:null, resil:null } },
  { grade: "ม.6", code: "ว33244", name: "ความหลากหลายทางชีวภาพ", credits: 1.5,
    scope: "ความหลากหลายทางชีวภาพ อนุกรมวิธาน ระบบนิเวศ ประชากร และความยั่งยืน",
    targets: { inquiry:3, empath:3, ethics:null, resil:null } },
  { grade: "ม.6", code: "ว30281", name: "ปฏิบัติการชีววิทยา", credits: 1.0,
    scope: "การใช้เครื่องมือพื้นฐาน เทคนิคเตรียมตัวอย่าง กล้องจุลทรรศน์ กายวิภาคเปรียบเทียบ เทคนิคพันธุศาสตร์โมเลกุล",
    targets: { inquiry:2, empath:2, ethics:null, resil:null } },
  { grade: "ม.6", code: "ว30291", name: "การศึกษาค้นคว้าอิสระ", credits: 1.0,
    scope: "ศึกษา-ค้นคว้าหัวข้อที่สนใจ ทักษะการสืบค้น เขียนเชิงวิชาการ การสื่อสารองค์ความรู้วิทยาศาสตร์",
    targets: { inquiry:4, empath:4, ethics:null, resil:4 } },
  { grade: "ม.6", code: "ว30292", name: "การคิดเชื่อมโยงและจริยธรรมทางการแพทย์", credits: 1.0,
    scope: "การคิดเชื่อมโยง ตรรกศาสตร์ จริยธรรมทางการแพทย์",
    targets: { inquiry:4, empath:null, ethics:4, resil:null } },
  { grade: "ม.6", code: "ว30290", name: "การบูรณาการความรู้ทางวิทยาศาสตร์เพื่อการศึกษาต่อ", credits: 1.0,
    scope: "ประยุกต์ใช้ความรู้วิทยาศาสตร์เพื่อการศึกษาต่อ",
    targets: { inquiry:5, empath:null, ethics:null, resil:5 } },
];

/* ---------- TCAS 1 (Portfolio) — เกณฑ์คณะแพทย์ / ทันตแพทย์ ----------
   อ้างอิงตัวอย่าง Requirement TCAS69 รอบ 1 Portfolio
   โดย อ.ณัฐพงษ์ ภูมั่น (เกณฑ์อาจเปลี่ยนตามประกาศของแต่ละ ม. แต่ละปี)
   ฟิลด์ที่เป็น null = "ไม่กำหนด"
*/
const TCAS1_REQUIREMENTS = [
  // ---- คณะแพทยศาสตร์ ----
  { id:"cu-med", faculty:"แพทยศาสตร์", university:"จุฬาลงกรณ์มหาวิทยาลัย",
    ielts:7.0, gpax:3.50, note:"เกรดรายวิชา: ไม่กำหนด" },

  { id:"mu-rama-med", faculty:"แพทยศาสตร์", university:"มหาวิทยาลัยมหิดล (รพ.รามาธิบดี)",
    ielts:6.5, gpax:3.50, biology:3.50, chemistry:3.50, physics_or_math:3.50,
    note:"เลือกยื่นฟิสิกส์ หรือ คณิต ≥ 3.50" },

  { id:"mu-siriraj-med", faculty:"แพทยศาสตร์", university:"มหาวิทยาลัยมหิดล (ศิริราชพยาบาล)",
    ielts:7.0, gpax:3.50, biology:3.50, chemistry:3.50, physics_or_math:3.50,
    note:"เลือกยื่นฟิสิกส์ หรือ คณิต ≥ 3.50" },

  { id:"tu-med", faculty:"แพทยศาสตร์", university:"มหาวิทยาลัยธรรมศาสตร์",
    ielts:6.5, gpax:3.00, science_avg:3.50, math:3.50, english:3.50,
    note:"เฉลี่ยวิชาวิทย์ (ชีว/เคมี/ฟิสิกส์) ≥ 3.50" },

  { id:"ku-med", faculty:"แพทยศาสตร์", university:"มหาวิทยาลัยเกษตรศาสตร์",
    ielts:6.5, gpax:3.50, science_avg:3.50, math:3.50, english:3.50,
    note:"เฉลี่ยวิชาวิทย์ ≥ 3.50 • ภาษาไทย+สังคม ≥ 3.00 (ระบบไม่ตรวจ)" },

  { id:"cmu-med", faculty:"แพทยศาสตร์", university:"มหาวิทยาลัยเชียงใหม่",
    ielts:6.5, gpax:3.50, biology:3.50, chemistry:3.50, english:3.50 },

  { id:"pccms", faculty:"วิทยาลัยแพทยศาสตร์",
    university:"ศรีสวางควัฒน ราชวิทยาลัยจุฬาภรณ์",
    ielts:5.5, gpax:3.50, biology:3.50, chemistry:3.50, physics_or_math:3.50,
    note:"เลือกยื่นฟิสิกส์ หรือ คณิต ≥ 3.50" },

  // ---- คณะทันตแพทยศาสตร์ ----
  { id:"cu-dent", faculty:"ทันตแพทยศาสตร์", university:"จุฬาลงกรณ์มหาวิทยาลัย",
    ielts:7.5, gpax:3.75, biology:4.00, chemistry:3.00, physics:3.00, english:3.00 },

  { id:"mu-dent", faculty:"ทันตแพทยศาสตร์", university:"มหาวิทยาลัยมหิดล",
    ielts:5.0, gpax:3.50, biology:3.50, chemistry:3.50, physics_or_math:3.50,
    note:"เลือกยื่นฟิสิกส์ หรือ คณิต ≥ 3.50" },

  { id:"swu-dent", faculty:"ทันตแพทยศาสตร์", university:"มหาวิทยาลัยศรีนครินทรวิโรฒ",
    ielts:6.0, gpax:3.75, biology:3.50, chemistry:3.50 },

  { id:"cmu-dent", faculty:"ทันตแพทยศาสตร์", university:"มหาวิทยาลัยเชียงใหม่",
    ielts:6.5, gpax:3.75, note:"เกรดรายวิชา: ไม่กำหนด" },

  { id:"buu-dent", faculty:"ทันตแพทยศาสตร์", university:"มหาวิทยาลัยบูรพา",
    ielts:6.5, gpax:3.50, note:"เกรดรายวิชา: ไม่กำหนด" },
];

// คำนวณคะแนนเฉลี่ยที่ใช้เช็คเกณฑ์ TCAS จาก rows ของ student_grades
// คืน { gpax, biology, chemistry, physics, math, english, scienceAvg }
function computeTcasScores(gradeRows) {
  const avgFor = (subjects) => {
    const vals = [];
    (gradeRows || []).forEach(r => {
      if (subjects.includes(r.subject) && r.grade != null) vals.push(Number(r.grade));
    });
    return vals.length ? vals.reduce((a,b)=>a+b,0) / vals.length : null;
  };
  const gpax       = avgFor(["gpa"]);
  const biology    = avgFor(["biology"]);
  const chemistry  = avgFor(["chemistry"]);
  const physics    = avgFor(["physics_astro","physics"]);
  // ใช้ค่าเฉลี่ยรวมของพื้นฐาน + เพิ่มเติม (รับวิชาเก่า "math"/"english" ด้วย)
  const math       = avgFor(["math_basic","math_extra","math"]);
  const english    = avgFor(["english_basic","english_extra","english"]);
  // เฉลี่ยวิทย์ = เฉลี่ยจาก biology + chemistry + physics
  const sciVals = [biology, chemistry, physics].filter(v => v != null);
  const scienceAvg = sciVals.length ? sciVals.reduce((a,b)=>a+b,0) / sciVals.length : null;
  return { gpax, biology, chemistry, physics, math, english, scienceAvg };
}

// เช็คว่านักเรียนผ่านเกณฑ์ของมหาวิทยาลัยหนึ่ง ๆ จากคะแนนเฉลี่ยเท่านั้น (ไม่นับ IELTS)
function checkTcasEligibility(req, scores) {
  const checks = [];
  const test = (label, want, got) => {
    if (want == null) return;
    const passed = got != null && got >= want;
    checks.push({ label, want, got, passed });
  };
  test("GPAX",        req.gpax,        scores.gpax);
  test("ชีววิทยา",     req.biology,     scores.biology);
  test("เคมี",         req.chemistry,   scores.chemistry);
  test("ฟิสิกส์",       req.physics,     scores.physics);
  test("คณิตศาสตร์",   req.math,        scores.math);
  test("ภาษาอังกฤษ",   req.english,     scores.english);
  test("เฉลี่ยวิทย์",   req.science_avg, scores.scienceAvg);
  if (req.physics_or_math != null) {
    const passPhys = scores.physics != null && scores.physics >= req.physics_or_math;
    const passMath = scores.math    != null && scores.math    >= req.physics_or_math;
    checks.push({
      label: "ฟิสิกส์ หรือ คณิต", want: req.physics_or_math,
      got: passPhys ? scores.physics : passMath ? scores.math : (scores.physics ?? scores.math),
      passed: passPhys || passMath,
    });
  }
  const allPass = checks.length > 0 && checks.every(c => c.passed);
  return { allPass, checks };
}

Object.assign(window, {
  LEVEL_NAMES,
  CORE_COMPETENCIES,
  SPEC_COMPETENCIES,
  COURSES,
  TCAS1_REQUIREMENTS,
  computeTcasScores,
  checkTcasEligibility,
});
