/* ============================================================
   DevelopView.jsx — พัฒนาตนเอง (ID Plan · Training Log)
   • ครูบันทึกกิจกรรมการพัฒนาตนเอง (อบรม/สัมมนา/ศึกษาด้วยตนเอง)
   • Admin Dashboard สรุปภาพรวมทั้งโรงเรียน
   ============================================================ */

// 8 ด้านการพัฒนา (multi-select)
const DEV_AREAS = [
  {id:'curriculum',   label:'หลักสูตรและการสอน',     icon:'book',       color:'#0ea5e9'},
  {id:'assessment',   label:'การวัดและประเมินผล',    icon:'checkCircle',color:'#22c55e'},
  {id:'tech_ai',      label:'เทคโนโลยีและ AI',        icon:'layers',     color:'#8b5cf6'},
  {id:'research',     label:'วิจัยและนวัตกรรม',       icon:'award',      color:'#ec4899'},
  {id:'student_care', label:'การดูแลช่วยเหลือนักเรียน', icon:'users',   color:'#f59e0b'},
  {id:'admin',        label:'การบริหารงาน',           icon:'shield',     color:'#6366f1'},
  {id:'language',     label:'พัฒนาตนเองด้านภาษา',     icon:'send',       color:'#14b8a6'},
  {id:'other',        label:'อื่น ๆ',                 icon:'edit',       color:'#94a3b8'},
];
const areaById = id => DEV_AREAS.find(a=>a.id===id) || DEV_AREAS[7];

// รูปแบบการอบรม
const DEV_FORMATS = [
  {id:'onsite',     label:'อบรมออนไซต์'},
  {id:'online',     label:'อบรมออนไลน์'},
  {id:'hybrid',     label:'Hybrid (ผสมผสาน)'},
  {id:'self',       label:'ศึกษาด้วยตนเอง'},
  {id:'conference', label:'ประชุมวิชาการ / สัมมนา'},
  {id:'workshop',   label:'Workshop / ปฏิบัติการ'},
  {id:'other',      label:'อื่น ๆ'},
];

// แหล่งงบประมาณ
const BUDGET_SOURCES = [
  {id:'none',       label:'ไม่มีค่าใช้จ่าย', color:'#94a3b8'},
  {id:'school',     label:'งบโรงเรียน',      color:'#1f4ba0'},
  {id:'government', label:'งบราชการ / ก.ค.ศ.', color:'#0ea5e9'},
  {id:'personal',   label:'ส่วนตัว',         color:'#f59e0b'},
  {id:'external',   label:'หน่วยงานภายนอก',   color:'#22c55e'},
  {id:'foundation', label:'มูลนิธิ / องค์กร', color:'#ec4899'},
];
const budgetById = id => BUDGET_SOURCES.find(b=>b.id===id) || BUDGET_SOURCES[0];

// ── localStorage store ──
function useDevelopRecords(){
  const key = 'ntk_develop_v1';
  const [list, setList] = React.useState(()=>{
    try{ return JSON.parse(localStorage.getItem(key)||'[]'); }catch{ return []; }
  });
  const save = (updater)=> setList(l=>{ const n = typeof updater==='function'?updater(l):updater; try{localStorage.setItem(key, JSON.stringify(n));}catch{} return n; });
  const add = rec => save(l => [rec, ...l]);
  const remove = id => save(l => l.filter(r=>r.id!==id));
  const update = (id, patch)=> save(l => l.map(r=>r.id===id ? {...r, ...patch} : r));
  return {list, add, remove, update};
}

function _emptyRec(teacher){
  return {
    id: 'dev_'+Date.now()+'_'+Math.random().toString(36).slice(2,7),
    teacherId: teacher?.id || '',
    // 1. ผู้รายงาน (auto-fill จาก teacher)
    reporterName: teacher ? `${teacher.pre||''}${teacher.name||''}` : '',
    position:'',
    groupWork: teacher?.primary || '',
    // 2. รายละเอียดการอบรม
    courseName:'', organizer:'', startDate:'', endDate:'', hours:'',
    format:'online', venue:'',
    // 3. เป้าหมายการพัฒนา (multi)
    areas:[], areaOther:'',
    // 4. ผลที่ได้รับ
    knowledge:'', application:'', beneficiary:'', timeframe:'',
    // 5. หลักฐาน / ค่าใช้จ่าย
    evidence:'', evidenceUrl:'',
    cost:'', budgetSource:'none', budgetNote:'',
    createdAt: new Date().toISOString(),
  };
}

