<!DOCTYPE html>
<html lang="mn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Жижүүр Хуваарь Үүсгэгч</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
:root{
  --blue:#2563eb;--blue-l:#3b82f6;--blue-bg:#eff6ff;--blue-bd:#bfdbfe;
  --green:#16a34a;--green-bg:#f0fdf4;--green-bd:#86efac;
  --yellow:#b45309;--yellow-bg:#fefce8;--yellow-bd:#fde68a;
  --purple:#7c3aed;--purple-bg:#f5f3ff;--purple-bd:#c4b5fd;
  --pink:#be185d;--pink-bg:#fdf2f8;--pink-bd:#fbcfe8;
  --cyan:#0e7490;--cyan-bg:#ecfeff;--cyan-bd:#a5f3fc;
  --red:#dc2626;--red-bg:#fef2f2;--red-bd:#fecaca;
  --orange:#c2410c;--orange-bg:#fff7ed;--orange-bd:#fed7aa;
  --teal:#0f766e;--teal-bg:#f0fdfa;--teal-bd:#99f6e4;
  --border:#e5e7eb;--text:#111827;--muted:#6b7280;--bg:#f3f4f6;
  --font:"Noto Sans",sans-serif;
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--text);font-family:var(--font);font-size:14px;min-height:100vh}

