// ELS HRM — Module 05: Nhân Viên PIM — All Screens
// Đồng bộ theo contract ADR-HRM-PIM-001 (SRS v1.1 / SDS v1.3, 2026-06-14)

// shadcn table styling reproduced via arbitrary child variants (1 className, structure untouched)
const TABLE_CLS = "w-full border-collapse text-sm "
  + "[&_thead_th]:border-b [&_thead_th]:border-border [&_thead_th]:bg-muted [&_thead_th]:px-3.5 [&_thead_th]:py-2.5 [&_thead_th]:text-left [&_thead_th]:text-xs [&_thead_th]:font-semibold [&_thead_th]:uppercase [&_thead_th]:tracking-[0.04em] [&_thead_th]:text-muted-foreground [&_thead_th]:whitespace-nowrap "
  + "[&_tbody_td]:border-b [&_tbody_td]:border-border [&_tbody_td]:px-3.5 [&_tbody_td]:py-3 [&_tbody_td]:align-middle [&_tbody_td]:text-foreground "
  + "[&_tbody_tr:last-child_td]:border-0 [&_tbody_tr:hover]:bg-muted";

const CARD = "rounded-xl border border-border bg-card shadow-xs";
const CARD_HEAD = "flex items-center justify-between gap-3 border-b border-border px-5 py-4";
const CARD_TITLE = "text-md font-semibold text-foreground";
const CARD_BODY = "p-5";

const PIM_EMPLOYEES = [
  { id:'e01', num:'EMP-2024-0001', name:'Nguyễn Thị Lan',  gender:'female', dept:'Nhân sự',     title:'HR Manager',         type:'full_time',  status:'active',     hire:'01/03/2024', supervisor:'Hồ Văn Minh',  email:'lan.nguyen@els.tech',   phone:'0912 345 678', loc:'Hà Nội', cccd4:'3456', mst4:'7890', docs:5 },
  { id:'e02', num:'EMP-2024-0008', name:'Trần Minh Tuấn',  gender:'male',   dept:'Engineering', title:'Backend Engineer',   type:'full_time',  status:'active',     hire:'15/04/2024', supervisor:'Lê Hữu Phước', email:'tuan.tran@els.tech',    phone:'0908 234 567', loc:'Hà Nội', cccd4:'1122', mst4:'4455', docs:3 },
  { id:'e03', num:'EMP-2025-0015', name:'Lê Thị Hương',    gender:'female', dept:'Marketing',   title:'Marketing Lead',     type:'full_time',  status:'on_leave',   hire:'02/01/2025', supervisor:'Nguyễn Văn Nam',email:'huong.le@els.tech',     phone:'0923 456 789', loc:'HCM',    cccd4:'7788', mst4:'2211', docs:4 },
  { id:'e04', num:'EMP-2025-0032', name:'Phạm Đức Long',   gender:'male',   dept:'Kinh doanh',  title:'Sales Executive',    type:'full_time',  status:'suspended',  hire:'10/06/2025', supervisor:'Đỗ Thị Mai',   email:'long.pham@els.tech',    phone:'0934 567 890', loc:'HCM',    cccd4:'9900', mst4:'3344', docs:2 },
  { id:'e05', num:'EMP-2025-0041', name:'Võ Thị Thu',      gender:'female', dept:'Tài chính',   title:'Accountant',         type:'part_time',  status:'inactive',   hire:'20/08/2025', supervisor:'Bùi Văn Sơn',  email:'thu.vo@els.tech',       phone:'0945 678 901', loc:'Đà Nẵng',cccd4:'5566', mst4:'8899', docs:3 },
  { id:'e06', num:'EMP-2026-0002', name:'Đỗ Văn Hùng',    gender:'male',   dept:'Engineering', title:'Frontend Developer',  type:'contract',   status:'active',     hire:'05/01/2026', supervisor:'Lê Hữu Phước', email:'hung.do@els.tech',      phone:'0956 789 012', loc:'Hà Nội', cccd4:'2468', mst4:'1357', docs:2 },
  { id:'e07', num:'EMP-2024-0019', name:'Bùi Thị Linh',   gender:'female', dept:'Nhân sự',     title:'HR Specialist',      type:'full_time',  status:'active',     hire:'10/07/2024', supervisor:'Nguyễn Thị Lan',email:'linh.bui@els.tech',     phone:'0967 890 123', loc:'Hà Nội', cccd4:'1010', mst4:'2020', docs:4 },
  { id:'e08', num:'EMP-2025-0028', name:'Ngô Minh Khoa',  gender:'male',   dept:'Engineering', title:'DevOps Engineer',    type:'full_time',  status:'terminated', hire:'01/04/2025', supervisor:'Lê Hữu Phước', email:'khoa.ngo@els.tech',     phone:'0978 901 234', loc:'Hà Nội', cccd4:'3030', mst4:'4040', docs:5 },
];

// Người dùng đang đăng nhập (demo) — minh hoạ phân nhánh "hồ sơ của chính mình":
// dòng nào trong danh sách chính là người dùng → mở ESS /me (không mở chế độ xem quản trị /:id).
const PIM_ME_ID = 'e01'; // Nguyễn Thị Lan (HR Manager) — cũng là chủ trang ESS "Hồ sơ của tôi"

// 5 trạng thái việc làm (§2.3) — chữ thường đúng giá trị lưu DB
const EMP_STATUS_CFG = {
  active:     { label:'Đang làm việc',  v:'success', icon:'check-circle' },
  on_leave:   { label:'Đang nghỉ phép', v:'warning', icon:'umbrella'     },
  suspended:  { label:'Đình chỉ',       v:'danger',  icon:'pause-circle' },
  inactive:   { label:'Tạm ngưng',      v:'neutral', icon:'minus-circle' },
  terminated: { label:'Đã nghỉ việc',   v:'neutral', icon:'x-circle'     },
};
const EMP_TYPE_CFG = {
  full_time: { label:'Toàn thời gian', v:'primary' },
  part_time: { label:'Bán thời gian',  v:'info'    },
  contract:  { label:'Hợp đồng',       v:'neutral' },
  intern:    { label:'Thực tập sinh',  v:'neutral' },
  temporary: { label:'Thời vụ',        v:'neutral' },
};

// Tài liệu đính kèm (§6A) — loại tài liệu
const DOC_TYPE_CFG = {
  national_id: { label:'CCCD/CMND',  icon:'shield',    color:'var(--color-destructive)', bg:'var(--color-destructive-soft)', sensitive:true  },
  contract:    { label:'Hợp đồng',   icon:'file-text', color:'var(--color-primary)',     bg:'var(--color-primary-soft)',     sensitive:false },
  resume:      { label:'Sơ yếu LL',  icon:'file',      color:'var(--color-info)',        bg:'var(--color-info-soft)',        sensitive:false },
  certificate: { label:'Chứng chỉ',  icon:'award',     color:'var(--color-success)',     bg:'var(--color-success-soft)',     sensitive:false },
  photo:       { label:'Ảnh',        icon:'image',     color:'oklch(0.55 0.15 300)',bg:'oklch(0.95 0.04 300)',   sensitive:false },
  other:       { label:'Khác',       icon:'paperclip', color:'var(--color-muted-foreground)', bg:'var(--color-muted)',       sensitive:false },
};

// ─── Helper: trường PII (mã hoá-at-rest, mask ••••••<last4>, cần view_pii) ─────
const PiiField = ({ label, last4, full, canView }) => {
  const [revealed, setRevealed] = React.useState(false);
  const show = canView && revealed;
  return (
    <div className="border-b border-border py-[9px]">
      <div className="mb-[3px] flex items-center gap-[5px] text-xs text-muted-foreground">
        {label}
        <span title="Dữ liệu nhạy cảm — đã mã hoá"><Icon name="lock" size={10} className="text-muted-foreground" /></span>
      </div>
      <div className="flex items-center gap-2">
        <span className="font-mono text-sm font-medium tracking-[0.04em]">
          {show ? full : '••••••' + last4}
        </span>
        {canView ? (
          <button onClick={()=>setRevealed(r=>!r)} title={revealed?'Ẩn':'Xem đầy đủ'}
            className="grid size-[22px] cursor-pointer place-items-center rounded-sm border border-border bg-card text-muted-foreground">
            <Icon name={revealed?'eye-off':'eye'} size={12} />
          </button>
        ) : (
          <span title="Cần quyền xem dữ liệu nhạy cảm" className="inline-flex items-center gap-[3px] rounded-sm border border-dashed border-border-strong px-1.5 py-0.5 text-2xs text-muted-foreground">
            <Icon name="lock" size={10} /> Cần quyền
          </span>
        )}
      </div>
    </div>
  );
};

// ─── Helper: overlay dialog (absolute, an toàn trong artboard scale) ───────────
const PIMOverlay = ({ children, width=460 }) => (
  <div className="absolute inset-0 z-50 grid place-items-center" style={{ background:'oklch(0 0 0 / 0.42)' }}>
    <div className={CARD + " max-w-[90%] overflow-hidden shadow-2xl"} style={{ width }}>{children}</div>
  </div>
);