// ── helpers ──
function fmtDate(iso){ if(!iso) return '—'; try{const d=new Date(iso+'T00:00:00'); return `${d.getDate()}/${d.getMonth()+1}/${d.getFullYear()+543}`;}catch{return iso;} }

// ═══════════════════════════════════════════════
// DevelopView — สำหรับครู
// ═══════════════════════════════════════════════
function DevelopView({me}){
  const {list, add, remove, update} = useDevelopRecords();
  const [tab, setTab] = React.useState('new');
  const [editing, setEditing] = React.useState(null);
  const myList = list.filter(r=>r.teacherId===me.id);
  const totalHours = myList.reduce((s,r)=> s + (Number(r.hours)||0), 0);
  const totalCost = myList.reduce((s,r)=> s + (Number(r.cost)||0), 0);
  const areaCount = {};
  myList.forEach(r=>(r.areas||[]).forEach(a=>{ areaCount[a]=(areaCount[a]||0)+1; }));

  return (
    <div>
      <div className="flex ac jb wrap gap12" style={{marginBottom:18}}>
        <div>
          <h1 style={{fontSize:22,color:'var(--brand-900)'}}>พัฒนาตนเอง (ID Plan)</h1>
          <p style={{margin:'4px 0 0',color:'var(--ink-2)',fontSize:14}}>บันทึกและติดตามการพัฒนาตนเองของครู · การอบรม สัมมนา และวิชาการต่าง ๆ</p>
        </div>
        <button className="btn primary" onClick={()=>{setEditing(_emptyRec(me)); setTab('new');}}>
          <Icon name="plus" size={15}/> บันทึกการพัฒนาใหม่
        </button>
      </div>

      {/* KPI cards ส่วนตัว */}
      <div className="stats">
        <Stat k="รายการทั้งหมด" v={myList.length} unit="ครั้ง" tone="blue" icon="clipboard"/>
        <Stat k="ชั่วโมงพัฒนา" v={totalHours} unit="ชม." tone="green" icon="clock"/>
        <Stat k="ค่าใช้จ่ายรวม" v={totalCost.toLocaleString()} unit="บาท" tone="amber" icon="edit"/>
        <Stat k="ด้านที่พัฒนาแล้ว" v={Object.keys(areaCount).length} unit={`/ ${DEV_AREAS.length}`} tone="red" icon="layers"/>
      </div>

      <div className="ac-subtabs mt16">
        {[
          ['new', editing?'บันทึกใหม่':'บันทึกใหม่','plus'],
          ['history', `ประวัติ (${myList.length})`, 'clipboard'],
          ['summary','สรุปของฉัน','layers'],
        ].map(([id,lbl,ic])=>(
          <button key={id} className={`ac-subtab ${tab===id?'active':''}`} onClick={()=>setTab(id)}>
            <Icon name={ic} size={14}/>{lbl}
          </button>
        ))}
      </div>

      {tab==='new' && (
        <DevelopForm me={me} editing={editing||_emptyRec(me)} onSave={(rec)=>{
          if(list.find(r=>r.id===rec.id)) update(rec.id, rec);
          else add(rec);
          setEditing(null);
          setTab('history');
          alert('บันทึกเรียบร้อยแล้ว ✓');
        }} onCancel={()=>{setEditing(null); setTab('history');}}/>
      )}

      {tab==='history' && (
        <HistoryList list={myList} onEdit={(r)=>{setEditing(r); setTab('new');}} onDelete={(id)=>{
          if(confirm('ลบรายการนี้?')) remove(id);
        }}/>
      )}

      {tab==='summary' && <PersonalSummary myList={myList} areaCount={areaCount}/>}

      <div className="note-box mt16">
        <Icon name="info" size={18} style={{flex:'none'}}/>
        <div>
          <div>ข้อมูลบันทึกในเครื่องของท่านเท่านั้น (localStorage) · admin ยังเห็นเฉพาะข้อมูลในเครื่องเดียวกัน</div>
          <div style={{marginTop:6,fontSize:12.5,color:'var(--ink-3)'}}>
            แนะนำ: บันทึกทันทีหลังจบการอบรม พร้อมแนบเกียรติบัตร (link Google Drive) · ใช้เป็นหลักฐานสำหรับ PA และวิทยฐานะ
          </div>
        </div>
      </div>
    </div>
  );
}