/* HEADER */
.app-header{background:var(--blue);padding:12px 20px;display:flex;align-items:center;gap:12px;position:sticky;top:0;z-index:300;box-shadow:0 2px 8px rgba(37,99,235,.35)}
.app-title{font-size:17px;font-weight:700;color:#fff}
.app-sub{font-size:11px;color:rgba(255,255,255,.7);margin-top:1px}
.header-tabs{margin-left:auto;display:flex;gap:6px}
.htab{background:rgba(255,255,255,.15);border:none;border-radius:8px;color:#fff;cursor:pointer;font-size:12px;font-weight:600;padding:6px 14px;transition:.15s}
.htab:hover{background:rgba(255,255,255,.25)}
.htab.active{background:white;color:var(--blue)}

/* UPLOAD */
.upload-bar{background:#fff;border-bottom:1px solid var(--border);padding:9px 20px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.upload-btn{background:var(--blue);border:none;border-radius:8px;color:#fff;cursor:pointer;font-size:13px;font-weight:600;padding:7px 15px;display:inline-flex;align-items:center;gap:6px;transition:background .15s}
.upload-btn:hover{background:var(--blue-l)}
.file-input{display:none}
.file-info{font-size:12px;color:var(--muted)}
.file-info.loaded{color:var(--green);font-weight:600}
#valMsg{font-size:12px;padding:4px 10px;border-radius:6px;display:none}
#valMsg.warn{background:#fef9c3;color:#92400e;border:1px solid #fbbf24;display:inline-block}
#valMsg.err{background:#fee2e2;color:#991b1b;border:1px solid #fca5a5;display:inline-block}

/* GENERATE BUTTON */
.gen-bar{background:#f0fdf4;border-bottom:2px solid #86efac;padding:10px 20px;display:none;align-items:center;gap:12px;flex-wrap:wrap}
.gen-btn{background:linear-gradient(135deg,#16a34a,#15803d);border:none;border-radius:10px;color:#fff;cursor:pointer;font-size:14px;font-weight:700;padding:9px 22px;display:inline-flex;align-items:center;gap:8px;transition:.2s;box-shadow:0 2px 8px rgba(22,163,74,.3)}
.gen-btn:hover{transform:translateY(-1px);box-shadow:0 4px 14px rgba(22,163,74,.4)}
.month-input{border:2px solid var(--border);border-radius:8px;padding:7px 12px;font-size:13px;font-family:var(--font);outline:none;transition:border-color .15s}
.month-input:focus{border-color:var(--blue)}
.gen-label{font-size:13px;color:#166534;font-weight:600}

/* CONTROLS */
.controls{background:#fff;border-bottom:1px solid var(--border);padding:9px 20px;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.sw-wrap{position:relative;display:inline-flex;align-items:center}
.sw-icon{position:absolute;left:9px;font-size:13px;pointer-events:none}
.sbox{background:#f9fafb;border:1.5px solid var(--border);border-radius:8px;color:var(--text);font-size:13px;padding:7px 10px 7px 30px;outline:none;transition:border-color .15s}
.sbox:focus{border-color:var(--blue);background:#fff}
.sbox::placeholder{color:var(--muted)}
.sbox-teacher{width:220px}
.sbox-class{width:180px}
.stoggle{display:flex;border:1.5px solid var(--border);border-radius:8px;overflow:hidden}
.sbtn{background:transparent;border:none;border-right:1px solid var(--border);color:var(--muted);cursor:pointer;font-size:12px;font-weight:600;padding:6px 13px;transition:.15s;white-space:nowrap}
.sbtn:last-child{border-right:none}
.sbtn:hover{background:#f1f5f9;color:var(--text)}
.sbtn.active{background:var(--blue);color:#fff}
.rc{font-size:12px;color:var(--muted);margin-left:auto}

/* LEGEND */
.legend{display:flex;gap:12px;flex-wrap:wrap;align-items:center;padding:7px 20px;background:#fff;border-bottom:1px solid var(--border);font-size:11px}
.legend-lbl{color:var(--muted);font-weight:600}
.li{display:flex;align-items:center;gap:4px;color:var(--muted)}
.ld{width:10px;height:10px;border-radius:3px;flex-shrink:0}

/* EMPTY / LOADING */
.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 24px;gap:16px;text-align:center}
.empty-state .eicon{font-size:60px;opacity:.5}
.empty-state h2{font-size:20px;font-weight:700}
.empty-state p{color:var(--muted);font-size:14px;max-width:380px;line-height:1.7}
.empty-state .hint{background:var(--blue-bg);border:1.5px dashed var(--blue-l);border-radius:10px;padding:13px 20px;color:var(--blue);font-size:13px;font-weight:500;margin-top:6px}
.loading{display:flex;align-items:center;gap:10px;padding:60px;justify-content:center;color:var(--muted);font-size:14px}
.spinner{width:20px;height:20px;border-radius:50%;border:2.5px solid var(--border);border-top-color:var(--blue);animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.no-res{text-align:center;padding:40px;color:var(--muted);font-size:14px}

/* VIEW BADGE */
.view-badge{font-size:11px;font-weight:700;padding:4px 10px;border-radius:20px;display:none}
.view-badge.class-mode{background:#ecfdf5;color:#065f46;border:1px solid #6ee7b7;display:inline-block}
.view-badge.teacher-mode{background:#eff6ff;color:#1e40af;border:1px solid #93c5fd;display:inline-block}

/* TEACHER LIST VIEW */
.teacher-list{padding:14px 20px;display:flex;flex-direction:column;gap:14px}
.tc{background:#fff;border:1.5px solid var(--border);border-radius:12px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.06);transition:box-shadow .2s,border-color .2s}
.tc:hover{box-shadow:0 4px 16px rgba(0,0,0,.1);border-color:#c7d2fe}
.tc-hdr{padding:13px 16px;display:flex;align-items:center;gap:10px;background:var(--blue);cursor:pointer;user-select:none}
.tnum{background:rgba(255,255,255,.25);color:#fff;font-size:12px;font-weight:700;padding:2px 8px;border-radius:5px;min-width:28px;text-align:center;flex-shrink:0}
.tname{font-size:14px;font-weight:700;color:#fff}
.tsubj{font-size:11px;color:rgba(255,255,255,.8);margin-top:1px}
.tmeta{margin-left:auto;display:flex;gap:5px;align-items:center;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}
.badge{font-size:11px;padding:2px 7px;border-radius:5px;font-weight:600;background:rgba(255,255,255,.2);color:#fff;white-space:nowrap}
.chevron{color:rgba(255,255,255,.8);font-size:11px;transition:transform .2s;margin-left:4px}
.tc.exp .chevron{transform:rotate(180deg)}
.tc-body{display:none}
.tc.exp .tc-body{display:block}

/* Per-teacher schedule */
.sched-container{padding:14px;overflow-x:auto}
.shift-title{font-size:12px;font-weight:700;margin-bottom:8px;padding:4px 0 5px;border-bottom:2px solid}
.shift-title.s1{color:#2563eb;border-color:#bfdbfe}
.shift-title.s2{color:#16a34a;border-color:#86efac}
.day-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;min-width:560px}
.day-col{border:1px solid var(--border);border-radius:8px;overflow:hidden}
.day-hdr{background:#f1f5f9;padding:7px 8px;font-size:12px;font-weight:700;text-align:center;color:#475569;border-bottom:1px solid var(--border)}
.slot{padding:5px 7px;border-bottom:1px solid #f1f5f9;min-height:36px;display:flex;flex-direction:column;justify-content:center}
.slot:last-child{border-bottom:none}
.slot-time{font-size:9px;color:var(--muted);margin-bottom:2px}
.chip{font-size:11px;font-weight:600;padding:2px 5px;border-radius:4px;display:inline-block;line-height:1.4;word-break:break-word;border:1px solid transparent}
.chip-empty{color:#d1d5db;font-size:10px}

/* CLASS GRID VIEW */
.class-view{padding:0 20px 20px}
.class-view-header{padding:14px 0 10px;display:flex;align-items:center;gap:10px}
.class-view-title{font-size:18px;font-weight:700;color:var(--blue)}
.class-view-sub{font-size:12px;color:var(--muted);margin-top:2px}
.cv-section{margin-bottom:24px}
.cv-section-title{font-size:14px;font-weight:700;padding:8px 14px;border-radius:8px;margin-bottom:12px;display:flex;align-items:center;gap:8px}
.cv-section-title.s1{background:#eff6ff;color:#1e40af;border:1px solid #bfdbfe}
.cv-section-title.s2{background:#f0fdf4;color:#14532d;border:1px solid #86efac}
.cv-table-wrap{overflow-x:auto}
.cv-table{width:100%;border-collapse:collapse;min-width:700px}
.cv-table th,.cv-table td{border:1px solid var(--border);vertical-align:top}
.cv-th-period{background:#f8fafc;font-size:12px;font-weight:700;color:#374151;padding:8px 10px;white-space:nowrap;min-width:90px;text-align:center;vertical-align:middle}
.cv-th-period .period-num{font-size:16px;font-weight:800;color:#1e40af;display:block}
.cv-th-period .period-time{font-size:10px;color:var(--muted);margin-top:2px}
.cv-th-day{background:#e0f2fe;font-size:12px;font-weight:700;color:#0369a1;padding:8px 10px;text-align:center}
.cv-cell{padding:6px;min-width:130px;background:#fff}
.cv-cell-inner{display:flex;flex-wrap:wrap;gap:4px}
.lcard{flex:1;min-width:120px;border-radius:8px;padding:7px 9px;font-size:12px;line-height:1.45;border:1px solid transparent;position:relative}
.lcard-subj{font-weight:700;margin-bottom:2px}
.lcard-teacher{color:rgba(0,0,0,.6);font-size:11px}
.lcard-type{font-size:10px;margin-top:3px;font-weight:600;opacity:.8}
.cv-empty-cell{color:#d1d5db;font-size:11px;text-align:center;padding:14px 6px}
.hl-class{outline:2px solid #f59e0b;outline-offset:-1px}

/* Lesson card colors */
.lc-green{background:#d1fae5;border-color:#6ee7b7;color:#065f46}
.lc-blue{background:#dbeafe;border-color:#93c5fd;color:#1e40af}
.lc-pink{background:#fce7f3;border-color:#f9a8d4;color:#9d174d}
.lc-purple{background:#ede9fe;border-color:#c4b5fd;color:#5b21b6}
.lc-yellow{background:#fef9c3;border-color:#fde68a;color:#92400e}
.lc-orange{background:#ffedd5;border-color:#fdba74;color:#9a3412}
.lc-red{background:#fee2e2;border-color:#fca5a5;color:#991b1b}
.lc-cyan{background:#cffafe;border-color:#67e8f9;color:#164e63}
.lc-teal{background:#ccfbf1;border-color:#5eead4;color:#134e4a}
.lc-gray{background:#f3f4f6;border-color:#d1d5db;color:#374151}
.lc-indigo{background:#e0e7ff;border-color:#a5b4fc;color:#3730a3}
.lc-da{background:var(--yellow-bg);border-color:var(--yellow-bd);color:var(--yellow)}
.lc-hd{background:var(--purple-bg);border-color:var(--purple-bd);color:var(--purple)}
.lc-aj{background:var(--pink-bg);border-color:var(--pink-bd);color:var(--pink)}
.lc-sc{background:var(--cyan-bg);border-color:var(--cyan-bd);color:var(--cyan)}
.lc-gz{background:var(--green-bg);border-color:var(--green-bd);color:var(--green)}

/* ═══════════════════════════════════
   DUTY SCHEDULE VIEW
   ═══════════════════════════════════ */
#dutyView{display:none;padding:20px}

.duty-header-card{background:#fff;border-radius:12px;border:1.5px solid #86efac;padding:18px 24px;margin-bottom:18px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;box-shadow:0 2px 10px rgba(22,163,74,.1)}
.duty-title{font-size:20px;font-weight:800;color:#166534}
.duty-sub{font-size:13px;color:var(--muted);margin-top:3px}
.duty-stats{display:flex;gap:12px;flex-wrap:wrap}
.duty-stat{background:#f0fdf4;border:1px solid #86efac;border-radius:8px;padding:8px 14px;text-align:center}
.duty-stat-val{font-size:20px;font-weight:800;color:#16a34a}
.duty-stat-lbl{font-size:11px;color:var(--muted);margin-top:2px}

.duty-table-wrap{background:#fff;border-radius:12px;border:1.5px solid var(--border);overflow:hidden;box-shadow:0 2px 10px rgba(0,0,0,.06);margin-bottom:18px}
.duty-table{width:100%;border-collapse:collapse}
.duty-table th{background:linear-gradient(135deg,#1e40af,#2563eb);color:#fff;font-size:13px;font-weight:700;padding:12px 16px;text-align:center}
.duty-table td{padding:11px 14px;border-bottom:1px solid #f1f5f9;vertical-align:middle}
.duty-table tr:last-child td{border-bottom:none}
.duty-table tr:hover td{background:#f8fafc}
.duty-table .day-num{font-size:16px;font-weight:800;color:#374151;text-align:center}
.duty-table .day-name{font-size:12px;color:var(--muted);text-align:center}
.duty-table .day-num-cell{width:60px}

/* Day name badge */
.day-badge{display:inline-block;padding:3px 10px;border-radius:20px;font-size:12px;font-weight:700;white-space:nowrap}
.day-badge.mon{background:#eff6ff;color:#1e40af}
.day-badge.tue{background:#f5f3ff;color:#5b21b6}
.day-badge.wed{background:#ecfdf5;color:#065f46}
.day-badge.thu{background:#fff7ed;color:#9a3412}
.day-badge.fri{background:#fdf2f8;color:#9d174d}
.day-badge.sat{background:#fef9c3;color:#92400e}
.day-badge.sun{background:#fee2e2;color:#991b1b}

/* Duty cell */
.duty-cell{display:flex;align-items:center;gap:8px}
.duty-name{font-weight:700;color:#1e293b;font-size:13px}
.duty-hours{font-size:11px;padding:2px 7px;border-radius:12px;font-weight:600;white-space:nowrap}
.duty-hours.free{background:#dcfce7;color:#166534}
.duty-hours.few{background:#fef9c3;color:#92400e}
.duty-hours.many{background:#fee2e2;color:#991b1b}
.duty-empty{color:#d1d5db;font-size:12px}

/* Holiday/weekend row */
.duty-table tr.weekend td{background:#fafafa}
.duty-table tr.weekend .duty-empty-row{color:#94a3b8;font-size:12px;text-align:center}

/* Teacher load summary */
.load-section{background:#fff;border-radius:12px;border:1.5px solid var(--border);padding:20px;box-shadow:0 2px 10px rgba(0,0,0,.06);margin-bottom:18px}
.load-title{font-size:15px;font-weight:700;color:#1e293b;margin-bottom:14px}
.load-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px}
.load-card{border-radius:10px;padding:12px 14px;border:1.5px solid}
.load-card.low{background:#f0fdf4;border-color:#86efac}
.load-card.mid{background:#fef9c3;border-color:#fde68a}
.load-card.high{background:#fee2e2;border-color:#fca5a5}
.load-name{font-weight:700;font-size:13px;color:#1e293b;margin-bottom:4px}
.load-bar-wrap{height:6px;background:#e5e7eb;border-radius:999px;overflow:hidden;margin:6px 0}
.load-bar{height:100%;border-radius:999px;transition:width .4s}
.load-info{font-size:11px;color:var(--muted);display:flex;justify-content:space-between}

/* Print button */
.print-btn{background:#1e40af;border:none;border-radius:8px;color:#fff;cursor:pointer;font-size:13px;font-weight:600;padding:8px 16px;display:inline-flex;align-items:center;gap:6px;transition:.15s}
.print-btn:hover{background:#1d4ed8}
.publish-btn{background:linear-gradient(135deg,#16a34a,#15803d);border:none;border-radius:8px;color:#fff;cursor:pointer;font-size:13px;font-weight:600;padding:8px 16px;display:inline-flex;align-items:center;gap:6px;transition:.15s}
.publish-btn:hover{background:#15803d;transform:translateY(-1px)}

/* Scrollbar */
::-webkit-scrollbar{width:5px;height:5px}
::-webkit-scrollbar-track{background:#f1f5f9}
::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}

@media print{
  .app-header,.upload-bar,.gen-bar,.controls,.legend,.header-tabs,.print-btn{display:none!important}
  #dutyView{display:block!important}
  body{background:white}
  .duty-table-wrap{box-shadow:none;border:1px solid #ccc}
}
</style>
</head>
<body>

<header class="app-header">
  <div style="font-size:22px">🏫</div>
  <div>
    <div class="app-title">Сургуулийн Систем</div>
    <div class="app-sub">Хичээлийн Хуваарь · Жижүүр Үүсгэгч</div>
  </div>
  <div class="header-tabs">
    <button class="htab active" id="tabSchedule" onclick="switchTab('schedule')">📋 Хичээлийн хуваарь</button>
    <button class="htab" id="tabDuty" onclick="switchTab('duty')">👮 Жижүүр хуваарь</button>
  </div>
</header>

<!-- Upload bar (always visible) -->
<div class="upload-bar">
  <label class="upload-btn" for="fileInput">
    <span>📂</span> Excel файл оруулах
  </label>
  <input type="file" id="fileInput" class="file-input" accept=".xlsx,.xls">
  <span class="file-info" id="fileInfo">Файл сонгогдоогүй</span>
  <span id="valMsg"></span>
  <button class="publish-btn" id="publishLessonBtn" style="display:none;margin-left:auto" onclick="publishLesson()">📢 Хичээлийн хуваарь нийтлэх</button>
</div>

<!-- Generate duty bar (shown after upload) -->
<div class="gen-bar" id="genBar">
  <span class="gen-label">👮 Жижүүр хуваарь гаргах:</span>
  <input type="month" id="monthPicker" class="month-input">
  <button class="gen-btn" id="genBtn" onclick="generateDuty()">
    ⚡ Жижүүр хуваарь гаргах
  </button>
</div>

<!-- Schedule view controls -->
<div class="controls" id="controlsBar" style="display:none">
  <div class="sw-wrap">
    <span class="sw-icon">🔍</span>
    <input class="sbox sbox-teacher" id="sTeacher" placeholder="Багшийн нэр эсвэл хичээлээр хайх..." oninput="render()">
  </div>
  <div class="sw-wrap">
    <span class="sw-icon">🏫</span>
    <input class="sbox sbox-class" id="sClass" placeholder="Анги (жш: 7А, 6Б)..." oninput="render()">
  </div>
  <div class="stoggle">
    <button class="sbtn active" id="shiftAll" onclick="setShift('all')">Бүгд</button>
    <button class="sbtn" id="shift1" onclick="setShift('s1')">I ээлж</button>
    <button class="sbtn" id="shift2" onclick="setShift('s2')">II ээлж</button>
  </div>
  <span class="view-badge" id="viewBadge"></span>
  <span class="rc" id="rc"></span>
</div>

<div class="legend" id="legendBar" style="display:none">
  <span class="legend-lbl">Тайлбар:</span>
  <span class="li"><span class="ld" style="background:var(--yellow)"></span>Даасан анги</span>
  <span class="li"><span class="ld" style="background:var(--purple)"></span>Хөгжлийн өдөр</span>
  <span class="li"><span class="ld" style="background:var(--pink)"></span>Ангийн ажил</span>
  <span class="li"><span class="ld" style="background:var(--cyan)"></span>Сонгон</span>
  <span class="li"><span class="ld" style="background:var(--green)"></span>Гүнзгийрүүлсэн</span>
  <span class="li"><span class="ld" style="background:var(--blue)"></span>Ердийн хичээл</span>
</div>

<main id="mainContent">
  <!-- SCHEDULE TAB -->
  <div id="scheduleView">
    <div class="empty-state" id="emptyState">
      <div class="eicon">📋</div>
      <h2>Хуваарь харагдахгүй байна</h2>
      <p>Excel файл оруулахад багш нарын хичээлийн хуваарь автоматаар гарч ирнэ.</p>
      <div class="hint">📂 <strong>Excel файл оруулах</strong> товч дарж<br>хуваарийн .xlsx файлаа сонгоно уу</div>
    </div>
    <div class="loading" id="loadingState" style="display:none">
      <div class="spinner"></div><span>Excel файл уншиж байна...</span>
    </div>
    <div id="teacherListView" style="display:none">
      <div class="teacher-list" id="teacherList"></div>
    </div>
    <div id="classGridView" style="display:none">
      <div class="class-view" id="classViewContent"></div>
    </div>
  </div>

  <!-- DUTY TAB -->
  <div id="dutyView">
    <div class="empty-state" id="dutyEmptyState">
      <div class="eicon">👮</div>
      <h2>Жижүүр хуваарь гарахгүй байна</h2>
      <p>Excel файл оруулаад сар сонгоод "Жижүүр хуваарь гаргах" товч дарна уу.</p>
      <div class="hint">⚡ Систем хичээлийн хуваарийг харж<br>хамгийн цөөн цагтай багш нарыг автоматаар сонгоно</div>
    </div>
    <div id="dutyResult" style="display:none"></div>
  </div>
</main>

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<script>
// ════════════════════════════════════════════
// PUBLISH LESSON — parent window руу илгээх
// ════════════════════════════════════════════
function publishLesson() {
  if (!T.length) {
    alert('⚠️ Эхлээд Excel файл оруулна уу!');
    return;
  }
  const data = { teachers: T, publishedAt: new Date().toISOString() };

  // postMessage parent руу — энэ л үндсэн арга
  try {
    window.parent.postMessage({ type: 'PUBLISH_LESSON', data }, '*');
  } catch(e) { console.error('postMessage lesson error', e); }

  // UI feedback
  const btn = document.getElementById('publishLessonBtn');
  const orig = btn.innerHTML;
  btn.innerHTML = '⏳ Нийтэлж байна...';
  btn.style.background = '#1e40af';
  btn.disabled = true;
  setTimeout(() => {
    btn.innerHTML = '✅ Нийтлэгдлээ!';
    setTimeout(() => {
      btn.innerHTML = orig;
      btn.style.background = 'linear-gradient(135deg,#16a34a,#15803d)';
      btn.disabled = false;
    }, 2000);
  }, 1000);
}

// ════════════════════════════════════════════
// PUBLISH DUTY — parent window руу илгээх
// ════════════════════════════════════════════
function publishDuty() {
  if (!window._lastDutySchedule) {
    alert('⚠️ Эхлээд жижүүрийн хуваарийг үүсгэнэ үү!');
    return;
  }
  const { dutySchedule, year, month, daysInMonth } = window._lastDutySchedule;
  const monthKey = year + '-' + String(month).padStart(2,'0');

  const days = [];
  for (let d = 1; d <= daysInMonth; d++) {
    const dt = new Date(year, month-1, d);
    const jsDay = dt.getDay();
    const isWeekend = jsDay === 0 || jsDay === 6;
    const entry = dutySchedule.find(s => s.day === d);
    days.push({
      day: d, jsDay, year, month, isWeekend,
      s1: entry ? entry.s1Teacher : '',
      s2: entry ? entry.s2Teacher : '',
    });
  }

  const data = { days, publishedAt: new Date().toISOString() };

  // postMessage parent руу — энэ л үндсэн арга
  try {
    window.parent.postMessage({ type: 'PUBLISH_DUTY', monthKey, data }, '*');
  } catch(e) { console.error('postMessage duty error', e); }

  // UI feedback
  const btn = document.getElementById('publishBtn');
  const orig = btn.innerHTML;
  btn.innerHTML = '⏳ Нийтэлж байна...';
  btn.style.background = '#1e40af';
  btn.disabled = true;
  setTimeout(() => {
    btn.innerHTML = '✅ Нийтлэгдлээ!';
    setTimeout(() => {
      btn.innerHTML = orig;
      btn.style.background = 'linear-gradient(135deg,#16a34a,#15803d)';
      btn.disabled = false;
    }, 2000);
  }, 1000);
}

</script>
<script>
// ════════════════════════════════════════════
// CONSTANTS
// ════════════════════════════════════════════
const DAYS = ['ДАВАА','МЯГМАР','ЛХАГВА','ПҮРЭВ','БААСАН'];
const DAY_LBL = ['Даваа','Мягмар','Лхагва','Пүрэв','Баасан'];
const DAY_COL_STARTS = [6,20,34,48,62];
const S1_TIMES = ['08:30–09:15','09:15–09:50','09:50–10:30','10:30–11:15','11:30–12:15','12:15–12:55','13:00–13:45'];
const S2_TIMES = ['14:00–14:40','14:40–15:20','15:20–16:05','16:20–17:00','17:05–17:50','17:50–18:30','18:30–19:15'];
const CARD_COLORS = ['lc-green','lc-blue','lc-pink','lc-purple','lc-orange','lc-red','lc-cyan','lc-teal','lc-indigo','lc-yellow'];
const DAY_JS_TO_MN = {1:'ДАВАА',2:'МЯГМАР',3:'ЛХАГВА',4:'ПҮРЭВ',5:'БААСАН'};
const DAY_MN_LBL = {'ДАВАА':'Даваа','МЯГМАР':'Мягмар','ЛХАГВА':'Лхагва','ПҮРЭВ':'Пүрэв','БААСАН':'Баасан'};
const DAY_BADGE_CLS = {'ДАВАА':'mon','МЯГМАР':'tue','ЛХАГВА':'wed','ПҮРЭВ':'thu','БААСАН':'fri'};
const MN_MONTHS = ['Нэгдүгээр','Хоёрдугаар','Гуравдугаар','Дөрөвдүгээр','Тавдугаар','Зургаадугаар','Долдугаар','Наймдугаар','Есдүгээр','Аравдугаар','Арван нэгдүгээр','Арван хоёрдугаар'];

// ════════════════════════════════════════════
// STATE
// ════════════════════════════════════════════
let T = [];
let shiftFilter = 'all';
let expanded = new Set();
let teacherColorMap = {};
let colorIdx = 0;
let currentTab = 'schedule';

// ════════════════════════════════════════════
// TAB SWITCH
// ════════════════════════════════════════════
function switchTab(tab) {
  currentTab = tab;
  document.getElementById('scheduleView').style.display = tab==='schedule' ? 'block' : 'none';
  document.getElementById('dutyView').style.display = tab==='duty' ? 'block' : 'none';
  document.getElementById('controlsBar').style.display = (tab==='schedule' && T.length) ? '' : 'none';
  document.getElementById('legendBar').style.display = (tab==='schedule' && T.length) ? '' : 'none';
  document.getElementById('tabSchedule').classList.toggle('active', tab==='schedule');
  document.getElementById('tabDuty').classList.toggle('active', tab==='duty');
}

// ════════════════════════════════════════════
// INIT MONTH PICKER
// ════════════════════════════════════════════
(function(){
  const now = new Date();
  document.getElementById('monthPicker').value = now.getFullYear()+'-'+String(now.getMonth()+1).padStart(2,'0');
})();

document.getElementById('monthPicker').addEventListener('change', function(){
  const genBtn = document.getElementById('genBtn');
  if(T.length && this.value) genBtn.disabled = false;
});

// ════════════════════════════════════════════
// FILE INPUT
// ════════════════════════════════════════════
document.getElementById('fileInput').addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (!file) return;
  setFileInfo('⏳ Уншиж байна...', false);
  showLoading();
  const reader = new FileReader();
  reader.onload = function(ev) {
    try {
      const wb = XLSX.read(new Uint8Array(ev.target.result), { type:'array', cellStyles:true });
      const ws = wb.Sheets[wb.SheetNames[0]];
      const result = parseWorksheet(ws);
      if (!result.teachers.length) {
        showVal('⚠️ Өгөгдөл уншаагүй. Файлын бүтцийг шалгана уу.','err');
        showEmpty(); setFileInfo('Алдаа гарлаа',false);
      } else {
        T = result.teachers;
        teacherColorMap = {};
        colorIdx = 0;
        T.forEach(t => { teacherColorMap[t.name] = CARD_COLORS[colorIdx++ % CARD_COLORS.length]; });
        shiftFilter = 'all';
        expanded.clear();
        setShiftUI('all');
        document.getElementById('controlsBar').style.display = currentTab==='schedule' ? '' : 'none';
        document.getElementById('legendBar').style.display = currentTab==='schedule' ? '' : 'none';
        document.getElementById('genBar').style.display = 'flex';
        document.getElementById('publishLessonBtn').style.display = 'inline-flex';
        const mp = document.getElementById('monthPicker').value;
        document.getElementById('genBtn').disabled = !mp;
        setFileInfo(`✅ ${file.name} · ${T.length} багш`, true);
        if (result.warnings.length) showVal('⚠️ '+result.warnings.slice(0,3).join(' | '),'warn');
        else hideVal();
        render();
      }
    } catch(err) {
      showVal('❌ Алдаа: '+err.message,'err');
      showEmpty(); setFileInfo('Алдаа гарлаа',false); console.error(err);
    }
  };
  reader.readAsArrayBuffer(file);
  this.value = '';
});

// ════════════════════════════════════════════
// EXCEL PARSER
// ════════════════════════════════════════════
function parseWorksheet(ws) {
  const warnings = [];
  const teachers = [];

  function cv(r,c) {
    const cell = ws[XLSX.utils.encode_cell({r:r-1,c:c-1})];
    if (!cell || cell.v==null) return '';
    return String(cell.v).trim();
  }
  function getColor(r,c) {
    const cell = ws[XLSX.utils.encode_cell({r:r-1,c:c-1})];
    if (!cell?.s) return null;
    const s = cell.s;
    if (s.fgColor?.rgb) return s.fgColor.rgb.toUpperCase();
    if (s.fgColor?.theme!=null) return 'THEME_'+s.fgColor.theme;
    if (s.bgColor?.rgb) return s.bgColor.rgb.toUpperCase();
    return null;
  }
  function classify(val, col) {
    if (!val) return 'reg';
    const v = val.toLowerCase().trim();
    if (v.includes('хөгжлийн') || v.includes('хөгж өдөр')) return 'hd';
    if (v.includes('ангийн ажил') || v==='анги ажил') return 'aj';
    if (v.startsWith('г') && v.length>1 && !/^\d/.test(v[1])) return 'gz';
    if (v.startsWith('с') && v.length>1 && !/^\d/.test(v[1])) return 'sc';
    if (col) {
      if (col==='THEME_9'||col.includes('00B050')) return 'gz';
      if (col==='FF7030A0'||col==='7030A0') return 'hd';
      if (col.includes('FFC000')||col==='FFFFC000') return 'da';
      if (col.includes('FF00B0F0')||col==='00B0F0') return 'sc';
      if (col==='FFFFCC'||col==='FFFFCCFF') return 'aj';
    }
    return 'reg';
  }

  let dataRowStart = 6;
  for (let r=1;r<=12;r++) {
    if (cv(r,3).toLowerCase().includes('багшийн нэр')) { dataRowStart=r+3; break; }
  }

  let subj = '';
  const namesSeen = {};
  for (let r=dataRowStart; r<=400; r++) {
    const c1=cv(r,1), c2=cv(r,2), c3=cv(r,3);
    if (!c1&&!c2&&!c3) {
      if (r>dataRowStart+5) {
        let empty=true;
        for (let rr=r;rr<r+4;rr++) if(cv(rr,2)||cv(rr,3)){empty=false;break;}
        if(empty) break;
      }
      continue;
    }
    if (c1 && isNaN(Number(c1)) && c1!=='№' && c1.length>1) subj=c1;
    if (!c3||c3==='Багшийн нэр') continue;
    const numVal=parseInt(c2);

    const schedule={};
    DAYS.forEach((day,di)=>{
      const base=DAY_COL_STARTS[di];
      const s1={},s2={};
      for(let p=0;p<7;p++){
        const cc1=base+p, cc2=base+7+p;
        const v1=cv(r,cc1), v2=cv(r,cc2);
        s1[p+1]={val:v1,cls:classify(v1,getColor(r,cc1))};
        s2[p+1]={val:v2,cls:classify(v2,getColor(r,cc2))};
      }
      schedule[day]={'I ээлж':s1,'II ээлж':s2};
    });

    if(namesSeen[c3]) warnings.push(`"${c3}" давхардсан`);
    namesSeen[c3]=true;

    teachers.push({
      num:isNaN(numVal)?teachers.length+1:numVal,
      name:c3, subject:subj,
      email:'',
      homeroom:cv(r,4), cabinet:cv(r,5),
      totalHours:parseInt(cv(r,76))||0,
      schedule
    });
  }

  return {teachers,warnings};
}

// ════════════════════════════════════════════
// COUNT LESSONS PER TEACHER PER DAY PER SHIFT
// ════════════════════════════════════════════
function countLessons(teacher, day, shift) {
  let count = 0;
  const dayKey = day; // e.g. 'ДАВАА'
  for (let p = 1; p <= 7; p++) {
    const cell = teacher.schedule[dayKey]?.[shift]?.[p];
    if (cell?.val) count++;
  }
  return count;
}

// ════════════════════════════════════════════
// GENERATE DUTY SCHEDULE
// ════════════════════════════════════════════
function generateDuty() {
  const monthVal = document.getElementById('monthPicker').value;
  if (!T.length) { alert("⚠️ Эхлээд Excel файл оруулна уу!"); return; }
  if (!monthVal) { alert("⚠️ Сар сонгоно уу!"); return; }

  const [year, month] = monthVal.split('-').map(Number);

  // Get all working days in the month
  const daysInMonth = new Date(year, month, 0).getDate();
  const workingDays = [];
  for (let d = 1; d <= daysInMonth; d++) {
    const date = new Date(year, month-1, d);
    const jsDay = date.getDay(); // 0=Sun, 1=Mon, ..., 6=Sat
    if (jsDay >= 1 && jsDay <= 5) {
      workingDays.push({
        day: d,
        jsDay: jsDay,
        dayName: DAY_JS_TO_MN[jsDay],
        date: date
      });
    }
  }

  // Duty count per teacher (for balancing)
  const dutyCount = {};
  T.forEach(t => { dutyCount[t.name] = 0; });

  // Generate duty for each working day
  const dutySchedule = workingDays.map(wd => {
    const dayName = wd.dayName; // 'ДАВАА', 'МЯГМАР', etc.

    // Sort teachers for I ээлж: by lesson count ascending, then by duty count ascending
    const sorted1 = [...T].sort((a, b) => {
      const ca = countLessons(a, dayName, 'I ээлж');
      const cb = countLessons(b, dayName, 'I ээлж');
      if (ca !== cb) return ca - cb;
      return (dutyCount[a.name]||0) - (dutyCount[b.name]||0);
    });

    const teacher1 = sorted1[0];
    const lessons1 = countLessons(teacher1, dayName, 'I ээлж');

    // Sort teachers for II ээлж: exclude teacher1, sort by lesson count
    const sorted2 = [...T].filter(t => t.name !== teacher1.name).sort((a, b) => {
      const ca = countLessons(a, dayName, 'II ээлж');
      const cb = countLessons(b, dayName, 'II ээлж');
      if (ca !== cb) return ca - cb;
      return (dutyCount[a.name]||0) - (dutyCount[b.name]||0);
    });

    const teacher2 = sorted2[0];
    const lessons2 = countLessons(teacher2, dayName, 'II ээлж');

    // Increment duty counts
    dutyCount[teacher1.name] = (dutyCount[teacher1.name]||0) + 1;
    dutyCount[teacher2.name] = (dutyCount[teacher2.name]||0) + 1;

    return {
      ...wd,
      s1Teacher: teacher1.name,
      s1Email:   teacher1.email||'',
      s1Lessons: lessons1,
      s2Teacher: teacher2.name,
      s2Email:   teacher2.email||'',
      s2Lessons: lessons2,
    };
  });

  // Render
  window._lastDutySchedule = { dutySchedule, year, month, daysInMonth };
  renderDutySchedule(dutySchedule, dutyCount, year, month, daysInMonth, workingDays.length);

  // Switch to duty tab
  switchTab('duty');
}

// ════════════════════════════════════════════
// RENDER DUTY SCHEDULE
// ════════════════════════════════════════════
function renderDutySchedule(schedule, dutyCount, year, month, daysInMonth, totalWorkDays) {
  const monthName = MN_MONTHS[month-1] + ' сар';
  const maxDuty = Math.max(...Object.values(dutyCount));

  // Build full calendar (including weekends as grayed rows)
  let tableRows = '';
  for (let d = 1; d <= daysInMonth; d++) {
    const date = new Date(year, month-1, d);
    const jsDay = date.getDay();
    const isWeekend = jsDay === 0 || jsDay === 6;

    if (isWeekend) {
      const wLabel = jsDay === 6 ? 'Бямба' : 'Ням';
      const badgeCls = jsDay === 6 ? 'sat' : 'sun';
      tableRows += `<tr class="weekend">
        <td class="day-num-cell"><div class="day-num">${d}</div></td>
        <td><span class="day-badge ${badgeCls}">${wLabel}</span></td>
        <td colspan="2" class="duty-empty-row">— амралтын өдөр —</td>
      </tr>`;
    } else {
      const entry = schedule.find(s => s.day === d);
      if (!entry) continue;

      const bc = DAY_BADGE_CLS[entry.dayName] || 'mon';
      const lbl = DAY_MN_LBL[entry.dayName] || entry.dayName;

      const h1cls = entry.s1Lessons === 0 ? 'free' : entry.s1Lessons <= 2 ? 'few' : 'many';
      const h2cls = entry.s2Lessons === 0 ? 'free' : entry.s2Lessons <= 2 ? 'few' : 'many';
      const h1txt = entry.s1Lessons === 0 ? '0 цаг (чөлөө)' : `${entry.s1Lessons} цаг`;
      const h2txt = entry.s2Lessons === 0 ? '0 цаг (чөлөө)' : `${entry.s2Lessons} цаг`;

      tableRows += `<tr>
        <td class="day-num-cell"><div class="day-num">${d}</div></td>
        <td><span class="day-badge ${bc}">${lbl}</span></td>
        <td>
          <div class="duty-cell">
            <div class="duty-name">${esc(entry.s1Teacher)}<div style="font-size:10px;font-weight:500;color:#64748b;margin-top:2px">${esc(entry.s1Email||'')||''}</div></div>
            <span class="duty-hours ${h1cls}">${h1txt}</span>
          </div>
        </td>
        <td>
          <div class="duty-cell">
            <div class="duty-name">${esc(entry.s2Teacher)}<div style="font-size:10px;font-weight:500;color:#64748b;margin-top:2px">${esc(entry.s2Email||'')||''}</div></div>
            <span class="duty-hours ${h2cls}">${h2txt}</span>
          </div>
        </td>
      </tr>`;
    }
  }

  // Teacher load summary
  const sortedTeachers = [...T].sort((a,b) => (dutyCount[b.name]||0) - (dutyCount[a.name]||0));
  let loadCards = '';
  sortedTeachers.forEach(t => {
    const dc = dutyCount[t.name] || 0;
    const pct = maxDuty > 0 ? Math.round((dc/maxDuty)*100) : 0;
    const cls = pct > 75 ? 'high' : pct > 40 ? 'mid' : 'low';
    const barColor = pct > 75 ? '#ef4444' : pct > 40 ? '#f59e0b' : '#16a34a';
    loadCards += `<div class="load-card ${cls}">
      <div class="load-name">${esc(t.name)}</div>
      ${t.email?`<div style="font-size:10px;color:#64748b;font-weight:500;margin-top:1px;margin-bottom:2px">${esc(t.email)}</div>`:''}
      ${t.subject ? `<div style="font-size:11px;color:var(--muted);margin-bottom:4px">${esc(t.subject)}</div>` : ''}
      <div class="load-bar-wrap"><div class="load-bar" style="width:${pct}%;background:${barColor}"></div></div>
      <div class="load-info">
        <span>Нийт жижүүр: <strong>${dc}</strong></span>
        <span>${totalWorkDays > 0 ? Math.round((dc/totalWorkDays)*100) : 0}%</span>
      </div>
    </div>`;
  });

  const html = `
    <div class="duty-header-card">
      <div>
        <div class="duty-title">👮 ${year} оны ${monthName} — Жижүүр хуваарь</div>
        <div class="duty-sub">${T.length} багшаас автоматаар үүсгэсэн · хичээлийн ачааллыг харгалзсан</div>
      </div>
      <div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap">
        <div class="duty-stats">
          <div class="duty-stat"><div class="duty-stat-val">${totalWorkDays}</div><div class="duty-stat-lbl">Ажлын өдөр</div></div>
          <div class="duty-stat"><div class="duty-stat-val">${T.length}</div><div class="duty-stat-lbl">Нийт багш</div></div>
          <div class="duty-stat"><div class="duty-stat-val">${maxDuty}</div><div class="duty-stat-lbl">Хамгийн их жижүүр</div></div>
        </div>
        <button class="print-btn" onclick="window.print()">🖨️ Хэвлэх</button>
        <button class="publish-btn" id="publishBtn" onclick="publishDuty()">📢 Нийтлэх</button>
      </div>
    </div>

    <div class="duty-table-wrap">
      <table class="duty-table">
        <thead>
          <tr>
            <th style="width:50px">Өдөр</th>
            <th style="width:100px">Гараг</th>
            <th>👮 I ээлж (08:30–13:45)</th>
            <th>👮 II ээлж (14:00–19:15)</th>
          </tr>
        </thead>
        <tbody>${tableRows}</tbody>
      </table>
    </div>

    <div class="load-section">
      <div class="load-title">📊 Багш нарын жижүүрийн ачаалал — ${monthName}</div>
      <div style="font-size:12px;color:var(--muted);margin-bottom:12px">
        🟢 Цөөн ачаалал &nbsp;|&nbsp; 🟡 Дундаж &nbsp;|&nbsp; 🔴 Их ачаалал
      </div>
      <div class="load-grid">${loadCards}</div>
    </div>
  `;

  document.getElementById('dutyEmptyState').style.display = 'none';
  const result = document.getElementById('dutyResult');
  result.innerHTML = html;
  result.style.display = '';
}

// ════════════════════════════════════════════
// SCHEDULE RENDER FUNCTIONS
// ════════════════════════════════════════════
function norm(s){ return (s||'').toLowerCase().replace(/\s+/g,''); }

function hasClass(t, q) {
  const n = norm(q);
  for(const d of DAYS) for(const s of ['I ээлж','II ээлж']) for(let p=1;p<=7;p++){
    if(norm(t.schedule[d]?.[s]?.[p]?.val||'').includes(n)) return true;
  }
  if(norm(t.homeroom||'').includes(n)) return true;
  return false;
}

function setShift(s) {
  shiftFilter=s;
  setShiftUI(s);
  render();
}
function setShiftUI(s) {
  ['shiftAll','shift1','shift2'].forEach(id=>document.getElementById(id).classList.remove('active'));
  const map={all:'shiftAll',s1:'shift1',s2:'shift2'};
  document.getElementById(map[s]).classList.add('active');
}

function render() {
  const nq = document.getElementById('sTeacher').value.toLowerCase().trim();
  const cq = document.getElementById('sClass').value.trim();
  let filtered = T;
  if(nq) filtered = filtered.filter(t=>t.name.toLowerCase().includes(nq)||t.subject.toLowerCase().includes(nq));
  if(cq) filtered = filtered.filter(t=>hasClass(t,cq));

  document.getElementById('rc').textContent = `${filtered.length} / ${T.length} багш`;
  const badge = document.getElementById('viewBadge');

  if (cq && filtered.length > 0) {
    badge.textContent = `📋 Ангиар харах: ${cq.toUpperCase()}`;
    badge.className = 'view-badge class-mode';
    showClassGrid(filtered, cq);
  } else {
    badge.textContent = filtered.length ? `👨‍🏫 Багшаар харах` : '';
    badge.className = 'view-badge' + (nq && filtered.length ? ' teacher-mode' : '');
    showTeacherList(filtered, cq);
  }
}

function showLoading(){
  document.getElementById('emptyState').style.display='none';
  document.getElementById('loadingState').style.display='';
  document.getElementById('teacherListView').style.display='none';
  document.getElementById('classGridView').style.display='none';
}
function showEmpty(){
  document.getElementById('emptyState').style.display='';
  document.getElementById('loadingState').style.display='none';
  document.getElementById('teacherListView').style.display='none';
  document.getElementById('classGridView').style.display='none';
}
function setFileInfo(msg,loaded){
  const el=document.getElementById('fileInfo');
  el.textContent=msg; el.className='file-info'+(loaded?' loaded':'');
}
function showVal(msg,type){
  const el=document.getElementById('valMsg');
  el.textContent=msg; el.className=type; el.style.display='';
}
function hideVal(){ document.getElementById('valMsg').style.display='none'; }
function esc(s){ if(!s) return ''; return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;'); }

// Teacher list view
function showTeacherList(filtered, cq) {
  document.getElementById('emptyState').style.display='none';
  document.getElementById('loadingState').style.display='none';
  document.getElementById('classGridView').style.display='none';
  document.getElementById('scheduleView').style.display='block';
  const tlv=document.getElementById('teacherListView');
  tlv.style.display='';
  const tl=document.getElementById('teacherList');
  if(!filtered.length){ tl.innerHTML='<div class="no-res">🔍 Хайлт олдсонгүй</div>'; return; }
  tl.innerHTML=filtered.map(t=>teacherCardHTML(t,cq)).join('');
}

function teacherCardHTML(t,cq){
  const exp=expanded.has(t.num);
  const meta=[
    t.homeroom?`<span class="badge">🏫 ${esc(t.homeroom)}</span>`:'',
    t.cabinet?`<span class="badge">🚪 ${esc(t.cabinet)}</span>`:'',
    t.totalHours?`<span class="badge">⏰ ${t.totalHours}ц</span>`:'',
  ].filter(Boolean).join('');
  return `<div class="tc${exp?' exp':''}" id="c${t.num}">
    <div class="tc-hdr" onclick="toggleCard(${JSON.stringify(t.num)})">
      <span class="tnum">${t.num}</span>
      <div><div class="tname">${esc(t.name)}</div>${t.email?`<div style="font-size:10px;font-weight:500;color:rgba(255,255,255,.65);margin-top:1px">${esc(t.email)}</div>`:''} ${t.subject?`<div class="tsubj">${esc(t.subject)}</div>`:''}</div>
      <div class="tmeta">${meta}<span class="chevron">▼</span></div>
    </div>
    <div class="tc-body">${exp?teacherSchedHTML(t,cq):''}</div>
  </div>`;
}

function toggleCard(num){
  const card=document.getElementById('c'+num);
  if(!card) return;
  if(expanded.has(num)){
    expanded.delete(num); card.classList.remove('exp');
    card.querySelector('.tc-body').innerHTML='';
  } else {
    expanded.add(num); card.classList.add('exp');
    const t=T.find(t=>t.num===num);
    const cq=document.getElementById('sClass').value.trim();
    card.querySelector('.tc-body').innerHTML=teacherSchedHTML(t,cq);
  }
}

function teacherSchedHTML(t,cq){
  const cqN=norm(cq);
  const showS1=shiftFilter==='all'||shiftFilter==='s1';
  const showS2=shiftFilter==='all'||shiftFilter==='s2';
  function buildGrid(shiftKey,times){
    let h='<div class="day-grid">';
    DAYS.forEach((day,di)=>{
      h+=`<div class="day-col"><div class="day-hdr">${DAY_LBL[di]}</div>`;
      times.forEach((time,pi)=>{
        const cell=t.schedule[day]?.[shiftKey]?.[pi+1];
        const val=cell?.val||'';
        if(val){
          const cls=cell.cls||'reg';
          const chipCls=cls==='da'?'lc-da':cls==='hd'?'lc-hd':cls==='aj'?'lc-aj':cls==='sc'?'lc-sc':cls==='gz'?'lc-gz':'lc-blue';
          const hl=cqN&&norm(val).includes(cqN)?' hl-class':'';
          h+=`<div class="slot"><span class="slot-time">${time}</span><span class="chip ${chipCls}${hl}">${esc(val)}</span></div>`;
        } else {
          h+=`<div class="slot"><span class="slot-time">${time}</span><span class="chip-empty">—</span></div>`;
        }
      });
      h+='</div>';
    });
    return h+'</div>';
  }
  let h='<div class="sched-container">';
  if(showS1){ h+=`<div class="shift-title s1">I ээлж &nbsp;(08:30–13:45)</div>`; h+=buildGrid('I ээлж',S1_TIMES); }
  if(showS2){ if(showS1) h+='<div style="margin-top:14px"></div>'; h+=`<div class="shift-title s2">II ээлж &nbsp;(14:00–19:15)</div>`; h+=buildGrid('II ээлж',S2_TIMES); }
  return h+'</div>';
}

// Class grid view
function showClassGrid(filtered,cq){
  document.getElementById('emptyState').style.display='none';
  document.getElementById('loadingState').style.display='none';
  document.getElementById('teacherListView').style.display='none';
  document.getElementById('classGridView').style.display='';
  const showS1=shiftFilter==='all'||shiftFilter==='s1';
  const showS2=shiftFilter==='all'||shiftFilter==='s2';
  let html=`<div class="class-view-header"><div><div class="class-view-title">📚 ${esc(cq.toUpperCase())} ангийн хуваарь</div><div class="class-view-sub">${filtered.length} багш олдлоо</div></div></div>`;
  if(showS1) html+=buildClassTable(filtered,cq,'I ээлж',S1_TIMES,'s1');
  if(showS2) html+=buildClassTable(filtered,cq,'II ээлж',S2_TIMES,'s2');
  document.getElementById('classViewContent').innerHTML=html;
}

function buildClassTable(filtered,cq,shiftKey,times,shiftClass){
  const cqN=norm(cq);
  const shiftLbl=shiftKey==='I ээлж'?'I ээлж (08:30–13:45)':'II ээлж (14:00–19:15)';
  const data={};
  DAYS.forEach(day=>{ data[day]={}; for(let p=1;p<=7;p++) data[day][p]=[]; });
  filtered.forEach(t=>{
    DAYS.forEach(day=>{
      for(let p=1;p<=7;p++){
        const cell=t.schedule[day]?.[shiftKey]?.[p];
        if(cell?.val&&norm(cell.val).includes(cqN)){
          data[day][p].push({teacher:t.name,val:cell.val,cls:cell.cls||'reg'});
        }
      }
    });
  });
  let hasAny=false;
  DAYS.forEach(d=>{ for(let p=1;p<=7;p++) if(data[d][p].length) hasAny=true; });
  if(!hasAny) return `<div class="cv-section"><div class="cv-section-title ${shiftClass}">${shiftLbl}</div><div style="color:var(--muted);font-size:13px;padding:12px 0">Энэ ээлжид хичээл байхгүй</div></div>`;
  let h=`<div class="cv-section"><div class="cv-section-title ${shiftClass}">${shiftLbl}</div><div class="cv-table-wrap"><table class="cv-table"><thead><tr><th class="cv-th-period">Цаг</th>`;
  DAYS.forEach((d,di)=>{ h+=`<th class="cv-th-day">${DAY_LBL[di]}</th>`; });
  h+=`</tr></thead><tbody>`;
  times.forEach((time,pi)=>{
    const p=pi+1;
    h+=`<tr><td class="cv-th-period"><span class="period-num">${p}-р цаг</span><span class="period-time">${time}</span></td>`;
    DAYS.forEach(day=>{
      const lessons=data[day][p];
      if(lessons.length){
        h+=`<td class="cv-cell"><div class="cv-cell-inner">`;
        lessons.forEach(l=>{
          const color=teacherColorMap[l.teacher]||'lc-blue';
          const typeColor=l.cls==='da'?'lc-da':l.cls==='hd'?'lc-hd':l.cls==='aj'?'lc-aj':l.cls==='sc'?'lc-sc':l.cls==='gz'?'lc-gz':color;
          const typeLabel=l.cls==='gz'?'Гүнзгийрүүлсэн':l.cls==='sc'?'Сонгон':l.cls==='hd'?'Хөгжлийн өдөр':l.cls==='aj'?'Ангийн ажил':l.cls==='da'?'Даасан':'Үндсэн';
          h+=`<div class="lcard ${typeColor}"><div class="lcard-subj">${esc(l.val)}</div><div class="lcard-teacher">${esc(l.teacher)}</div><div class="lcard-type">${typeLabel}</div></div>`;
        });
        h+=`</div></td>`;
      } else { h+=`<td class="cv-cell"><span class="cv-empty-cell">—</span></td>`; }
    });
    h+=`</tr>`;
  });
  h+=`</tbody></table></div></div>`;
  return h;
}

// ════════════════════════════════════════════
// INIT_LESSON_DATA — parent-аас хуучин хадгалсан өгөгдлийг авна
// ════════════════════════════════════════════
window.addEventListener('message', function(e) {
  if (!e.data || e.data.type !== 'INIT_LESSON_DATA') return;
  const data = e.data.data;
  if (!data || !Array.isArray(data.teachers) || !data.teachers.length) return;
  T = data.teachers;
  teacherColorMap = {};
  colorIdx = 0;
  T.forEach(t => { teacherColorMap[t.name] = CARD_COLORS[colorIdx++ % CARD_COLORS.length]; });
  shiftFilter = 'all';
  expanded.clear();
  setShiftUI('all');
  document.getElementById('controlsBar').style.display = '';
  document.getElementById('legendBar').style.display = '';
  document.getElementById('genBar').style.display = 'flex';
  document.getElementById('publishLessonBtn').style.display = 'inline-flex';
  const mp = document.getElementById('monthPicker').value;
  document.getElementById('genBtn').disabled = !mp;
  setFileInfo(`✅ Хадгалагдсан хуваарь · ${T.length} багш`, true);
  hideVal();
  render();
});
</script>
</body>
</html>