// ─── 01: Employee List ────────────────────────────────────────────────────────
const PIMListScreen = ({ dark=false }) => (
  <HRMShell active="employees" dark={dark}
    user={{ name:'Nguyễn Thị Lan', role:'HR Manager' }}
    title="Danh sách nhân viên" meta="247 nhân viên"
    crumbs={['Nhân viên']}
    actions={<>
      <Btn variant="outline" size="sm" icon="download">Xuất Excel</Btn>
      <Btn variant="outline" size="sm" icon="upload">Nhập dữ liệu</Btn>
      <Btn variant="primary"  size="sm" icon="plus">Thêm nhân viên</Btn>
    </>}>

    {/* Stats — 5 trạng thái */}
    <div className="mb-4 grid grid-cols-5 gap-3">
      {[
        { label:'Đang làm việc', val:'226', delta:'+5 tháng này', dir:'up',   icon:'check-circle', ib:'var(--color-success-soft)',     ic:'var(--color-success)'      },
        { label:'Đang nghỉ phép',val:'12',  delta:'4.8%',         dir:'down', icon:'umbrella',     ib:'var(--color-warning-soft)',     ic:'oklch(0.55 0.158 65)'},
        { label:'Đình chỉ',      val:'2',   delta:'Điều tra',     dir:'down', icon:'pause-circle', ib:'var(--color-destructive-soft)', ic:'var(--color-destructive)'  },
        { label:'Tạm ngưng',     val:'3',   delta:'Hành chính',   dir:'down', icon:'minus-circle', ib:'var(--color-muted)',            ic:'var(--color-muted-foreground)'},
        { label:'Tổng nhân viên',val:'247', delta:'+12 năm nay',  dir:'up',   icon:'users',        ib:'var(--color-info-soft)',        ic:'var(--color-info)'         },
      ].map((s,i)=><StatCard key={i} label={s.label} value={s.val} delta={s.delta} deltaDir={s.dir} icon={s.icon} iconBg={s.ib} iconColor={s.ic} />)}
    </div>

    {/* Filter bar */}
    <div className={CARD + " mb-3.5 flex items-center gap-2.5 px-3.5 py-2.5"}>
      <div className="relative flex items-center w-[280px]">
        <Icon name="search" size={13} className="pointer-events-none absolute left-2.5 size-3.5 text-muted-foreground" />
        <input className="h-8 w-full rounded-md border border-input bg-transparent pl-8 pr-3 text-xs text-foreground shadow-xs placeholder:text-muted-foreground transition-colors focus:border-primary focus:outline-none focus:ring-[3px] focus:ring-ring" placeholder="Tìm theo tên, mã NV, email..." />
      </div>
      {[
        { w:148, opts:['Tất cả phòng ban','Nhân sự','Engineering','Marketing','Kinh doanh','Tài chính'] },
        { w:150, opts:['Tất cả trạng thái','Đang làm việc','Đang nghỉ phép','Đình chỉ','Tạm ngưng','Đã nghỉ việc'] },
        { w:130, opts:['Loại HĐ','Toàn thời gian','Bán thời gian','Hợp đồng','Thực tập sinh','Thời vụ'] },
      ].map((s,i)=>(
        <Select key={i} options={s.opts} defaultValue={s.opts[0]} className="h-8 text-xs" style={{ width:s.w }} />
      ))}
      <Btn variant="outline" size="sm" icon="filter">Lọc nâng cao</Btn>
      <div className="flex-1" />
      <span className="text-xs text-muted-foreground">1–8 / 247</span>
    </div>

    {/* Table */}
    <div className="overflow-hidden rounded-lg border border-border bg-card">
      <table className={TABLE_CLS}>
        <thead>
          <tr>
            <th style={{ width:40 }}><input type="checkbox" /></th>
            <th>Nhân viên</th>
            <th>Phòng ban</th>
            <th>Chức danh</th>
            <th>Loại HĐ</th>
            <th>Trạng thái</th>
            <th>Ngày vào</th>
            <th style={{ width:80 }}>Thao tác</th>
          </tr>
        </thead>
        <tbody>
          {PIM_EMPLOYEES.map(e=>{
            const st = EMP_STATUS_CFG[e.status];
            const tp = EMP_TYPE_CFG[e.type];
            return (
              <tr key={e.id} className={e.status==='terminated'?'opacity-60':undefined}>
                <td><input type="checkbox" /></td>
                <td>
                  <div className="flex items-center gap-2.5">
                    <Avatar name={e.name} />
                    <div>
                      <div className="flex items-center gap-1.5 font-medium text-foreground">
                        {e.name}
                        {e.id===PIM_ME_ID && <span className="rounded-full bg-primary-soft px-1.5 py-px text-2xs font-semibold text-primary">Bạn</span>}
                      </div>
                      <div className="text-xs text-muted-foreground">{e.num} · {e.loc}</div>
                    </div>
                  </div>
                </td>
                <td className="text-sm">{e.dept}</td>
                <td className="text-sm text-muted-foreground">{e.title}</td>
                <td><Badge variant={tp.v}>{tp.label}</Badge></td>
                <td><Badge variant={st.v} dot>{st.label}</Badge></td>
                <td className="text-xs text-muted-foreground">{e.hire}</td>
                <td>
                  {e.id===PIM_ME_ID ? (
                    <Btn variant="ghost" size="sm" iconOnly icon="user" title="Mở hồ sơ của tôi (ESS /me) — không phải chế độ xem quản trị" />
                  ) : (
                    <div className="flex gap-[3px]">
                      <Btn variant="ghost" size="sm" iconOnly icon="eye" />
                      <Btn variant="ghost" size="sm" iconOnly icon={e.status==='terminated'?'rotate-ccw':'edit'} />
                    </div>
                  )}
                </td>
              </tr>
            );
          })}
        </tbody>
      </table>
      <div className="flex items-center justify-between border-t border-border px-4 py-2.5">
        <span className="text-xs text-muted-foreground">Trang 1 / 31 · 247 nhân viên</span>
        <div className="flex gap-1">
          <Btn variant="outline" size="xs" iconOnly icon="chevron-left" />
          {[1,2,3,'…',31].map((p,i)=>(
            <button key={i} className={"h-7 min-w-[28px] rounded-sm border px-[7px] text-xs " + (p===1?'border-primary bg-primary font-semibold text-white':'border-border bg-card text-foreground') + " cursor-pointer"}>{p}</button>
          ))}
          <Btn variant="outline" size="xs" iconOnly icon="chevron-right" />
        </div>
      </div>
    </div>
  </HRMShell>
);