// ═══════════════════════════════════════════════
// DevelopForm — ฟอร์มบันทึกการพัฒนา (6 ส่วน)
// ═══════════════════════════════════════════════
function DevelopForm({me, editing, onSave, onCancel}){
  const [rec, setRec] = React.useState(editing);
  const set = (patch)=> setRec(r=>({...r, ...patch}));
  const toggleArea = (id)=> set({areas: (rec.areas||[]).includes(id) ? rec.areas.filter(a=>a!==id) : [...(rec.areas||[]), id]});
  const isEdit = editing && (Array.isArray(rec) ? false : (rec.createdAt < new Date(Date.now()-1000).toISOString()));

  return (
    <div className="mt16">
      {/* ส่วน 1: ผู้รายงาน */}
      <Card>
        <CardHead icon="user" title="1. ข้อมูลผู้รายงาน" sub="ระบบเติมข้อมูลจากบัญชีให้อัตโนมัติ · แก้ไขได้"/>
        <div className="card-pad">
          <div className="form-grid-2">
            <div className="field"><label>ชื่อ–นามสกุล</label>
              <input type="text" className="inp" value={rec.reporterName} onChange={e=>set({reporterName:e.target.value})}/></div>
            <div className="field"><label>ตำแหน่ง</label>
              <input type="text" className="inp" value={rec.position} onChange={e=>set({position:e.target.value})}
                placeholder="เช่น ครู · ครูชำนาญการ · ครูผู้ช่วย"/></div>
            <div className="field" style={{gridColumn:'1 / -1'}}><label>กลุ่มสาระการเรียนรู้ / กลุ่มงาน</label>
              <input type="text" className="inp" value={rec.groupWork} onChange={e=>set({groupWork:e.target.value})}/></div>
          </div>
        </div>
      </Card>

      {/* ส่วน 2: รายละเอียดการอบรม */}
      <Card className="mt12">
        <CardHead icon="clipboard" title="2. รายละเอียดการอบรม / กิจกรรม"/>
        <div className="card-pad">
          <div className="field"><label>ชื่อหลักสูตร / กิจกรรม *</label>
            <input type="text" className="inp" value={rec.courseName} onChange={e=>set({courseName:e.target.value})}
              placeholder="เช่น การจัดการเรียนรู้เชิงรุก · Active Learning สำหรับครู"/></div>
          <div className="field mt8"><label>หน่วยงานผู้จัด *</label>
            <input type="text" className="inp" value={rec.organizer} onChange={e=>set({organizer:e.target.value})}
              placeholder="เช่น สพฐ. · คุรุสภา · จุฬาฯ · โรงเรียนหนองตาคงพิทยาคาร"/></div>
          <div className="form-grid-2 mt8">
            <div className="field"><label>วันที่เริ่ม *</label>
              <input type="date" className="inp" value={rec.startDate} onChange={e=>set({startDate:e.target.value})}/></div>
            <div className="field"><label>วันที่สิ้นสุด *</label>
              <input type="date" className="inp" value={rec.endDate} onChange={e=>set({endDate:e.target.value})}/></div>
            <div className="field"><label>จำนวนชั่วโมง *</label>
              <input type="number" min="0" step="0.5" className="inp" value={rec.hours} onChange={e=>set({hours:e.target.value})}
                placeholder="เช่น 12"/></div>
            <div className="field"><label>รูปแบบ</label>
              <select className="sel" value={rec.format} onChange={e=>set({format:e.target.value})}>
                {DEV_FORMATS.map(f=><option key={f.id} value={f.id}>{f.label}</option>)}
              </select>
            </div>
          </div>
          <div className="field mt8"><label>สถานที่ / แพลตฟอร์ม</label>
            <input type="text" className="inp" value={rec.venue} onChange={e=>set({venue:e.target.value})}
              placeholder="เช่น โรงแรม X · Zoom · YouTube · Google Classroom"/></div>
        </div>
      </Card>

      {/* ส่วน 3: เป้าหมายการพัฒนา */}
      <Card className="mt12">
        <CardHead icon="award" title="3. เป้าหมายการพัฒนา" sub="เลือกได้มากกว่าหนึ่งด้าน"/>
        <div className="card-pad">
          <div className="dv-areas">
            {DEV_AREAS.map(a=>{
              const on = (rec.areas||[]).includes(a.id);
              return (
                <label key={a.id} className={`dv-area ${on?'on':''}`}
                  style={on?{background:a.color+'18',borderColor:a.color+'88',color:a.color}:null}>
                  <input type="checkbox" checked={on} onChange={()=>toggleArea(a.id)}/>
                  <Icon name={a.icon} size={16}/>
                  <span>{a.label}</span>
                </label>
              );
            })}
          </div>
          {(rec.areas||[]).includes('other') && (
            <div className="field mt12"><label className="tiny">ระบุด้านอื่น ๆ</label>
              <input type="text" className="inp" value={rec.areaOther} onChange={e=>set({areaOther:e.target.value})}
                placeholder="ระบุด้านที่ต้องการพัฒนา"/></div>
          )}
        </div>
      </Card>

      {/* ส่วน 4: ผลที่ได้รับ */}
      <Card className="mt12">
        <CardHead icon="checkCircle" title="4. ผลที่ได้รับและการนำไปใช้"/>
        <div className="card-pad">
          <div className="field"><label>ความรู้ / ทักษะสำคัญที่ได้รับ</label>
            <textarea className="inp" rows={3} value={rec.knowledge} onChange={e=>set({knowledge:e.target.value})}
              placeholder="อาทิ เทคนิคการจัดการเรียนรู้แบบ Active · การใช้ AI ในการวิเคราะห์ผลการเรียน"/></div>
          <div className="field mt8"><label>แนวทางนำไปใช้</label>
            <textarea className="inp" rows={3} value={rec.application} onChange={e=>set({application:e.target.value})}
              placeholder="อาทิ นำไปปรับใช้ในการสอนวิชา … ปีการศึกษา … · จัดกิจกรรมกลุ่มสาระ …"/></div>
          <div className="form-grid-2 mt8">
            <div className="field"><label>กลุ่มผู้เรียน / งานที่ได้รับประโยชน์</label>
              <input type="text" className="inp" value={rec.beneficiary} onChange={e=>set({beneficiary:e.target.value})}
                placeholder="เช่น ม.1/1 · ม.4 ทุกห้อง · กลุ่มบริหารงานวิชาการ"/></div>
            <div className="field"><label>ช่วงเวลาที่จะดำเนินการ</label>
              <input type="text" className="inp" value={rec.timeframe} onChange={e=>set({timeframe:e.target.value})}
                placeholder="เช่น ภาคเรียนที่ 2/2569 · ตลอดปี 2569"/></div>
          </div>
        </div>
      </Card>

      {/* ส่วน 5: หลักฐาน / ค่าใช้จ่าย */}
      <Card className="mt12">
        <CardHead icon="edit" title="5. หลักฐานและค่าใช้จ่าย"/>
        <div className="card-pad">
          <div className="field"><label>หลักฐานเข้าร่วม (เกียรติบัตร / ภาพกิจกรรม)</label>
            <input type="text" className="inp" value={rec.evidence} onChange={e=>set({evidence:e.target.value})}
              placeholder="เช่น เกียรติบัตร PDF · ภาพกิจกรรม · หนังสือรับรอง"/></div>
          <div className="field mt8"><label>ลิงก์เอกสารประกอบ (ถ้ามี)</label>
            <input type="url" className="inp" value={rec.evidenceUrl} onChange={e=>set({evidenceUrl:e.target.value})}
              placeholder="https://drive.google.com/…"/></div>
          <div className="form-grid-2 mt8">
            <div className="field"><label>ค่าใช้จ่ายจริง (บาท)</label>
              <input type="number" min="0" className="inp" value={rec.cost} onChange={e=>set({cost:e.target.value})}
                placeholder="0 หากไม่มีค่าใช้จ่าย"/></div>
            <div className="field"><label>แหล่งงบประมาณ</label>
              <select className="sel" value={rec.budgetSource} onChange={e=>set({budgetSource:e.target.value})}>
                {BUDGET_SOURCES.map(b=><option key={b.id} value={b.id}>{b.label}</option>)}
              </select>
            </div>
          </div>
          {rec.budgetSource!=='none' && (
            <div className="field mt8"><label className="tiny">รายละเอียดงบประมาณ (ถ้ามี)</label>
              <input type="text" className="inp" value={rec.budgetNote} onChange={e=>set({budgetNote:e.target.value})}
                placeholder="เช่น แผนพัฒนาบุคลากร งบ 2569 · เบิกจริง …"/></div>
          )}
        </div>
      </Card>

      {/* ปุ่ม */}
      <div className="flex ac jb wrap gap8 mt16" style={{padding:'12px 4px'}}>
        <button className="btn ghost" onClick={onCancel}>
          <Icon name="arrowLeft" size={14}/> ยกเลิก
        </button>
        <div className="flex ac gap8">
          <span className="tiny" style={{color:'var(--ink-3)'}}>ส่วนที่มี * จำเป็นต้องกรอก</span>
          <button className="btn primary" onClick={()=>{
            if(!rec.courseName || !rec.organizer || !rec.hours){
              alert('กรุณากรอกข้อมูลที่มี * ให้ครบ (ชื่อหลักสูตร · หน่วยงาน · ชั่วโมง)');
              return;
            }
            onSave(rec);
          }}>
            <Icon name="check" size={15}/> บันทึกข้อมูล
          </button>
        </div>
      </div>
    </div>
  );
}

