// «Журнал действий» — audit log (кто/когда/на основании чего). Требование 2.

// Human-readable labels for the action codes the backend emits.
const AUDIT_ACTIONS = {
  "auth.login":            { label: "Вход в систему",            cls: "muted",    cat: "auth" },
  "task.create":           { label: "Создание поручения",        cls: "accepted", cat: "tasks" },
  "task.update":           { label: "Изменение поручения",       cls: "tg",       cat: "tasks" },
  "task.reschedule":       { label: "Перенос срока",             cls: "warn",     cat: "tasks" },
  "task.urgent":           { label: "Срочность",                 cls: "err",      cat: "tasks" },
  "task.overtime.consent": { label: "Согласие на сверхурочную",  cls: "tg",       cat: "tasks" },
  "task.delete":           { label: "Удаление поручения",        cls: "err",      cat: "tasks" },
  "person.add":            { label: "Добавление сотрудника",     cls: "accepted", cat: "people" },
  "person.dismiss":        { label: "Увольнение сотрудника",     cls: "err",      cat: "people" },
  "person.restore":        { label: "Восстановление сотрудника", cls: "ok",       cat: "people" },
  "user.create":           { label: "Создание пользователя",     cls: "accepted", cat: "access" },
  "user.update":           { label: "Изменение пользователя",    cls: "tg",       cat: "access" },
  "user.delete":           { label: "Удаление пользователя",     cls: "err",      cat: "access" },
  "access.update":         { label: "Изменение доступа",         cls: "warn",     cat: "access" },
  "settings.update":       { label: "Изменение настроек",        cls: "muted",    cat: "settings" },
  "fine.prepare":          { label: "Подготовка взыскания",      cls: "warn",     cat: "fines" },
  "fine.request":          { label: "Запрос объяснений",         cls: "tg",       cat: "fines" },
  "fine.approve":          { label: "Утверждение взыскания",     cls: "err",      cat: "fines" },
  "fine.remove":           { label: "Снятие взыскания",          cls: "ok",       cat: "fines" },
};

const AUDIT_FILTERS = [
  { key: "all", label: "Все" },
  { key: "tasks", label: "Поручения" },
  { key: "people", label: "Сотрудники" },
  { key: "access", label: "Доступ" },
  { key: "fines", label: "Взыскания" },
  { key: "settings", label: "Настройки" },
];

function auditActionMeta(code) {
  return AUDIT_ACTIONS[code] || { label: code, cls: "muted", cat: "other" };
}

const AUDIT_ROLE_LABEL = { admin: "Администратор", controller: "Отдел контроля", executor: "Исполнитель" };

// Compact, readable rendering of the entity an action touched.
function auditEntityLabel(e) {
  if (!e.entityType) return "";
  if (e.entityType === "task") return "Поручение #" + e.entityId;
  if (e.entityType === "user") return "Пользователь #" + e.entityId;
  if (e.entityType === "person") return e.entityId || "Сотрудник";
  if (e.entityType === "fine") return "Взыскание #" + e.entityId;
  if (e.entityType === "settings") return "Настройки";
  if (e.entityType === "access") return "Матрица доступа";
  return e.entityType + (e.entityId ? " #" + e.entityId : "");
}

function AuditPage() {
  const [rows, setRows] = React.useState(null);
  const [cat, setCat] = React.useState("all");
  const [q, setQ] = React.useState("");

  const load = React.useCallback(() => {
    if (!window.API || !window.API.listAudit) { setRows([]); return; }
    window.API.listAudit({ limit: 500 }).then(r => setRows(Array.isArray(r) ? r : [])).catch(() => setRows([]));
  }, []);
  React.useEffect(() => { load(); }, [load]);

  const ql = q.trim().toLowerCase();
  const filtered = (rows || []).filter(e => {
    const meta = auditActionMeta(e.action);
    if (cat !== "all" && meta.cat !== cat) return false;
    if (!ql) return true;
    return (e.actor + " " + meta.label + " " + auditEntityLabel(e) + " " + (e.basis || "")).toLowerCase().includes(ql);
  });

  return (
    <div className="page page-fade">
      <div className="page-head">
        <div>
          <h1 className="page-title">Журнал действий</h1>
          <p className="page-subtitle">
            Кто, когда и на каком основании — для контроля и возможного обжалования (п.14.6)
            {rows ? ` · ${filtered.length} записей` : " · загрузка…"}
          </p>
        </div>
        <button className="btn btn-outline" onClick={load}><I.Refresh size={14} /> Обновить</button>
      </div>

      <div className="filter-row" style={{ marginBottom: 12 }}>
        {AUDIT_FILTERS.map(f => (
          <button key={f.key} className={`field ${cat === f.key ? "active" : ""}`} onClick={() => setCat(f.key)}>{f.label}</button>
        ))}
        <div className="search" style={{ marginLeft: "auto", maxWidth: 260 }}>
          <I.Search size={14} />
          <input placeholder="Поиск по журналу…" value={q} onChange={e => setQ(e.target.value)} />
        </div>
      </div>

      <Card bodyStyle={{ padding: 0 }}>
        <div className="audit-row audit-head">
          <div>Время</div>
          <div>Кто</div>
          <div>Действие</div>
          <div>Объект и основание</div>
        </div>
        {rows === null && <PageLoading label="Загружаем журнал…" />}
        {rows !== null && filtered.length === 0 && (
          <div style={{ padding: 18, color: "var(--ink-400)", fontSize: 13 }}>Записей по фильтру нет.</div>
        )}
        {filtered.map(e => {
          const meta = auditActionMeta(e.action);
          return (
            <div key={e.id} className="audit-row">
              <div style={{ color: "var(--ink-500)", fontVariantNumeric: "tabular-nums", whiteSpace: "nowrap" }}>{e.ts}</div>
              <div style={{ minWidth: 0 }}>
                <div style={{ fontWeight: 500, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{e.actor || "—"}</div>
                {e.actorRole && <div style={{ fontSize: 11, color: "var(--ink-400)" }}>{AUDIT_ROLE_LABEL[e.actorRole] || e.actorRole}</div>}
              </div>
              <div><span className={`pill ${meta.cls}`}>{meta.label}</span></div>
              <div style={{ minWidth: 0 }}>
                <div style={{ fontSize: 12.5, color: "var(--ink-700)" }}>{auditEntityLabel(e)}</div>
                {e.basis && <div style={{ fontSize: 12, color: "var(--ink-500)", marginTop: 2 }}>Основание: {e.basis}</div>}
                {e.details && e.details !== "null" && (
                  <div style={{ fontSize: 11.5, color: "var(--ink-400)", marginTop: 2, fontFamily: "var(--mono, monospace)", wordBreak: "break-word" }}>{e.details}</div>
                )}
              </div>
            </div>
          );
        })}
      </Card>
    </div>
  );
}

window.AuditPage = AuditPage;
