// TTG Petty Cash — Screens
const {
  React, useState, useEffect, useMemo, useRef, useCallback,
  fmtMoney, fmtDate, fmtDateTime, todayISO, addDays, sumItems, sumActual,
  DEPARTMENTS, USERS, ROLE_META, STATUS_META, statusBadge, Icon,
  LineItemsRequest, LineItemsClearing, Receipts, ApprovalTimeline, Empty,
} = window;

// ============== DASHBOARD ==============
function Dashboard({ records, user, onNavigate, onOpen }) {
  const role = user.role;

  // Per-role stats
  let stats = [];
  const myReqs = records.filter(r => r.requester.id === user.id);
  const pending = records.filter(r => r.status.startsWith('pending'));
  const totalThisMonth = records.filter(r => new Date(r.submittedAt).getMonth() === 4).reduce((a,r)=> a + sumItems(r.items), 0);

  if (role === 'staff') {
    stats = [
      { label: 'คำขอของฉัน', value: myReqs.length, sub: 'รายการ', icon: 'fileText', color: 'navy', delta: '+2 เดือนนี้' },
      { label: 'รออนุมัติ', value: myReqs.filter(r=>r.status.startsWith('pending')).length, sub: 'รายการ', icon: 'clock', color: 'warn', delta: '' },
      { label: 'รอเคลียร์', value: myReqs.filter(r=>r.status === 'clearing' || r.status === 'paid').length, sub: 'รายการ', icon: 'wallet', color: 'orange', delta: 'ใกล้ครบกำหนด 1' },
      { label: 'ยอดที่ต้องเคลียร์', value: '43,500', sub: 'บาท', icon: 'money', color: 'gold', delta: '' },
    ];
  } else if (role === 'manager' || role === 'director') {
    stats = [
      { label: 'รออนุมัติ', value: pending.length, sub: 'รายการ', icon: 'inbox', color: 'orange', delta: 'ต้องดำเนินการวันนี้' },
      { label: 'อนุมัติเดือนนี้', value: 18, sub: 'รายการ', icon: 'checkCircle', color: 'ok', delta: '+12% MoM' },
      { label: 'ยอดอนุมัติเดือนนี้', value: '847,200', sub: 'บาท', icon: 'money', color: 'navy', delta: '' },
      { label: 'อายุเฉลี่ยรออนุมัติ', value: '1.4', sub: 'วัน', icon: 'clock', color: 'gold', delta: 'ภายในเป้า 2 วัน' },
    ];
  } else if (role === 'finance') {
    stats = [
      { label: 'รอจ่ายเงิน', value: records.filter(r=>r.status==='pending_fin').length, sub: 'รายการ', icon: 'send', color: 'orange', delta: '' },
      { label: 'รอเคลียร์/ตรวจสอบ', value: records.filter(r=>r.status==='clearing').length, sub: 'รายการ', icon: 'fileCheck', color: 'navy', delta: '' },
      { label: 'จ่ายไปเดือนนี้', value: '1,247,500', sub: 'บาท', icon: 'wallet', color: 'gold', delta: '+8% MoM' },
      { label: 'เกินกำหนดเคลียร์', value: 2, sub: 'รายการ', icon: 'alert', color: 'err', delta: 'ต้องติดตาม' },
    ];
  }

  return (
    <div>
      <div className="content__head">
        <div style={{flex: 1}}>
          <h1>สวัสดี, {user.name.split(' ')[0]} 👋</h1>
          <p>ภาพรวมระบบเบิกและเคลียร์เงินทดรองจ่าย ประจำเดือนพฤษภาคม 2569</p>
        </div>
        <div className="content__head__actions">
          {role === 'staff' && (
            <button className="btn btn--primary" onClick={() => onNavigate('new-request')}>
              <Icon name="plus" size={15}/> สร้างคำขอเบิก
            </button>
          )}
          <button className="btn btn--ghost"><Icon name="download" size={15}/> ส่งออก</button>
        </div>
      </div>

      {/* Stats */}
      <div className="stat-grid">
        {stats.map((s, i) => (
          <div className="stat" key={i}>
            <div className="stat__bar" style={{background: ({
              navy: 'var(--navy)',
              orange: 'var(--orange)',
              gold: 'var(--gold)',
              ok: 'var(--ok)',
              warn: 'var(--warn)',
              err: 'var(--err)',
            })[s.color]}}/>
            <div className="stat__label">
              <div className="stat__icon" style={{
                background: ({navy:'var(--info-soft)',orange:'var(--orange-soft)',gold:'var(--gold-soft)',ok:'var(--ok-soft)',warn:'var(--warn-soft)',err:'var(--err-soft)'})[s.color],
                color: ({navy:'var(--navy)',orange:'var(--orange)',gold:'#806A2B',ok:'var(--ok)',warn:'var(--warn)',err:'var(--err)'})[s.color]
              }}>
                <Icon name={s.icon} size={16}/>
              </div>
              <span>{s.label}</span>
            </div>
            <div className="stat__value">{s.value}<small>{s.sub}</small></div>
            {s.delta && <div className="stat__delta flat">{s.delta}</div>}
          </div>
        ))}
      </div>

      <div className="split">
        {/* Recent activity */}
        <div className="card">
          <div className="card__head">
            <h3>กิจกรรมล่าสุด</h3>
            <div className="card__head__actions">
              <button className="btn btn--ghost btn--sm" onClick={() => onNavigate(role === 'staff' ? 'my-requests' : 'approvals')}>
                ดูทั้งหมด <Icon name="arrowRight" size={13}/>
              </button>
            </div>
          </div>
          <div className="table-wrap">
            <table className="table">
              <thead>
                <tr>
                  <th>เลขที่</th>
                  <th>เหตุผลการเบิก</th>
                  <th>ผู้ขอเบิก</th>
                  <th style={{textAlign: 'right'}}>ยอดเงิน</th>
                  <th>สถานะ</th>
                  <th></th>
                </tr>
              </thead>
              <tbody>
                {records.slice(0, 5).map(r => (
                  <tr key={r.id} onClick={() => onOpen(r)}>
                    <td className="table__id">{r.id}</td>
                    <td style={{maxWidth: 320}}>
                      <div style={{display: '-webkit-box', WebkitLineClamp: 1, WebkitBoxOrient: 'vertical', overflow: 'hidden'}}>
                        {r.purpose}
                      </div>
                      <div style={{fontSize: 11.5, color: 'var(--text-muted)'}}>ส่งเมื่อ {fmtDate(r.submittedAt)}</div>
                    </td>
                    <td>
                      <div style={{display: 'flex', alignItems: 'center', gap: 8}}>
                        <div className="avatar sm" style={{background: 'var(--info-soft)', color: 'var(--navy)'}}>{r.requester.initials}</div>
                        <div style={{fontSize: 12.5}}>{r.requester.name.split(' ')[0]}</div>
                      </div>
                    </td>
                    <td className="table__money">{fmtMoney(sumItems(r.items))}</td>
                    <td>{statusBadge(r.status)}</td>
                    <td><Icon name="chevRight" size={16} className="muted"/></td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>

        {/* Side panel */}
        <div className="col">
          {role === 'staff' && (
            <div className="card">
              <div className="card__head"><h3>เคล็ดลับ</h3></div>
              <div className="card__body">
                <div style={{display: 'flex', flexDirection: 'column', gap: 12, fontSize: 13}}>
                  <div style={{display: 'flex', gap: 10}}>
                    <div style={{flexShrink: 0, width: 26, height: 26, borderRadius: 6, background: 'var(--orange-soft)', color: 'var(--orange)', display: 'grid', placeItems: 'center'}}><Icon name="info" size={14}/></div>
                    <div>ยื่นคำขอเบิกล่วงหน้าอย่างน้อย <b>3 วันทำการ</b> ก่อนวันที่ต้องการใช้เงิน</div>
                  </div>
                  <div style={{display: 'flex', gap: 10}}>
                    <div style={{flexShrink: 0, width: 26, height: 26, borderRadius: 6, background: 'var(--info-soft)', color: 'var(--navy)', display: 'grid', placeItems: 'center'}}><Icon name="receipt" size={14}/></div>
                    <div>เก็บใบเสร็จต้นฉบับและสแกนแนบในใบเคลียร์ภายใน <b>14 วัน</b></div>
                  </div>
                  <div style={{display: 'flex', gap: 10}}>
                    <div style={{flexShrink: 0, width: 26, height: 26, borderRadius: 6, background: 'var(--gold-soft)', color: '#806A2B', display: 'grid', placeItems: 'center'}}><Icon name="wallet" size={14}/></div>
                    <div>เงินทดรองคงเหลือต้องส่งคืนแคชเชียร์ ภายในวันครบกำหนด</div>
                  </div>
                </div>
              </div>
            </div>
          )}
          <div className="card">
            <div className="card__head"><h3>สถานะคำขอประจำเดือน</h3></div>
            <div className="card__body" style={{padding: 18}}>
              <BreakdownChart records={records}/>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

function BreakdownChart({ records }) {
  const buckets = useMemo(() => {
    const b = { approved: 0, pending: 0, paid: 0, clearing: 0, cleared: 0, rejected: 0 };
    records.forEach(r => {
      if (r.status.startsWith('pending')) b.pending++;
      else b[r.status] = (b[r.status]||0) + 1;
    });
    return b;
  }, [records]);
  const items = [
    { k: 'รออนุมัติ', v: buckets.pending, c: 'var(--warn)' },
    { k: 'อนุมัติแล้ว', v: buckets.approved, c: 'var(--ok)' },
    { k: 'จ่ายเงินแล้ว', v: buckets.paid, c: '#B89A52' },
    { k: 'รอเคลียร์', v: buckets.clearing, c: 'var(--navy-2)' },
    { k: 'เคลียร์สำเร็จ', v: buckets.cleared, c: '#7466B5' },
    { k: 'ถูกปฏิเสธ', v: buckets.rejected, c: 'var(--err)' },
  ];
  const max = Math.max(1, ...items.map(i => i.v));
  return (
    <div style={{display: 'flex', flexDirection: 'column', gap: 10}}>
      {items.map(it => (
        <div key={it.k}>
          <div style={{display: 'flex', justifyContent: 'space-between', fontSize: 12, marginBottom: 4}}>
            <span style={{color: 'var(--text-muted)'}}>{it.k}</span>
            <span style={{fontWeight: 600, fontVariantNumeric: 'tabular-nums'}}>{it.v}</span>
          </div>
          <div style={{height: 6, background: 'var(--silver-10)', borderRadius: 999, overflow: 'hidden'}}>
            <div style={{height: '100%', width: `${(it.v/max)*100}%`, background: it.c, borderRadius: 999, transition: 'width 600ms ease'}}/>
          </div>
        </div>
      ))}
    </div>
  );
}

// ============== MY REQUESTS LIST ==============
function RequestList({ records, user, onOpen, onNavigate, view, filter, setFilter, onAction }) {
  // view = 'my' | 'all' | 'approvals' | 'disburse' | 'reconcile' | 'clearing'
  let filtered = records;
  if (view === 'my') filtered = records.filter(r => r.requester.id === user.id);
  else if (view === 'approvals') {
    if (user.role === 'manager') filtered = records.filter(r => r.status === 'pending_mgr');
    else if (user.role === 'director') filtered = records.filter(r => r.status === 'pending_dir');
  } else if (view === 'disburse') filtered = records.filter(r => r.status === 'pending_fin' || r.status === 'approved');
  else if (view === 'reconcile') filtered = records.filter(r => r.status === 'clearing');
  else if (view === 'clearing') filtered = records.filter(r => (r.requester.id === user.id) && (r.status === 'paid' || r.status === 'clearing'));

  if (filter.status && filter.status !== 'all') filtered = filtered.filter(r => r.status === filter.status);
  if (filter.search) {
    const q = filter.search.toLowerCase();
    filtered = filtered.filter(r => r.id.toLowerCase().includes(q) || r.purpose.toLowerCase().includes(q) || r.requester.name.toLowerCase().includes(q));
  }

  const titleMap = {
    my: { h1: 'คำขอของฉัน', sub: 'รายการเบิกและเคลียร์เงินทดรองจ่ายของคุณ' },
    all: { h1: 'รายการทั้งหมด', sub: 'ทุกคำขอเบิกและเคลียร์ในระบบ' },
    approvals: { h1: 'งานรออนุมัติ', sub: `รออนุมัติโดย ${ROLE_META[user.role]?.label}` },
    disburse: { h1: 'รอจ่ายเงิน', sub: 'คำขอที่ผ่านอนุมัติแล้ว รอดำเนินการจ่ายเงิน' },
    reconcile: { h1: 'รอตรวจเคลียร์', sub: 'ใบเคลียร์ที่ส่งเข้ามารอตรวจสอบและปิดงวด' },
    clearing: { h1: 'รอเคลียร์', sub: 'คำขอที่จ่ายเงินแล้วและรอส่งใบเคลียร์' },
  };
  const t = titleMap[view] || titleMap.my;

  const statusOptions = [
    { v: 'all', l: 'ทุกสถานะ' },
    { v: 'draft', l: 'ฉบับร่าง' },
    { v: 'pending_mgr', l: 'รออนุมัติฝ่าย' },
    { v: 'pending_dir', l: 'รออนุมัติ ผอ.' },
    { v: 'pending_fin', l: 'รอการเงิน' },
    { v: 'paid', l: 'จ่ายแล้ว' },
    { v: 'clearing', l: 'รอเคลียร์' },
    { v: 'cleared', l: 'เคลียร์สำเร็จ' },
    { v: 'rejected', l: 'ถูกปฏิเสธ' },
  ];

  // tabs for approvals
  return (
    <div>
      <div className="content__head">
        <div>
          <h1>{t.h1}</h1>
          <p>{t.sub}</p>
        </div>
        <div className="content__head__actions">
          {view === 'my' && (
            <button className="btn btn--primary" onClick={() => onNavigate('new-request')}>
              <Icon name="plus" size={15}/> สร้างคำขอเบิก
            </button>
          )}
          <button className="btn btn--ghost"><Icon name="download" size={15}/> ส่งออก Excel</button>
        </div>
      </div>

      {/* Filters */}
      <div className="filterbar">
        <div className="filter-chip">
          <Icon name="filter" size={13}/>
          <select value={filter.status||'all'} onChange={e => setFilter({...filter, status: e.target.value})}>
            {statusOptions.map(o => <option key={o.v} value={o.v}>{o.l}</option>)}
          </select>
        </div>
        <div className="filter-chip">
          <Icon name="calendar" size={13}/>
          <select defaultValue="m1">
            <option value="m1">เดือนนี้</option>
            <option value="m3">3 เดือนล่าสุด</option>
            <option value="m12">12 เดือนล่าสุด</option>
            <option value="all">ทั้งหมด</option>
          </select>
        </div>
        <div className="filter-chip">
          <Icon name="users" size={13}/>
          <select defaultValue="all">
            <option value="all">ทุกฝ่าย</option>
            {DEPARTMENTS.map(d => <option key={d.code}>{d.name}</option>)}
          </select>
        </div>
        <div style={{flex: 1}}/>
        <span style={{fontSize: 12.5, color: 'var(--text-muted)'}}>พบ <b style={{color: 'var(--text)'}}>{filtered.length}</b> รายการ</span>
      </div>

      {/* Approval queue uses card layout, others use table */}
      {view === 'approvals' && user.role !== 'finance' ? (
        <div style={{display: 'flex', flexDirection: 'column', gap: 12}}>
          {filtered.length === 0 ? (
            <div className="card"><Empty icon="inbox" title="ไม่มีงานรออนุมัติ" desc="ทุกคำขอได้รับการดำเนินการแล้ว"/></div>
          ) : filtered.map(r => (
            <ApprovalCard key={r.id} record={r} user={user} onOpen={onOpen} onAction={onAction}/>
          ))}
        </div>
      ) : (
        <div className="card">
          <div className="table-wrap">
            <table className="table">
              <thead>
                <tr>
                  <th>เลขที่</th>
                  <th>เหตุผลการเบิก</th>
                  <th>ผู้ขอเบิก/ฝ่าย</th>
                  <th>วันที่</th>
                  <th style={{textAlign: 'right'}}>ยอดเงิน</th>
                  <th>สถานะ</th>
                  <th>กำหนดคืน</th>
                  <th></th>
                </tr>
              </thead>
              <tbody>
                {filtered.length === 0 ? (
                  <tr><td colSpan={8}><Empty icon="fileText" title="ไม่พบรายการ" desc="ลองปรับตัวกรองหรือคำค้นหา"/></td></tr>
                ) : filtered.map(r => (
                  <tr key={r.id} onClick={() => onOpen(r)}>
                    <td className="table__id">{r.id}</td>
                    <td style={{maxWidth: 360}}>
                      <div style={{display: '-webkit-box', WebkitLineClamp: 1, WebkitBoxOrient: 'vertical', overflow: 'hidden', fontWeight: 500}}>{r.purpose}</div>
                      <div style={{fontSize: 11.5, color: 'var(--text-muted)'}}>{r.items.length} รายการ</div>
                    </td>
                    <td>
                      <div style={{display: 'flex', alignItems: 'center', gap: 8}}>
                        <div className="avatar sm">{r.requester.initials}</div>
                        <div>
                          <div style={{fontSize: 12.5, fontWeight: 500}}>{r.requester.name}</div>
                          <div style={{fontSize: 11, color: 'var(--text-muted)'}}>{DEPARTMENTS.find(d=>d.code===r.dept)?.name}</div>
                        </div>
                      </div>
                    </td>
                    <td>
                      <div style={{fontSize: 12.5}}>{fmtDate(r.submittedAt)}</div>
                      <div style={{fontSize: 11, color: 'var(--text-muted)'}}>ใช้ {fmtDate(r.startDate)}</div>
                    </td>
                    <td className="table__money">{fmtMoney(sumItems(r.items))}</td>
                    <td>{statusBadge(r.status)}</td>
                    <td>
                      <DueBadge dueDate={r.dueDate} status={r.status}/>
                    </td>
                    <td><Icon name="chevRight" size={16}/></td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>
      )}
    </div>
  );
}

function DueBadge({ dueDate, status }) {
  if (['cleared', 'rejected'].includes(status)) {
    return <span style={{fontSize: 12, color: 'var(--text-muted)'}}>{fmtDate(dueDate)}</span>;
  }
  const days = Math.ceil((new Date(dueDate) - new Date()) / (1000*60*60*24));
  if (days < 0) return <span style={{fontSize: 12, color: 'var(--err)', fontWeight: 500}}>เกินกำหนด {Math.abs(days)} วัน</span>;
  if (days <= 3) return <span style={{fontSize: 12, color: 'var(--orange)', fontWeight: 500}}>อีก {days} วัน</span>;
  return <span style={{fontSize: 12, color: 'var(--text-muted)'}}>{fmtDate(dueDate)}</span>;
}

function ApprovalCard({ record, user, onOpen, onAction }) {
  return (
    <div className="approval-card" onClick={() => onOpen(record)}>
      <div>
        <div className="approval-card__h">
          <span className="approval-card__id">{record.id}</span>
          {statusBadge(record.status)}
          <DueBadge dueDate={record.dueDate} status={record.status}/>
        </div>
        <div className="approval-card__title">{record.purpose}</div>
        <div className="approval-card__meta">
          <span style={{display: 'flex', alignItems: 'center', gap: 6}}>
            <div className="avatar sm">{record.requester.initials}</div>
            {record.requester.name} · {DEPARTMENTS.find(d=>d.code===record.dept)?.name}
          </span>
          <span style={{display: 'flex', alignItems: 'center', gap: 4}}><Icon name="calendar" size={12}/> ใช้ {fmtDate(record.startDate)}</span>
          <span style={{display: 'flex', alignItems: 'center', gap: 4}}><Icon name="fileText" size={12}/> {record.items.length} รายการ</span>
        </div>
      </div>
      <div className="approval-card__money">
        <small>ยอดที่ขอเบิก</small>
        ฿{fmtMoney(sumItems(record.items))}
      </div>
      <div className="approval-card__actions" onClick={e => e.stopPropagation()}>
        <button className="btn btn--ghost btn--sm" onClick={() => onOpen(record)}><Icon name="eye" size={14}/> ดูรายละเอียด</button>
        <div style={{flex: 1}}/>
        <button className="btn btn--danger btn--sm" onClick={() => onAction(record, 'reject')}><Icon name="x" size={14}/> ปฏิเสธ</button>
        <button className="btn btn--success btn--sm" onClick={() => onAction(record, 'approve')}><Icon name="check" size={14}/> อนุมัติ</button>
      </div>
    </div>
  );
}

Object.assign(window, { Dashboard, RequestList, ApprovalCard, DueBadge, BreakdownChart });