// ═══════════════════════════════════════════════
// HistoryList — ประวัติการพัฒนาของฉัน
// ═══════════════════════════════════════════════
function HistoryList({list, onEdit, onDelete}){
  if(!list.length){
    return <Card className="mt16"><div className="card-pad"><Empty icon="inbox" title="ยังไม่มีการบันทึก" sub="กดปุ่ม 'บันทึกการพัฒนาใหม่' เพื่อเริ่มบันทึก"/></div></Card>;
  }
  return (
    <div className="mt16 dv-history">
      {list.map(r=>(
        <div key={r.id} className="dv-hist-card">
          <div className="dv-hist-h">
            <div style={{flex:1,minWidth:0}}>
              <div className="dv-hist-t">{r.courseName || '(ไม่ระบุหลักสูตร)'}</div>
              <div className="dv-hist-s">
                {r.organizer} · {fmtDate(r.startDate)}{r.endDate&&r.endDate!==r.startDate?' – '+fmtDate(r.endDate):''} · <b>{r.hours} ชม.</b>
              </div>
            </div>
            <div className="flex ac gap6">
              <button className="tiny btn-ghost-sm" onClick={()=>onEdit(r)} title="แก้ไข"><Icon name="edit" size={14}/></button>
              <button className="tiny btn-ghost-sm" onClick={()=>onDelete(r.id)} title="ลบ" style={{color:'#dc2626'}}><Icon name="trash" size={14}/></button>
            </div>
          </div>
          <div className="dv-hist-areas">
            {(r.areas||[]).map(aid=>{
              const a = areaById(aid);
              return <span key={aid} className="dv-chip" style={{background:a.color+'18',color:a.color,border:'1px solid '+a.color+'55'}}>{a.label}</span>;
            })}
          </div>
          <div className="dv-hist-meta">
            <span>รูปแบบ: <b>{(DEV_FORMATS.find(f=>f.id===r.format)||{}).label||'—'}</b></span>
            <span>งบ: <b>{budgetById(r.budgetSource).label}</b> {r.cost?`(${Number(r.cost).toLocaleString()} บาท)`:''}</span>
            {r.evidenceUrl && <a href={r.evidenceUrl} target="_blank" rel="noopener" style={{color:'var(--brand-600)'}}>📎 เอกสาร</a>}
          </div>
        </div>
      ))}
    </div>
  );
}