// ─── 02: Employee Detail — 7 tabs ─────────────────────────────────────────────
// MỘT màn chi tiết /:id, render theo quyền người xem (SRS §9.1–9.3):
//   viewer='hr'      → data:employees:all + view_pii/salary → đầy đủ + sửa + thao tác vòng đời
//   viewer='manager' → data:employees:dept, CHỈ ĐỌC → ẩn PII/lương/liên lạc cá nhân, ẩn tab nhạy cảm
const PIMDetailScreen = ({ initialTab, initialEdit=false, viewer='hr' }) => {
  const e = PIM_EMPLOYEES[0];
  const P = viewer === 'manager'
    ? { user:{ name:'Lê Hữu Phước', role:'Department Manager' }, readOnly:true,  canViewPii:false, canViewSalary:false,
        tabs:['employment','contact','dependents'] }
    : { user:{ name:'Nguyễn Thị Lan', role:'HR Manager' },       readOnly:false, canViewPii:true,  canViewSalary:true,
        tabs:['personal','employment','contact','dependents','documents','custom','history'] };
  const [tab, setTab] = React.useState(initialTab || P.tabs[0]);
  const [canViewPii, setCanViewPii] = React.useState(P.canViewPii); // mô phỏng quyền action:employee:view_pii
  const [statusOpen, setStatusOpen] = React.useState(false);
  // editTarget: null | 'personal' | 'employment' | 'contact' — overlay sửa theo từng nhóm dữ liệu
  const [editTarget, setEditTarget] = React.useState(initialEdit===true ? 'personal' : (initialEdit || null));
  const ALL_TABS = [
    { id:'personal',   label:'Thông tin cá nhân' },
    { id:'employment', label:'Dữ liệu việc làm' },
    { id:'contact',    label:'Liên lạc & Khẩn cấp' },
    { id:'dependents', label:'Người phụ thuộc' },
    { id:'documents',  label:'Tài liệu' },
    { id:'custom',     label:'Trường tuỳ chỉnh' },
    { id:'history',    label:'Lịch sử thay đổi' },
  ];
  const TABS = ALL_TABS.filter(t => P.tabs.includes(t.id));
  // hàng dữ liệu + ô "Cần quyền" (trường bị ẩn theo phạm vi cấp phòng ban)
  const Row = ({ label, val }) => (
    <div className="border-b border-border py-[9px]">
      <div className="mb-[3px] text-xs text-muted-foreground">{label}</div>
      {typeof val === 'string' ? <div className="text-sm font-medium">{val}</div> : val}
    </div>
  );
  const Locked = () => (
    <span className="inline-flex items-center gap-1 rounded-sm border border-dashed border-border-strong px-[7px] py-0.5 text-2xs text-muted-foreground">
      <Icon name="lock" size={10} /> Cần quyền
    </span>
  );
  // chuyển trạng thái hợp lệ từ 'active' (§2.3)
  const STATUS_ACTIONS = [
    { to:'on_leave',  label:'Chuyển sang Nghỉ phép', desc:'Nghỉ phép dài hạn đã được duyệt', icon:'umbrella',     v:'var(--color-warning)'     },
    { to:'suspended', label:'Đình chỉ kỷ luật',      desc:'Tạm ngưng do kỷ luật / điều tra', icon:'pause-circle', v:'var(--color-destructive)' },
    { to:'inactive',  label:'Tạm ngưng hành chính',  desc:'Tạm dừng hồ sơ theo hành chính',  icon:'minus-circle', v:'var(--color-muted-foreground)' },
  ];
  return (
    <HRMShell active="employees"
      user={P.user}
      title={e.name}
      crumbs={['Nhân viên', e.name]}
      meta={<Badge variant="success" dot>Đang làm việc</Badge>}
      actions={P.readOnly ? undefined : <>
        <div className="relative">
          <Btn variant="outline" size="sm" icon="rotate-ccw" onClick={()=>setStatusOpen(o=>!o)}>Đổi trạng thái</Btn>
          {statusOpen && (
            <div className={CARD + " absolute right-0 z-40 w-[280px] p-1.5 shadow-lg"} style={{ top:'calc(100% + 6px)' }}>
              <div className="px-2 py-1.5 text-2xs font-bold uppercase tracking-[0.06em] text-muted-foreground">Từ trạng thái “Đang làm việc”</div>
              {STATUS_ACTIONS.map(a=>(
                <div key={a.to} className="flex cursor-pointer items-center gap-[9px] rounded-sm p-2 text-sm"
                  onMouseEnter={ev=>ev.currentTarget.style.background='var(--color-muted)'} onMouseLeave={ev=>ev.currentTarget.style.background='transparent'}>
                  <Icon name={a.icon} size={14} className="shrink-0" style={{ color:a.v }} />
                  <div className="flex-1">
                    <div className="font-medium">{a.label}</div>
                    <div className="text-2xs text-muted-foreground">{a.desc}</div>
                  </div>
                </div>
              ))}
              <div className="my-1 border-t border-border" />
              <div className="px-2 py-1 text-2xs leading-[1.5] text-muted-foreground">
                Mọi thay đổi trạng thái đều được kiểm tra hợp lệ và ghi vào lịch sử thay đổi.
              </div>
            </div>
          )}
        </div>
        <Btn variant="destructive" size="sm">Chấm dứt HĐ</Btn>
      </>}>

      {!P.readOnly && editTarget==='personal'   && <PIMEditPersonalOverlay   e={e} canViewPii={canViewPii} onClose={()=>setEditTarget(null)} />}
      {!P.readOnly && editTarget==='employment' && <PIMEditEmploymentOverlay e={e} onClose={()=>setEditTarget(null)} />}
      {!P.readOnly && editTarget==='contact'    && <PIMEditContactOverlay    e={e} onClose={()=>setEditTarget(null)} />}

      {P.readOnly && (
        <div className="mb-4 flex items-start gap-[9px] rounded-md bg-info-soft px-3.5 py-[11px] text-xs leading-[1.55]" style={{ color:'oklch(0.385 0.062 222)' }}>
          <Icon name="shield" size={14} className="mt-px shrink-0" style={{ color:'var(--color-info)' }} />
          <span>Bạn xem hồ sơ này theo <strong>phạm vi dữ liệu cấp phòng ban</strong> (cây đơn vị bạn phụ trách). Dữ liệu nhạy cảm (CCCD/MST, lương, liên lạc cá nhân, trường tuỳ chỉnh) bị ẩn. Trưởng phòng chỉ có quyền <strong>xem</strong> — mọi thay đổi do HR thực hiện.</span>
        </div>
      )}

      <div className="grid grid-cols-[260px_1fr] gap-4">
        {/* Left panel */}
        <div className="flex flex-col gap-3">
          <div className={CARD + " p-5"}>
            <div className="mb-3.5 border-b border-border pb-4 text-center">
              <div className="mb-2.5 flex justify-center">
                <div className="relative">
                  <Avatar name={e.name} size="xl" />
                  {!P.readOnly && (
                    <button className="absolute bottom-0 right-0 grid size-6 cursor-pointer place-items-center rounded-full border-2 border-card bg-primary">
                      <Icon name="edit" size={11} className="text-white" />
                    </button>
                  )}
                </div>
              </div>
              <div className="mb-[3px] text-md font-bold">{e.name}</div>
              <div className="mb-2 text-xs text-muted-foreground">{e.title}</div>
              <div className="flex flex-wrap justify-center gap-1.5">
                <Badge variant="success" dot>Đang làm việc</Badge>
                <Badge variant="primary">Toàn thời gian</Badge>
              </div>
            </div>
            {[
              { icon:'user',     label:'Mã NV (chính)',     val:e.num       },
              { icon:'building', label:'Phòng ban',         val:e.dept      },
              { icon:'briefcase',label:'Chức danh',         val:e.title     },
              { icon:'map-pin',  label:'Địa điểm',          val:e.loc       },
              { icon:'calendar', label:'Ngày vào',          val:e.hire      },
              { icon:'user',     label:'Quản lý trực tiếp', val:e.supervisor},
            ].map((f,i)=>(
              <div key={i} className="mb-[9px] flex gap-[9px]">
                <Icon name={f.icon} size={13} className="mt-0.5 shrink-0 text-muted-foreground" />
                <div>
                  <div className="text-xs text-muted-foreground">{f.label}</div>
                  <div className="text-xs font-medium">{f.val}</div>
                </div>
              </div>
            ))}
          </div>
          {P.canViewSalary ? (
          <div className={CARD + " p-3.5"}>
            <div className="mb-2.5 text-2xs font-bold uppercase tracking-[0.07em] text-muted-foreground">Liên kết module</div>
            {[
              { icon:'dollar',   label:'Xem bảng lương',     color:'var(--color-success)'     },
              { icon:'umbrella', label:'Số dư nghỉ phép',    color:'var(--color-info)'        },
              { icon:'clock',    label:'Lịch sử chấm công',  color:'var(--color-primary)'     },
              { icon:'award',    label:'Đánh giá hiệu suất', color:'var(--color-warning)'     },
            ].map((a,i)=>(
              <div key={i} className={"flex cursor-pointer items-center gap-[9px] rounded-sm px-1.5 py-[7px] text-sm " + (i<3?"border-b border-border":"")}>
                <Icon name={a.icon} size={13} className="shrink-0" style={{ color:a.color }} />
                {a.label}
                <Icon name="chevron-right" size={11} className="ml-auto text-muted-foreground" />
              </div>
            ))}
          </div>
          ) : (
          <div className={CARD + " bg-muted p-3.5"}>
            <div className="flex items-start gap-2 text-2xs leading-[1.5] text-muted-foreground">
              <Icon name="lock" size={12} className="mt-px shrink-0" />
              <span>Lương, đánh giá hiệu suất và liên kết module bị ẩn ở chế độ xem phòng ban.</span>
            </div>
          </div>
          )}
        </div>

        {/* Right — tabs */}
        <div className={CARD + " overflow-hidden"}>
          <div className="flex gap-1 overflow-x-auto flex-nowrap border-b border-border px-3">
            {TABS.map(t=>(
              <div key={t.id} onClick={()=>setTab(t.id)} className={"-mb-px cursor-pointer whitespace-nowrap border-b-2 px-2.5 py-3 text-sm font-medium " + (tab===t.id?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground")}>
                {t.label}
              </div>
            ))}
          </div>
          <div className="p-[22px]">
            {tab==='personal' && (
              <div>
                <div className="mb-3.5 flex items-center justify-between">
                  <div className="text-base font-bold">Thông tin cá nhân</div>
                  <div className="flex items-center gap-2">
                    <button onClick={()=>setCanViewPii(v=>!v)}
                      className={"inline-flex cursor-pointer items-center gap-1.5 rounded-full border border-border px-2.5 py-[5px] text-xs font-medium " + (canViewPii?"bg-success-soft text-success":"bg-muted text-muted-foreground")}>
                      <Icon name={canViewPii?'eye':'lock'} size={12} /> Xem dữ liệu nhạy cảm: {canViewPii?'Bật · có quyền view_pii':'Tắt · thiếu quyền'}
                    </button>
                    {!P.readOnly && <Btn variant="soft" size="sm" icon="edit" onClick={()=>setEditTarget('personal')}>Chỉnh sửa</Btn>}
                  </div>
                </div>
                <div className="grid grid-cols-2 gap-x-7 gap-y-1.5">
                  {[
                    ['Họ và tên',     e.name        ],
                    ['Giới tính',     'Nữ'          ],
                    ['Ngày sinh',     '15/04/1992'  ],
                    ['Quốc tịch',     'VNM · Việt Nam'],
                    ['Tình trạng HN', 'Đã kết hôn'  ],
                    ['Nhóm máu',      'O+'          ],
                  ].map(([label,val],i)=>(
                    <div key={i} className="border-b border-border py-[9px]">
                      <div className="mb-[3px] text-xs text-muted-foreground">{label}</div>
                      <div className="text-sm font-medium">{val}</div>
                    </div>
                  ))}
                  <PiiField label="Số định danh (CCCD)" last4={e.cccd4} full={'0011 9203 ' + e.cccd4} canView={canViewPii} />
                  <PiiField label="Mã số thuế (MST)"    last4={e.mst4}  full={'8 234 56' + e.mst4}     canView={canViewPii} />
                  {[
                    ['GPLX số',     canViewPii?'B2-01234567':'••••••4567'],
                    ['GPLX hết hạn','15/04/2028'],
                    ['Tên khai thuế','Nguyễn Thị Lan'],
                    ['Mã nhân viên cũ','— (không có)'],
                  ].map(([label,val],i)=>(
                    <div key={i} className="border-b border-border py-[9px]">
                      <div className="mb-[3px] text-xs text-muted-foreground">{label}</div>
                      <div className="text-sm font-medium">{val}</div>
                    </div>
                  ))}
                </div>
                <div className="mt-3.5 flex items-start gap-2 rounded-md bg-muted px-3 py-2.5 text-xs leading-[1.55] text-muted-foreground">
                  <Icon name="lock" size={13} className="mt-px shrink-0" />
                  <span>Số CCCD & mã số thuế được <strong>mã hoá khi lưu trữ</strong>, mặc định chỉ hiển thị 4 số cuối. Chỉ vai trò có quyền xem dữ liệu nhạy cảm mới thấy đầy đủ; mỗi lần xem đều được ghi lại.</span>
                </div>
              </div>
            )}
            {tab==='employment' && (
              <div>
                <div className="mb-3.5 flex items-center justify-between">
                  <div className="text-base font-bold">Dữ liệu việc làm</div>
                  {!P.readOnly && <Btn variant="soft" size="sm" icon="edit" onClick={()=>setEditTarget('employment')}>Chỉnh sửa</Btn>}
                </div>
                <div className="mb-5 grid grid-cols-2 gap-x-7 gap-y-1.5">
                  {[
                    { l:'Chức danh',         v:e.title },
                    { l:'Đơn vị',            v:'Phòng Nhân sự' },
                    { l:'Loại hợp đồng',     v:'Toàn thời gian',     restrict:true },
                    { l:'Bậc lương',         v:'Grade B3',           restrict:true },
                    { l:'Ca làm việc',       v:'Hành chính (8–17h)', hide:true },
                    { l:'Địa điểm làm việc', v:e.loc },
                    { l:'Ngày vào làm',      v:e.hire },
                    { l:'Quản lý trực tiếp', v:e.supervisor },
                    { l:'Quản lý thay thế',  v:'Bùi Thị Linh',       hide:true },
                    { l:'Là quản lý?',       v:'Có (3 cấp dưới)',    hide:true },
                  ].filter(f=>!(P.readOnly && f.hide)).map((f,i)=>(
                    <Row key={i} label={f.l} val={P.readOnly && f.restrict ? <Locked/> : f.v} />
                  ))}
                </div>
                {!P.readOnly && (
                <div className="rounded-lg bg-muted p-4">
                  <div className="mb-3 text-xs font-bold">Chuỗi báo cáo <span className="font-normal text-muted-foreground">· theo quản lý trực tiếp</span></div>
                  <div className="flex flex-wrap items-center gap-2.5">
                    {[e.name, e.supervisor, 'Ban Giám Đốc'].map((n,i,arr)=>(
                      <React.Fragment key={i}>
                        <div className="flex items-center gap-[7px]">
                          <Avatar name={n} size="sm" />
                          <div>
                            <div className="text-xs font-medium">{n}</div>
                            <div className="text-xs text-muted-foreground">{i===0?e.title:i===1?'HR Director':'CEO'}</div>
                          </div>
                        </div>
                        {i<arr.length-1 && <Icon name="arrow-right" size={14} className="text-muted-foreground" />}
                      </React.Fragment>
                    ))}
                  </div>
                </div>
                )}
              </div>
            )}
            {tab==='contact' && (
              <div>
                <div className="mb-3.5 flex items-center justify-between">
                  <div className="text-base font-bold">Thông tin liên lạc{P.readOnly && <span className="text-xs font-normal text-muted-foreground"> · chỉ liên lạc công việc</span>}</div>
                  {!P.readOnly && <Btn variant="soft" size="sm" icon="edit" onClick={()=>setEditTarget('contact')}>Chỉnh sửa</Btn>}
                </div>
                <div className="mb-5 grid grid-cols-2 gap-x-7 gap-y-1.5">
                  {[
                    { l:'Email công ty',  v:e.email + '  · chính' },
                    { l:'Email cá nhân',  v:'lan.nguyen.personal@gmail.com', restrict:true },
                    { l:'SĐT di động',    v:e.phone, restrict:true },
                    { l:'SĐT nhà',        v:'024 3456 7890', restrict:true },
                    { l:'SĐT công ty',    v:'028 1234 5678' },
                    { l:'Địa chỉ · Thường trú (chính)', v:'15 Trần Duy Hưng, Cầu Giấy, Hà Nội, VNM', restrict:true },
                    { l:'Địa chỉ · Nhận thư', v:'92 Láng Hạ, Đống Đa, Hà Nội, VNM', restrict:true },
                  ].map((f,i)=>(
                    <Row key={i} label={f.l} val={P.readOnly && f.restrict ? <Locked/> : f.v} />
                  ))}
                </div>
                <div className="mb-3 text-base font-bold">Liên lạc khẩn cấp <span className="text-xs font-normal text-muted-foreground">· {P.readOnly ? 'chỉ tên & số điện thoại' : 'tối thiểu 1, tối đa 5'}</span></div>
                {[
                  { name:'Nguyễn Văn Bình', rel:'Vợ/Chồng', phone:'0987 654 321', primary:true  },
                  { name:'Trần Thị Minh',   rel:'Cha/Mẹ',   phone:'0976 543 210', primary:false },
                ].map((c,i)=>(
                  <div key={i} className="mb-2 flex items-center gap-3 rounded-md border border-border p-3">
                    <Avatar name={c.name} />
                    <div className="flex-1">
                      <div className="text-sm font-semibold">{c.name}</div>
                      <div className="text-xs text-muted-foreground">{P.readOnly ? c.phone + ' · quan hệ ẩn' : c.rel + ' · ' + c.phone}</div>
                    </div>
                    {c.primary && <Badge variant="primary">Chính</Badge>}
                  </div>
                ))}
              </div>
            )}
            {tab==='dependents' && (
              <div>
                <div className="mb-3.5 flex items-center justify-between">
                  <div className="text-base font-bold">2 người phụ thuộc <span className="text-xs font-normal text-muted-foreground">· {P.readOnly ? 'chỉ tên & quan hệ' : 'tối đa 20'}</span></div>
                  {!P.readOnly && <Btn variant="soft" size="sm" icon="plus">Thêm người PT</Btn>}
                </div>
                {[
                  { name:'Nguyễn Hà Linh',  rel:'Con',  gender:'Nữ', dob:'12/05/2018', cccd4:'8821', tax:true,  financial:true,  emg:true  },
                  { name:'Nguyễn Minh Anh', rel:'Con',  gender:'Nam',dob:'08/09/2021', cccd4:'9930', tax:true,  financial:false, emg:false },
                ].map((d,i)=>(
                  <div key={i} className="mb-2 flex items-start gap-3 rounded-md border border-border p-3.5">
                    <Avatar name={d.name} />
                    <div className="flex-1">
                      <div className="text-sm font-semibold">{d.name}</div>
                      {P.readOnly ? (
                        <div className="mt-0.5 text-xs text-muted-foreground">{d.rel}</div>
                      ) : (<>
                        <div className="mt-0.5 text-xs text-muted-foreground">{d.rel} · {d.gender} · Sinh: {d.dob} · CCCD ••••••{d.cccd4}</div>
                        <div className="mt-1.5 flex flex-wrap gap-1.5">
                          {d.tax && <Badge variant="info">Giảm trừ thuế</Badge>}
                          {d.financial && <Badge variant="neutral">Phụ thuộc tài chính</Badge>}
                          {d.emg && <Badge variant="success">Liên hệ khẩn cấp</Badge>}
                        </div>
                      </>)}
                    </div>
                    {!P.readOnly && (
                    <div className="flex gap-1">
                      <Btn variant="ghost" size="sm" iconOnly icon="edit" />
                      <Btn variant="ghost" size="sm" iconOnly icon="trash" />
                    </div>
                    )}
                  </div>
                ))}
              </div>
            )}
            {tab==='documents' && (
              <div>
                <div className="mb-3.5 flex items-center justify-between">
                  <div className="text-base font-bold">Tài liệu đính kèm <span className="text-xs font-normal text-muted-foreground">· 5 tệp · lưu trữ an toàn</span></div>
                  <Btn variant="soft" size="sm" icon="upload">Tải lên tài liệu</Btn>
                </div>
                {/* Dropzone */}
                <div className="mb-4 rounded-lg border-[1.5px] border-dashed border-border-strong bg-muted p-[18px] text-center">
                  <Icon name="upload" size={20} className="mb-1.5 text-muted-foreground" />
                  <div className="text-sm font-medium">Kéo thả tệp vào đây hoặc bấm để chọn</div>
                  <div className="mt-[3px] text-xs text-muted-foreground">PDF, JPG, PNG · tối đa 10MB · CCCD/CMND, hợp đồng, CV, chứng chỉ</div>
                </div>
                {[
                  { type:'national_id', name:'CCCD_NguyenThiLan.pdf',     size:'1.2 MB', by:'Hồ Văn Minh', at:'01/03/2024' },
                  { type:'contract',    name:'HopDongLaoDong_2024.pdf',   size:'480 KB', by:'Hồ Văn Minh', at:'01/03/2024' },
                  { type:'resume',      name:'CV_NguyenThiLan.pdf',       size:'320 KB', by:'Nguyễn Thị Lan',at:'28/02/2024' },
                  { type:'certificate', name:'ChungChi_PMP.pdf',          size:'890 KB', by:'Nguyễn Thị Lan',at:'10/06/2024' },
                  { type:'photo',       name:'Anh_3x4.jpg',               size:'210 KB', by:'Hồ Văn Minh', at:'01/03/2024' },
                ].map((doc,i)=>{
                  const cfg = DOC_TYPE_CFG[doc.type];
                  return (
                    <div key={i} className="mb-2 flex items-center gap-3 rounded-md border border-border px-3 py-[11px]">
                      <div className="grid size-[34px] shrink-0 place-items-center rounded-md" style={{ background:cfg.bg }}>
                        <Icon name={cfg.icon} size={16} style={{ color:cfg.color }} />
                      </div>
                      <div className="min-w-0 flex-1">
                        <div className="flex items-center gap-[7px] text-sm font-semibold">
                          {doc.name}
                          {cfg.sensitive && <span className="inline-flex items-center gap-[3px] rounded-full bg-destructive-soft px-1.5 py-px text-2xs text-destructive"><Icon name="lock" size={9} />Nhạy cảm</span>}
                        </div>
                        <div className="mt-0.5 text-xs text-muted-foreground">{cfg.label} · {doc.size} · {doc.by} · {doc.at}</div>
                      </div>
                      <Btn variant="ghost" size="sm" iconOnly icon="download" title={cfg.sensitive?'Tải về cần quyền xem dữ liệu nhạy cảm':'Tải về'} />
                      <Btn variant="ghost" size="sm" iconOnly icon="trash" />
                    </div>
                  );
                })}
                <div className="mt-2 flex items-start gap-2 rounded-md bg-info-soft px-3 py-2.5 text-xs leading-[1.5]" style={{ color:'oklch(0.385 0.062 222)' }}>
                  <Icon name="info" size={13} className="mt-px shrink-0" style={{ color:'var(--color-info)' }} />
                  <span>Tài liệu <strong>CCCD/CMND</strong> chỉ tải về được khi có quyền xem dữ liệu nhạy cảm. Mọi thao tác tải lên / xoá đều được ghi vào lịch sử.</span>
                </div>
              </div>
            )}
            {tab==='custom' && (
              <div>
                <div className="mb-3.5 flex items-center justify-between">
                  <div className="text-base font-bold">Trường tuỳ chỉnh <span className="text-xs font-normal text-muted-foreground">· do quản trị viên cấu hình</span></div>
                  <Btn variant="outline" size="sm" icon="settings">Quản lý trường</Btn>
                </div>
                <div className="grid grid-cols-2 gap-x-7 gap-y-1.5">
                  {[
                    { label:'Mã số BHXH',            type:'text',     val:'0123 456 789', ess:true  },
                    { label:'Size áo đồng phục',     type:'dropdown', val:'L',            ess:true  },
                    { label:'Ngày ký NDA',           type:'date',     val:'05/03/2024',   ess:false },
                    { label:'Đã hoàn thành ATLĐ',    type:'checkbox', val:'Có',           ess:false },
                    { label:'Số tài khoản ngân hàng',type:'text',     val:'1903 •••• 4521',ess:false },
                    { label:'Mức phụ cấp ăn trưa',   type:'number',   val:'730.000 ₫',    ess:true  },
                  ].map((f,i)=>(
                    <div key={i} className="border-b border-border py-[9px]">
                      <div className="mb-[3px] flex items-center gap-1.5 text-xs text-muted-foreground">
                        {f.label}
                        <span className="rounded-sm bg-muted px-1.5 text-2xs text-muted-foreground">{({text:'Văn bản',number:'Số',date:'Ngày',dropdown:'Danh sách',checkbox:'Có/Không'})[f.type]}</span>
                        {f.ess && <span title="Hiển thị cho nhân viên" className="text-2xs text-success">NV xem được</span>}
                      </div>
                      <div className="text-sm font-medium">{f.val}</div>
                    </div>
                  ))}
                </div>
              </div>
            )}
            {tab==='history' && (
              <div>
                <div className="mb-3.5 flex items-center justify-between">
                  <div className="text-base font-bold">Lịch sử thay đổi</div>
                  <span className="text-xs text-muted-foreground">Toàn bộ thay đổi đều được ghi lại</span>
                </div>
                {[
                  { field:'Số CCCD',       old:'(đã ẩn)', nv:'(đã ẩn)', action:'Cập nhật hồ sơ',  by:'Hồ Văn Minh (Quản trị)',  time:'02/06/2026 09:14', type:'admin' },
                  { field:'Trạng thái HN', old:'Độc thân',   nv:'Đã kết hôn', action:'Cập nhật hồ sơ',  by:'Nguyễn Thị Lan (Tự cập nhật)', time:'15/02/2026 10:22', type:'self'  },
                  { field:'Chức danh',     old:'HR Specialist', nv:'HR Manager', action:'Cập nhật hồ sơ', by:'Hồ Văn Minh (Quản trị)',  time:'01/03/2025 09:00', type:'admin' },
                  { field:'Tài liệu',      old:'—', nv:'ChungChi_PMP.pdf', action:'Tải lên tài liệu', by:'Nguyễn Thị Lan (Tự cập nhật)', time:'10/06/2024 16:40', type:'self'  },
                ].map((ev,i)=>(
                  <div key={i} className={"flex gap-3 py-2.5 " + (i<3?"border-b border-border":"")}>
                    <div className={"grid size-8 shrink-0 place-items-center rounded-full " + (ev.type==='self'?"bg-info-soft":"bg-primary-soft")}>
                      <Icon name={ev.type==='self'?'user':'settings'} size={13} style={{ color:ev.type==='self'?'var(--color-info)':'var(--color-primary)' }} />
                    </div>
                    <div className="flex-1">
                      <div className="flex flex-wrap items-center gap-2 text-sm font-semibold">
                        Thay đổi <em>{ev.field}</em>
                        <span className="rounded-sm bg-muted px-1.5 py-px text-2xs text-muted-foreground">{ev.action}</span>
                      </div>
                      <div className="mt-[3px] text-xs text-muted-foreground">
                        <span className="rounded-sm bg-destructive-soft px-[5px] py-px text-destructive">{ev.old}</span>
                        <Icon name="arrow-right" size={10} className="mx-1 inline align-middle" />
                        <span className="rounded-sm bg-success-soft px-[5px] py-px text-success">{ev.nv}</span>
                      </div>
                      <div className="mt-1 text-xs text-muted-foreground">bởi {ev.by} · {ev.time}</div>
                    </div>
                  </div>
                ))}
              </div>
            )}
          </div>
        </div>
      </div>
    </HRMShell>
  );
};

// ─── 03: Add Employee Form ─────────────────────────────────────────────────────
const PIMCreateScreen = () => (
  <HRMShell active="employees"
    title="Thêm nhân viên mới"
    crumbs={['Nhân viên','Thêm mới']}
    actions={<>
      <Btn variant="outline" size="sm">Hủy</Btn>
      <Btn variant="primary"  size="sm">Lưu hồ sơ</Btn>
    </>}>
    <div className="grid grid-cols-[1fr_300px] gap-[18px]">
      <div className="flex flex-col gap-4">
        {[
          { title:'Thông tin cá nhân', icon:'user', fields:[
            [{ label:'Họ *', ph:'Nguyễn', w:'1fr' }, { label:'Tên đệm', ph:'Thị', w:'1fr' }, { label:'Tên *', ph:'Lan', w:'1fr' }],
            [{ label:'Ngày sinh * (≥16 tuổi)', ph:'dd/mm/yyyy', type:'date', w:'1fr' }, { label:'Giới tính *', type:'select', opts:['— Chọn —','Nam','Nữ','Khác','Không tiết lộ'], w:'1fr' }],
            [{ label:'Quốc tịch *', ph:'Việt Nam', w:'1fr' }, { label:'Tình trạng hôn nhân *', type:'select', opts:['— Chọn —','Độc thân','Đã kết hôn','Ly hôn','Goá','Ly thân','Sống chung'], w:'1fr' }],
            [{ label:'Số CCCD/CMND', ph:'012345678901', pii:true, w:'1fr' }, { label:'Mã số thuế', ph:'8234567890', pii:true, w:'1fr' }, { label:'Tên khai thuế', ph:'Nguyễn Thị Lan', w:'1fr' }],
            [{ label:'Nhóm máu', type:'select', opts:['— Chọn —','A+','A-','B+','B-','AB+','AB-','O+','O-','Không rõ'], w:'1fr' }, { label:'GPLX số', ph:'B2-01234567', w:'1fr' }, { label:'GPLX hết hạn', ph:'dd/mm/yyyy', type:'date', w:'1fr' }],
          ]},
          { title:'Thông tin việc làm', icon:'briefcase', fields:[
            [{ label:'Chức danh *', type:'select', opts:['— Chọn chức danh —','HR Manager','Software Engineer','Accountant'], w:'1fr' }, { label:'Đơn vị *', type:'select', opts:['— Chọn đơn vị —','Phòng Nhân sự','Engineering','Marketing'], w:'1fr' }],
            [{ label:'Loại hợp đồng *', type:'select', opts:['— Chọn —','Toàn thời gian','Bán thời gian','Hợp đồng','Thực tập sinh','Thời vụ'], w:'1fr' }, { label:'Ngày vào làm *', ph:'dd/mm/yyyy', type:'date', w:'1fr' }],
            [{ label:'Quản lý trực tiếp', ph:'Tìm nhân viên đang làm việc...', w:'1fr' }, { label:'Quản lý thay thế', ph:'Tuỳ chọn...', w:'1fr' }],
            [{ label:'Địa điểm làm việc', type:'select', opts:['Hà Nội','HCM','Đà Nẵng'], w:'1fr' }, { label:'Ca làm việc', type:'select', opts:['Hành chính (standard)','Xoay ca','Ca đêm','Linh hoạt','Trực'], w:'1fr' }],
            [{ label:'Mã NV (chính)', ph:'Tự động sinh khi lưu — EMP-YYYY-NNNN', dis:true, w:'1fr' }],
          ]},
          { title:'Thông tin liên lạc & khẩn cấp', icon:'phone', fields:[
            [{ label:'Email công ty *', ph:'ten@els.tech', w:'1fr' }, { label:'SĐT di động', ph:'+84 9xx xxx xxx', w:'1fr' }],
            [{ label:'Địa chỉ thường trú', ph:'Số nhà, đường...', w:'2fr' }, { label:'Tỉnh/Thành phố', type:'select', opts:['Hà Nội','HCM','Đà Nẵng'], w:'1fr' }],
            [{ label:'Liên hệ khẩn cấp — Họ tên *', ph:'Nguyễn Văn Bình', w:'1fr' }, { label:'Quan hệ *', type:'select', opts:['Vợ/Chồng','Cha/Mẹ','Con','Anh/Chị/Em','Bạn bè','Khác'], w:'1fr' }],
          ]},
        ].map((sec,si)=>(
          <div key={si} className={CARD + " p-[22px]"}>
            <div className="mb-[18px] flex items-center gap-2">
              <div className="grid size-7 place-items-center rounded-md bg-primary-soft">
                <Icon name={sec.icon} size={14} className="text-primary" />
              </div>
              <span className="text-base font-bold">{sec.title}</span>
            </div>
            {sec.fields.map((row,ri)=>(
              <div key={ri} className="mb-3.5 grid gap-3.5" style={{ gridTemplateColumns:row.map(f=>f.w||'1fr').join(' ') }}>
                {row.map((f,fi)=>(
                  <div key={fi}>
                    <label className="mb-[5px] flex items-center gap-[5px] text-xs font-medium">
                      {f.label}
                      {f.pii && <Icon name="lock" size={10} className="text-muted-foreground" />}
                    </label>
                    {f.type==='select'
                      ? <Select options={f.opts||[]} defaultValue={(f.opts||[])[0]} />
                      : <input className={"h-9 w-full rounded-md border border-input px-3 text-base text-foreground shadow-xs placeholder:text-muted-foreground transition-colors focus:border-primary focus:outline-none focus:ring-[3px] focus:ring-ring " + (f.dis?"bg-muted text-muted-foreground":"bg-transparent")} type={f.type||'text'} placeholder={f.ph} disabled={f.dis} />
                    }
                  </div>
                ))}
              </div>
            ))}
          </div>
        ))}
      </div>

      {/* Right sidebar */}
      <div className="flex flex-col gap-3">
        <div className={CARD + " p-[18px] text-center"}>
          <div className="mx-auto mb-3 flex size-20 cursor-pointer items-center justify-center rounded-full border-2 border-dashed border-border-strong bg-muted">
            <Icon name="upload" size={22} className="text-muted-foreground" />
          </div>
          <div className="mb-1 text-sm font-medium">Ảnh đại diện</div>
          <div className="mb-2.5 text-xs text-muted-foreground">PNG, JPG tối đa 5MB · lưu trữ an toàn</div>
          <Btn variant="outline" size="xs">Chọn ảnh</Btn>
        </div>
        <div className={CARD + " p-4"}>
          <div className="mb-2.5 text-xs font-bold">Tạo tài khoản đăng nhập</div>
          <label className="mb-2.5 flex cursor-pointer items-center gap-2 text-sm">
            <div className="grid size-4 place-items-center rounded-sm border-[1.5px] border-primary bg-primary">
              <Icon name="check" size={10} className="text-white" />
            </div>
            Tự động tạo tài khoản
          </label>
          <div className="text-xs leading-[1.5] text-muted-foreground">
            Hồ sơ nhân viên có thể tồn tại độc lập với tài khoản đăng nhập (User Management module xử lý liên kết).
          </div>
        </div>
        <div className={CARD + " p-4"}>
          <div className="mb-2.5 text-xs font-bold uppercase tracking-[0.07em] text-muted-foreground">Tiến trình nhập liệu</div>
          {[
            { label:'Thông tin cá nhân', done:false },
            { label:'Thông tin việc làm', done:false },
            { label:'Liên lạc & khẩn cấp', done:false },
            { label:'Tài liệu đính kèm (tuỳ chọn)', done:false },
          ].map((s,i)=>(
            <div key={i} className={"flex items-center gap-2 py-1.5 text-xs " + (i<3?"border-b border-border":"")}>
              <div className="grid size-[18px] shrink-0 place-items-center rounded-sm border-[1.5px] border-border-strong">
                {s.done && <Icon name="check" size={10} className="text-success" />}
              </div>
              <span className={s.done?"text-foreground":"text-muted-foreground"}>{s.label}</span>
            </div>
          ))}
        </div>
      </div>
    </div>
  </HRMShell>
);

// ─── 04: ESS Self-Service View ────────────────────────────────────────────────
const PIMESSScreen = () => {
  const [tab, setTab] = React.useState('personal');
  // ESS field editability matrix (§8.2): 'direct' = lưu ngay; 'request' = qua EditRequest; 'no' = chỉ HR
  const ESS_PERSONAL = [
    { label:'Họ và tên',          val:'Nguyễn Thị Lan',   edit:'request' },
    { label:'Ngày sinh',          val:'15/04/1992',        edit:'request' },
    { label:'Giới tính',          val:'Nữ',                edit:'request' },
    { label:'Quốc tịch',          val:'VNM · Việt Nam',    edit:'request' },
    { label:'Tình trạng hôn nhân',val:'Đã kết hôn',        edit:'direct'  },
    { label:'Nhóm máu',           val:'O+',                edit:'direct'  },
    { label:'GPLX số',            val:'B2-01234567',       edit:'direct'  },
    { label:'Email cá nhân',      val:'lan.ng@gmail.com',  edit:'direct'  },
    { label:'SĐT di động',        val:'0912 345 678',      edit:'direct'  },
    { label:'CCCD / MST',         val:'••••••3456 / ••••••7890', edit:'no' },
  ];
  // Tab Liên lạc — SĐT & email cá nhân sửa trực tiếp; email công ty do HR quản lý
  const ESS_CONTACT = [
    { label:'Email công ty',     val:'lan.nguyen@els.tech',              edit:'no'     },
    { label:'Email cá nhân',     val:'lan.nguyen.personal@gmail.com',    edit:'direct' },
    { label:'SĐT di động',       val:'0912 345 678',                     edit:'direct' },
    { label:'SĐT nhà',           val:'024 3456 7890',                    edit:'direct' },
    { label:'Địa chỉ · Thường trú',val:'15 Trần Duy Hưng, Cầu Giấy, Hà Nội',edit:'direct' },
    { label:'Địa chỉ · Nhận thư',  val:'92 Láng Hạ, Đống Đa, Hà Nội',      edit:'direct' },
  ];
  // Liên hệ khẩn cấp — nhân viên tự quản lý (sửa trực tiếp)
  const ESS_EMERGENCY = [
    { name:'Nguyễn Văn Bình', rel:'Vợ/Chồng', phone:'0987 654 321', primary:true  },
    { name:'Trần Thị Minh',   rel:'Cha/Mẹ',   phone:'0976 543 210', primary:false },
  ];
  // Người phụ thuộc — thêm/sửa đều phải gửi HR duyệt vì ảnh hưởng giảm trừ thuế
  const ESS_DEPENDENTS = [
    { name:'Nguyễn Hà Linh',  rel:'Con', gender:'Nữ',  dob:'12/05/2018', cccd4:'8821', tax:true,  status:'approved' },
    { name:'Nguyễn Minh Anh', rel:'Con', gender:'Nam', dob:'08/09/2021', cccd4:'9930', tax:true,  status:'pending'  },
  ];
  const EDIT_TAG = {
    direct:  { label:'Sửa trực tiếp', color:'var(--color-success)', bg:'var(--color-success-soft)', icon:'edit' },
    request: { label:'Cần HR duyệt',  color:'var(--color-warning)', bg:'var(--color-warning-soft)', icon:'send' },
    no:      { label:'Chỉ HR sửa',    color:'var(--color-muted-foreground)', bg:'var(--color-muted)', icon:'lock' },
  };
  return (
    <HRMShell active="my-info"
      user={{ name:'Nguyễn Thị Lan', role:'HR Manager' }}
      title="Hồ sơ của tôi"
      crumbs={['Hồ sơ của tôi']}
      actions={<Btn variant="primary" size="sm" icon="send">Gửi yêu cầu chỉnh sửa</Btn>}>

      <div className="grid grid-cols-[240px_1fr] gap-4">
        {/* Left */}
        <div className={CARD + " p-5"}>
          <div className="mb-4 border-b border-border pb-4 text-center">
            <Avatar name="Nguyễn Thị Lan" size="xl" />
            <div className="mt-2.5 text-md font-bold">Nguyễn Thị Lan</div>
            <div className="text-xs text-muted-foreground">HR Manager · EMP-2024-0001</div>
            <div className="mt-2 flex justify-center gap-1.5">
              <Badge variant="success" dot>Đang làm việc</Badge>
            </div>
          </div>
          {/* Pending edit request */}
          <div className="mb-4 border-b border-border pb-3.5">
            <div className="mb-2.5 text-xs font-bold uppercase tracking-[0.05em] text-muted-foreground">Yêu cầu đang chờ</div>
            <div className="rounded-md bg-warning-soft px-3 py-2.5" style={{ border:'1px solid oklch(0.835 0.158 80 / 0.35)' }}>
              <div className="mb-1 flex items-center gap-[7px]">
                <Icon name="clock" size={13} style={{ color:'oklch(0.55 0.13 65)' }} />
                <span className="text-xs font-semibold" style={{ color:'oklch(0.45 0.1 65)' }}>Đổi “Họ và tên”</span>
              </div>
              <div className="text-2xs leading-[1.5]" style={{ color:'oklch(0.45 0.1 65)' }}>Lan → Lan Anh · chờ HR duyệt · gửi 12/06/2026</div>
            </div>
          </div>
          {/* Quick actions */}
          {[
            { icon:'umbrella', label:'Xin nghỉ phép',  color:'var(--color-primary)' },
            { icon:'clock',    label:'Xem chấm công',  color:'var(--color-info)'    },
            { icon:'dollar',   label:'Phiếu lương',    color:'var(--color-warning)' },
            { icon:'paperclip',label:'Tài liệu của tôi',color:'var(--color-success)'},
          ].map((a,i)=>(
            <div key={i} className={"flex cursor-pointer items-center gap-[9px] py-2 text-sm " + (i<3?"border-b border-border":"")}>
              <Icon name={a.icon} size={14} style={{ color:a.color }} />
              {a.label}
              <Icon name="chevron-right" size={11} className="ml-auto text-muted-foreground" />
            </div>
          ))}
        </div>

        {/* Right */}
        <div className={CARD + " overflow-hidden"}>
          <div className="border-b border-border bg-info-soft px-4 py-3">
            <div className="flex items-start gap-2 text-xs">
              <Icon name="info" size={14} className="mt-0.5 shrink-0" style={{ color:'var(--color-info)' }} />
              <span style={{ color:'oklch(0.385 0.062 222)' }}>
                Trường <strong>“Sửa trực tiếp”</strong> lưu ngay không cần duyệt. Trường <strong>“Cần HR duyệt”</strong> (tên, ngày sinh, giới tính, quốc tịch) phải gửi yêu cầu và chờ HR phê duyệt.
              </span>
            </div>
          </div>
          <div className="flex gap-1 border-b border-border px-5">
            {['Thông tin cá nhân','Liên lạc','Người phụ thuộc'].map((t,i)=>(
              <div key={t}
                onClick={()=>setTab(['personal','contact','dependents'][i])}
                className={"-mb-px cursor-pointer border-b-2 px-3.5 py-3 text-sm font-medium " + (tab===(['personal','contact','dependents'][i])?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground")}>{t}</div>
            ))}
          </div>
          <div className="p-[22px]">
            {tab==='personal' && (
              <div className="grid grid-cols-2 gap-x-7 gap-y-1.5">
                {ESS_PERSONAL.map((f,i)=>{
                  const tag = EDIT_TAG[f.edit];
                  return (
                    <div key={i} className="flex items-start justify-between gap-2 border-b border-border py-2.5">
                      <div className="min-w-0">
                        <div className="mb-[3px] text-xs text-muted-foreground">{f.label}</div>
                        <div className="text-sm font-medium">{f.val}</div>
                      </div>
                      <span className="inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-full px-[7px] py-[3px] text-2xs font-semibold" style={{ background:tag.bg, color:tag.color }}>
                        <Icon name={tag.icon} size={10} /> {tag.label}
                      </span>
                    </div>
                  );
                })}
              </div>
            )}
            {tab==='contact' && (
              <div>
                <div className="mb-3.5 text-base font-bold">Thông tin liên lạc</div>
                <div className="mb-5 grid grid-cols-2 gap-x-7 gap-y-1.5">
                  {ESS_CONTACT.map((f,i)=>{
                    const tag = EDIT_TAG[f.edit];
                    return (
                      <div key={i} className="flex items-start justify-between gap-2 border-b border-border py-2.5">
                        <div className="min-w-0">
                          <div className="mb-[3px] text-xs text-muted-foreground">{f.label}</div>
                          <div className="text-sm font-medium">{f.val}</div>
                        </div>
                        <span className="inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-full px-[7px] py-[3px] text-2xs font-semibold" style={{ background:tag.bg, color:tag.color }}>
                          <Icon name={tag.icon} size={10} /> {tag.label}
                        </span>
                      </div>
                    );
                  })}
                </div>
                <div className="mb-3 flex items-center justify-between">
                  <div className="text-base font-bold">Liên lạc khẩn cấp <span className="text-xs font-normal text-muted-foreground">· bạn tự quản lý · tối thiểu 1</span></div>
                  <Btn variant="soft" size="sm" icon="plus">Thêm liên hệ</Btn>
                </div>
                {ESS_EMERGENCY.map((c,i)=>(
                  <div key={i} className="mb-2 flex items-center gap-3 rounded-md border border-border p-3">
                    <Avatar name={c.name} />
                    <div className="flex-1">
                      <div className="text-sm font-semibold">{c.name}</div>
                      <div className="text-xs text-muted-foreground">{c.rel} · {c.phone}</div>
                    </div>
                    {c.primary && <Badge variant="primary">Chính</Badge>}
                    <div className="flex gap-1">
                      <Btn variant="ghost" size="sm" iconOnly icon="edit" />
                      <Btn variant="ghost" size="sm" iconOnly icon="trash" />
                    </div>
                  </div>
                ))}
                <div className="mt-2 flex items-start gap-2 rounded-md bg-success-soft px-3 py-2.5 text-xs leading-[1.5] text-success">
                  <Icon name="edit" size={13} className="mt-px shrink-0" />
                  <span>SĐT, email cá nhân và liên hệ khẩn cấp được <strong>lưu ngay</strong>. Riêng địa chỉ thường trú cần HR duyệt.</span>
                </div>
              </div>
            )}
            {tab==='dependents' && (
              <div>
                <div className="mb-3.5 flex items-center justify-between">
                  <div className="text-base font-bold">Người phụ thuộc của tôi <span className="text-xs font-normal text-muted-foreground">· 2 người · dùng cho giảm trừ thuế</span></div>
                  <Btn variant="soft" size="sm" icon="plus">Thêm người PT</Btn>
                </div>
                {ESS_DEPENDENTS.map((d,i)=>(
                  <div key={i} className="mb-2 flex items-start gap-3 rounded-md border border-border p-3.5">
                    <Avatar name={d.name} />
                    <div className="min-w-0 flex-1">
                      <div className="text-sm font-semibold">{d.name}</div>
                      <div className="mt-0.5 text-xs text-muted-foreground">{d.rel} · {d.gender} · Sinh: {d.dob} · CCCD ••••••{d.cccd4}</div>
                      <div className="mt-1.5 flex flex-wrap gap-1.5">
                        {d.tax && <Badge variant="info">Giảm trừ thuế</Badge>}
                      </div>
                    </div>
                    <div className="flex gap-1">
                      <Btn variant="ghost" size="sm" iconOnly icon="edit" />
                      <Btn variant="ghost" size="sm" iconOnly icon="trash" />
                    </div>
                  </div>
                ))}
                <div className="mt-2 flex items-start gap-2 rounded-md bg-success-soft px-3 py-2.5 text-xs leading-[1.5] text-success">
                  <Icon name="edit" size={13} className="mt-px shrink-0" />
                  <span>Thêm hoặc chỉnh sửa người phụ thuộc được <strong>lưu ngay</strong>, không cần HR duyệt.</span>
                </div>
              </div>
            )}
          </div>
        </div>
      </div>
    </HRMShell>
  );
};

// ─── 05: Termination Form ─────────────────────────────────────────────────────
const PIMTerminationScreen = () => {
  const e = PIM_EMPLOYEES[1]; // Trần Minh Tuấn
  const [rehire, setRehire] = React.useState('yes');
  const [exit, setExit] = React.useState('done');
  return (
    <HRMShell active="employees"
      title="Chấm dứt lao động"
      crumbs={['Nhân viên',e.name,'Chấm dứt HĐ']}
      actions={<>
        <Btn variant="outline" size="sm">Hủy</Btn>
        <Btn variant="destructive" size="sm">Xác nhận chấm dứt</Btn>
      </>}>

      <div className="grid grid-cols-[1fr_320px] gap-[18px]">
        <div className={CARD + " p-6"}>
          <div className="mb-[22px] flex gap-2.5 rounded-md bg-destructive-soft px-4 py-3.5" style={{ border:'1px solid oklch(0.601 0.215 12 / 0.3)' }}>
            <Icon name="alert-triangle" size={16} className="mt-0.5 shrink-0 text-destructive" />
            <div>
              <div className="mb-1 text-sm font-bold text-destructive">Trạng thái cuối — không thể hoàn tác</div>
              <div className="text-xs leading-[1.5] text-destructive opacity-85">
                Sau khi xác nhận: nhân viên chuyển sang <strong>Đã nghỉ việc</strong>, gỡ liên kết quản lý, dữ liệu lịch sử được bảo tồn, email công ty giải phóng sau 90 ngày. Tái tuyển dụng sẽ tạo hồ sơ mới.
              </div>
            </div>
          </div>

          <div className="mb-[22px] flex items-center gap-3.5 rounded-lg bg-muted p-3.5">
            <Avatar name={e.name} size="lg" />
            <div>
              <div className="text-md font-bold">{e.name}</div>
              <div className="mt-0.5 text-sm text-muted-foreground">{e.num} · {e.title} · {e.dept}</div>
              <div className="mt-0.5 text-xs text-muted-foreground">Ngày vào: {e.hire} · Thâm niên: 2 năm 1 tháng</div>
            </div>
          </div>

          <div className="mb-3.5 grid grid-cols-2 gap-3.5">
            <div>
              <label className="mb-[5px] block text-xs font-medium">Ngày chấm dứt *</label>
              <input className="h-9 w-full rounded-md border border-input bg-transparent px-3 text-base text-foreground shadow-xs transition-colors focus:border-primary focus:outline-none focus:ring-[3px] focus:ring-ring" type="date" defaultValue="2026-05-31" />
              <div className="mt-1 text-xs text-muted-foreground">Phải ≥ ngày vào làm và ≤ hôm nay</div>
            </div>
            <div>
              <label className="mb-[5px] block text-xs font-medium">Lý do chấm dứt *</label>
              <Select placeholder="— Chọn lý do —" options={['Tự nguyện nghỉ việc','Chấm dứt hợp đồng (công ty)','Về hưu','Hết hạn hợp đồng','Qua đời','Không hoàn thành thử việc','Hoàn thành thực tập','Chuyển đơn vị','Khác']} />
            </div>
          </div>

          <div className="mb-3.5">
            <label className="mb-[5px] block text-xs font-medium">Ghi chú chấm dứt</label>
            <textarea className="w-full rounded-md border border-input bg-transparent px-3 text-base text-foreground shadow-xs placeholder:text-muted-foreground transition-colors focus:border-primary focus:outline-none focus:ring-[3px] focus:ring-ring" style={{ height:80, resize:'none', paddingTop:8 }}
              placeholder="Ghi chú thêm về lý do và điều kiện chấm dứt (tối đa 2000 ký tự)..." />
          </div>

          <div className="mb-3.5 grid grid-cols-2 gap-3.5">
            <div>
              <label className="mb-[5px] block text-xs font-medium">Phỏng vấn thôi việc</label>
              <div className="mt-1 flex gap-3">
                <label className="flex cursor-pointer items-center gap-1.5 text-sm">
                  <input type="radio" name="exit" checked={exit==='done'} onChange={()=>setExit('done')} /> Đã thực hiện
                </label>
                <label className="flex cursor-pointer items-center gap-1.5 text-sm">
                  <input type="radio" name="exit" checked={exit==='no'} onChange={()=>setExit('no')} /> Chưa
                </label>
              </div>
            </div>
            {exit==='done' && (
              <div>
                <label className="mb-[5px] block text-xs font-medium">Ngày phỏng vấn thôi việc *</label>
                <input className="h-9 w-full rounded-md border border-input bg-transparent px-3 text-base text-foreground shadow-xs transition-colors focus:border-primary focus:outline-none focus:ring-[3px] focus:ring-ring" type="date" defaultValue="2026-05-28" />
              </div>
            )}
          </div>

          <div className={rehire==='no'?"mb-3.5":""}>
            <label className="mb-[5px] block text-xs font-medium">Đủ điều kiện tái tuyển dụng</label>
            <div className="mt-1 flex gap-3">
              <label className="flex cursor-pointer items-center gap-1.5 text-sm">
                <input type="radio" name="rehire" checked={rehire==='yes'} onChange={()=>setRehire('yes')} /> Có
              </label>
              <label className="flex cursor-pointer items-center gap-1.5 text-sm">
                <input type="radio" name="rehire" checked={rehire==='no'} onChange={()=>setRehire('no')} /> Không
              </label>
            </div>
          </div>
          {rehire==='no' && (
            <div>
              <label className="mb-[5px] block text-xs font-medium">Lý do không đủ điều kiện tái tuyển * <span className="font-normal text-muted-foreground">(bắt buộc khi chọn “Không”, tối đa 500 ký tự)</span></label>
              <textarea className="w-full rounded-md border border-destructive bg-transparent px-3 text-base text-foreground shadow-xs placeholder:text-muted-foreground transition-colors focus:outline-none focus:ring-[3px] focus:ring-ring" style={{ height:64, resize:'none', paddingTop:8 }}
                placeholder="Mô tả lý do — hiển thị trong bảng quản trị khi xét tái tuyển..." />
            </div>
          )}
        </div>

        {/* Right: Pre-checks + Checklist */}
        <div className="flex flex-col gap-3">
          <div className={CARD + " p-[18px]"}>
            <div className="mb-3 text-sm font-bold">Điều kiện hệ thống kiểm tra</div>
            {[
              { label:'Không còn cấp dưới đang làm việc', ok:true  },
              { label:'Không còn nghỉ phép chờ duyệt', ok:false },
              { label:'Ngày ≤ hôm nay & ≥ ngày vào làm', ok:true  },
            ].map((c,i)=>(
              <div key={i} className={"flex items-start gap-[9px] py-2 " + (i<2?"border-b border-border":"")}>
                <Icon name={c.ok?'check-circle':'alert-circle'} size={15} className="mt-px shrink-0" style={{ color:c.ok?'var(--color-success)':'var(--color-destructive)' }} />
                <div className="flex-1">
                  <div className={"text-sm " + (c.ok?"text-foreground":"text-destructive")}>{c.label}</div>
                </div>
              </div>
            ))}
          </div>
          <div className={CARD + " bg-warning-soft p-4"} style={{ border:'1px solid oklch(0.835 0.158 80 / 0.3)' }}>
            <div className="mb-1.5 text-xs font-bold" style={{ color:'oklch(0.45 0.1 65)' }}>Cần xử lý trước</div>
            <div className="text-xs leading-[1.55]" style={{ color:'oklch(0.45 0.1 65)' }}>
              Nhân viên có <strong>3 yêu cầu nghỉ phép đang chờ</strong>. Vui lòng giải quyết trước khi chấm dứt.
            </div>
            <Btn variant="outline" size="xs" className="mt-2.5" style={{ borderColor:'oklch(0.6 0.1 65)', color:'oklch(0.45 0.1 65)' }}>Xem yêu cầu nghỉ phép</Btn>
          </div>
        </div>
      </div>
    </HRMShell>
  );
};

// ─── 08: Empty State ──────────────────────────────────────────────────────────
const PIMEmptyScreen = () => (
  <HRMShell active="employees" title="Danh sách nhân viên" crumbs={['Nhân viên']}
    actions={<Btn variant="primary" size="sm" icon="plus">Thêm nhân viên đầu tiên</Btn>}>
    <div className={CARD + " flex min-h-[460px] flex-col items-center justify-center p-12"}>
      <svg width="80" height="80" viewBox="0 0 80 80" fill="none" className="mb-6">
        <circle cx="40" cy="40" r="40" fill="var(--color-muted)" />
        <circle cx="40" cy="28" r="14" fill="none" stroke="var(--color-border-strong)" strokeWidth="2.5" />
        <path d="M16 72c0-13.25 10.75-24 24-24s24 10.75 24 24" stroke="var(--color-border-strong)" strokeWidth="2.5" fill="none" strokeLinecap="round" />
        <circle cx="59" cy="57" r="12" fill="var(--color-primary-soft)" stroke="var(--color-primary)" strokeWidth="2" />
        <path d="M55 57h8M59 53v8" stroke="var(--color-primary)" strokeWidth="2" strokeLinecap="round" />
      </svg>
      <div className="mb-2.5 text-xl font-bold">Chưa có nhân viên nào</div>
      <div className="mb-7 max-w-[440px] text-center text-base leading-[1.65] text-muted-foreground">
        Thêm nhân viên đầu tiên để bắt đầu quản lý nhân sự. Bạn có thể thêm thủ công hoặc nhập hàng loạt từ file Excel/CSV.
      </div>
      <div className="flex gap-2.5">
        <Btn variant="outline" icon="upload">Nhập từ Excel</Btn>
        <Btn variant="primary"  icon="plus">Thêm nhân viên đầu tiên</Btn>
      </div>
    </div>
  </HRMShell>
);

// ─── 09: Dark Mode ────────────────────────────────────────────────────────────
const PIMDarkScreen = () => <PIMListScreen dark />;

Object.assign(window, {
  PIM_EMPLOYEES, EMP_STATUS_CFG, EMP_TYPE_CFG, DOC_TYPE_CFG, PiiField, PIMOverlay,
  PIMListScreen, PIMDetailScreen, PIMCreateScreen,
  PIMESSScreen, PIMTerminationScreen, PIMEmptyScreen, PIMDarkScreen,
});