// ═══════════════════════════════════════════════
// PersonalSummary — สรุปการพัฒนาส่วนตัว
// ═══════════════════════════════════════════════
function PersonalSummary({myList, areaCount}){
  const yearNow = new Date().getFullYear();
  const thisYear = myList.filter(r=>{ try{return new Date(r.startDate).getFullYear()===yearNow;}catch{return false;} });
  const yearHours = thisYear.reduce((s,r)=>s+(Number(r.hours)||0), 0);
  const maxArea = Math.max(1, ...Object.values(areaCount));
  return (
    <div className="mt16">
      <Card>
        <CardHead icon="layers" title={`ชั่วโมงพัฒนาปี ${yearNow+543}`} sub={`${thisYear.length} กิจกรรม · ${yearHours} ชั่วโมง`}/>
        <div className="card-pad">
          <div className="tiny" style={{color:'var(--ink-3)',marginBottom:8}}>เป้าหมายทั่วไป: 20 ชั่วโมง/ปี</div>
          <div className="ac-tbl-track" style={{height:12}}>
            <div className="ac-tbl-fill" style={{width: Math.min(100, yearHours/20*100)+'%', background:yearHours>=20?'var(--green)':'var(--brand-500)'}}></div>
          </div>
          <div className="flex ac jb mt8"><span className="tiny">{yearHours}/20 ชม.</span><span className="tiny" style={{color:yearHours>=20?'var(--green)':'var(--ink-3)'}}>{yearHours>=20?'✓ ครบเป้าหมาย':'ยังไม่ครบเป้าหมาย'}</span></div>
        </div>
      </Card>
      <Card className="mt12">
        <CardHead icon="award" title="ด้านที่ได้รับการพัฒนา" sub="จำนวนกิจกรรมแยกตามด้าน"/>
        <div className="card-pad">
          <div className="rsn-bars">
            {DEV_AREAS.map(a=>{
              const c = areaCount[a.id]||0;
              return (
                <div key={a.id} className="rsn-row">
                  <span className="reason-tag" style={{minWidth:180,background:a.color+'18',color:a.color,border:'1px solid '+a.color+'55'}}>{a.label}</span>
                  <div className="rsn-track"><div className="rsn-fill" style={{width: c/maxArea*100+'%', background:a.color}}></div></div>
                  <span className="num rsn-val">{c} กิจกรรม</span>
                </div>
              );
            })}
          </div>
        </div>
      </Card>
    </div>
  );
}

// ═══════════════════════════════════════════════
// AdminDevelopView — Dashboard ผู้บริหาร
// ═══════════════════════════════════════════════
function AdminDevelopView(){
  const {list} = useDevelopRecords();
  const teachers = window.TEACHERS || [];
  const [yearFilter, setYearFilter] = React.useState(String(new Date().getFullYear()));

  // filter ตามปี ค.ศ. (จากวันเริ่มการอบรม)
  const filtered = list.filter(r=>{ try{return String(new Date(r.startDate).getFullYear())===yearFilter;}catch{return false;} });

  // (1) จำนวน/สัดส่วนครูที่ได้รับการพัฒนา
  const developedIds = new Set(filtered.map(r=>r.teacherId));
  const coverage = teachers.length ? Math.round(developedIds.size / teachers.length * 100) : 0;

  // (2) จำนวนกิจกรรมและชั่วโมงรายบุคคล + รวมตามกลุ่มสาระ
  const byTeacher = {};
  filtered.forEach(r=>{
    const b = byTeacher[r.teacherId] = byTeacher[r.teacherId] || {activities:0, hours:0};
    b.activities++; b.hours += Number(r.hours)||0;
  });
  const byGroup = {};
  filtered.forEach(r=>{
    const t = teachers.find(x=>x.id===r.teacherId);
    const g = t?.primary || 'ไม่ระบุ';
    const b = byGroup[g] = byGroup[g] || {activities:0, hours:0, teachers:new Set()};
    b.activities++; b.hours += Number(r.hours)||0; b.teachers.add(r.teacherId);
  });

  // (3) หัวข้อและด้าน
  const areaTotals = {};
  filtered.forEach(r=>(r.areas||[]).forEach(a=>{ areaTotals[a]=(areaTotals[a]||0)+1; }));
  const uncoveredAreas = DEV_AREAS.filter(a=> !(areaTotals[a.id]>0));

  // (4) ค่าใช้จ่ายตามแหล่งงบประมาณ
  const budgetTotals = {};
  BUDGET_SOURCES.forEach(b=>{ budgetTotals[b.id] = {count:0, sum:0}; });
  filtered.forEach(r=>{
    const bid = r.budgetSource || 'none';
    const b = budgetTotals[bid] = budgetTotals[bid] || {count:0, sum:0};
    b.count++; b.sum += Number(r.cost)||0;
  });
  const totalCost = Object.values(budgetTotals).reduce((s,b)=>s+b.sum, 0);
  const totalHours = filtered.reduce((s,r)=>s+(Number(r.hours)||0), 0);

  // สรุป top ครู
  const topTeachers = Object.entries(byTeacher).map(([tid,b])=>({t:teachers.find(x=>x.id===tid), ...b}))
    .filter(x=>x.t).sort((a,b)=>b.hours-a.hours);

  // ปี dropdown
  const years = [...new Set(list.map(r=>{try{return new Date(r.startDate).getFullYear();}catch{return null;}}).filter(Boolean))].sort((a,b)=>b-a);
  if(!years.includes(Number(yearFilter))) years.unshift(Number(yearFilter));

  return (
    <div>
      <div className="flex ac jb wrap gap12" style={{marginBottom:18}}>
        <div>
          <h1 style={{fontSize:22,color:'var(--brand-900)'}}>Dashboard พัฒนาตนเองครู</h1>
          <p style={{margin:'4px 0 0',color:'var(--ink-2)',fontSize:14}}>สรุปภาพรวมการพัฒนาบุคลากรตาม ID Plan · แผนพัฒนาตนเองประจำปี</p>
        </div>
        <div className="flex ac gap8">
          <Icon name="calendar" size={16} style={{color:'var(--ink-3)'}}/>
          <select className="sel" value={yearFilter} onChange={e=>setYearFilter(e.target.value)} style={{minWidth:140}}>
            {years.map(y=><option key={y} value={String(y)}>ปี พ.ศ. {y+543}</option>)}
          </select>
        </div>
      </div>

      {/* KPI */}
      <div className="stats">
        <Stat k="ครูที่ได้รับการพัฒนา" v={developedIds.size} unit={`/ ${teachers.length} ท่าน (${coverage}%)`} tone="blue" icon="users"/>
        <Stat k="กิจกรรมทั้งหมด" v={filtered.length} unit="ครั้ง" tone="green" icon="clipboard"/>
        <Stat k="ชั่วโมงรวม" v={totalHours} unit="ชม." tone="amber" icon="clock"/>
        <Stat k="งบประมาณรวม" v={totalCost.toLocaleString()} unit="บาท" tone="red" icon="edit"/>
      </div>

      {/* (1) ความครอบคลุม */}
      <Card className="mt16">
        <CardHead icon="users" title="1. ความครอบคลุมและโอกาสเข้าถึงการพัฒนา"
          sub={`ครูที่ได้รับการพัฒนา ${developedIds.size} ท่าน / ทั้งหมด ${teachers.length} ท่าน · ${coverage}%`}/>
        <div className="card-pad">
          <div className="ac-tbl-track" style={{height:14}}>
            <div className="ac-tbl-fill" style={{width: coverage+'%', background:coverage>=80?'var(--green)':coverage>=50?'var(--amber)':'#dc2626'}}></div>
          </div>
          <div className="flex ac jb mt8">
            <span className="tiny" style={{color:'var(--green)'}}>✓ พัฒนาแล้ว {developedIds.size}</span>
            <span className="tiny" style={{color:'#dc2626'}}>✗ ยังไม่มีข้อมูล {teachers.length - developedIds.size}</span>
          </div>
        </div>
      </Card>

      {/* (2) กิจกรรมตามกลุ่มสาระ */}
      <Card className="mt16">
        <CardHead icon="layers" title="2. จำนวนกิจกรรมและชั่วโมงตามกลุ่มสาระ"
          sub="ติดตามการพัฒนาตามแผน · ระบุกลุ่มที่ยังพัฒนาน้อย"/>
        <div className="card-pad">
          <div className="tbl-wrap">
            <table className="tbl" style={{minWidth:520}}>
              <thead><tr><th>กลุ่มสาระ / งาน</th><th style={{textAlign:'center'}}>จำนวนครู</th><th style={{textAlign:'center'}}>กิจกรรม</th><th style={{textAlign:'center'}}>ชั่วโมง</th><th style={{textAlign:'center'}}>เฉลี่ย/คน</th></tr></thead>
              <tbody>
                {Object.entries(byGroup).sort((a,b)=>b[1].hours-a[1].hours).map(([g,b])=>(
                  <tr key={g}>
                    <td style={{fontWeight:500}}>{g}</td>
                    <td className="num" style={{textAlign:'center'}}>{b.teachers.size}</td>
                    <td className="num" style={{textAlign:'center'}}>{b.activities}</td>
                    <td className="num" style={{textAlign:'center',color:'var(--brand-700)',fontWeight:600}}>{b.hours}</td>
                    <td className="num" style={{textAlign:'center'}}>{(b.hours/b.teachers.size).toFixed(1)}</td>
                  </tr>
                ))}
                {Object.keys(byGroup).length===0 && <tr><td colSpan={5}><Empty icon="inbox" title="ยังไม่มีข้อมูล"/></td></tr>}
              </tbody>
            </table>
          </div>
          {topTeachers.length>0 && <>
            <div className="tiny mt12" style={{color:'var(--ink-3)',marginBottom:6}}>ครูที่พัฒนาตนเองสูงสุด (Top 5)</div>
            <div className="flex wrap gap8">
              {topTeachers.slice(0,5).map(r=>(
                <span key={r.t.id} className="reason-tag" style={{background:'var(--brand-50)',color:'var(--brand-700)',border:'1px solid var(--brand-200,#c7d2fe)'}}>
                  <Avatar t={r.t} size="sm"/> {r.t.short} · <b>{r.hours} ชม.</b> · {r.activities} ครั้ง
                </span>
              ))}
            </div>
          </>}
        </div>
      </Card>

      {/* (3) หัวข้อและด้าน */}
      <Card className="mt16">
        <CardHead icon="award" title="3. หัวข้อและด้านที่ครูได้รับการพัฒนา"
          sub={`วางแผนเติมเต็มทักษะ${uncoveredAreas.length>0?` · ยังไม่มีด้าน: ${uncoveredAreas.map(a=>a.label).join(', ')}`:''}`}/>
        <div className="card-pad">
          <div className="rsn-bars">
            {DEV_AREAS.map(a=>{
              const c = areaTotals[a.id]||0;
              const maxA = Math.max(1, ...Object.values(areaTotals));
              return (
                <div key={a.id} className="rsn-row">
                  <span className="reason-tag" style={{minWidth:180,background:a.color+'18',color:a.color,border:'1px solid '+a.color+'55'}}>{a.label}</span>
                  <div className="rsn-track"><div className="rsn-fill" style={{width: c/maxA*100+'%', background:a.color}}></div></div>
                  <span className="num rsn-val">{c} กิจกรรม</span>
                </div>
              );
            })}
          </div>
        </div>
      </Card>

      {/* (4) ค่าใช้จ่ายตามแหล่งงบประมาณ */}
      <Card className="mt16">
        <CardHead icon="edit" title="4. ค่าใช้จ่ายแยกตามแหล่งงบประมาณ"
          sub={`รวมทั้งสิ้น ${totalCost.toLocaleString()} บาท · ${filtered.length} กิจกรรม`}/>
        <div className="card-pad">
          <div className="dv-budget-grid">
            {BUDGET_SOURCES.map(b=>{
              const stats = budgetTotals[b.id]||{count:0,sum:0};
              const pct = totalCost ? Math.round(stats.sum / totalCost * 100) : 0;
              return (
                <div key={b.id} className="dv-budget-card" style={{borderLeftColor:b.color}}>
                  <div className="dv-b-lbl" style={{color:b.color}}>{b.label}</div>
                  <div className="dv-b-num">{stats.sum.toLocaleString()} <span className="tiny">บาท</span></div>
                  <div className="dv-b-meta">{stats.count} กิจกรรม · {pct}% ของยอดรวม</div>
                </div>
              );
            })}
          </div>
        </div>
      </Card>
    </div>
  );
}

window.DevelopView = DevelopView;
window.AdminDevelopView = AdminDevelopView;
