import React, { memo, useMemo, useState } from "react";

function EventsTab({ accountEvents, formatTimestamp, onClearEvents, accountById, formatAccountLabel }) {
  const [typeFilter, setTypeFilter] = useState("all");
  const [query, setQuery] = useState("");
  const [expandedEventId, setExpandedEventId] = useState(null);

  const buildEventSummary = (event) => {
    const firstLine = event.message ? String(event.message).split("\n")[0] : "";
    const extractUserLabel = (line) => {
      if (!line) return "";
      const idMatch = line.match(/^\s*(\d+)\s*->/);
      const usernameMatch = line.match(/@([a-zA-Z0-9_]+)/);
      const id = idMatch ? idMatch[1] : "";
      const username = usernameMatch ? `@${usernameMatch[1]}` : "";
      if (username && id) return `Пользователь: ${username} (ID: ${id})`;
      if (username) return `Пользователь: ${username}`;
      if (id) return `Пользователь: ${id}`;
      const userMatch = line.match(/Пользователь:\s*([^\s]+)/i);
      return userMatch ? `Пользователь: ${userMatch[1]}` : "";
    };
    const formatLineWithUsername = (line) => {
      if (!line) return "";
      const idMatch = line.match(/^\s*(\d+)\s*->/);
      if (!idMatch) return line;
      const usernameMatch = line.match(/@([a-zA-Z0-9_]+)/);
      if (!usernameMatch) return line;
      const id = idMatch[1];
      const username = `@${usernameMatch[1]}`;
      return line.replace(id, `${id} (${username})`);
    };
    const userLabel = extractUserLabel(firstLine);
    switch (event.eventType) {
      case "task_start":
        return "Задача запущена.";
      case "task_stop":
        return "Задача остановлена.";
      case "monitor_started":
        return `Мониторинг запущен.${firstLine ? ` ${firstLine}` : ""}`;
      case "monitor_polling_started":
        return `Мониторинг: старт опроса.${firstLine ? ` ${firstLine}` : ""}`;
      case "new_message":
        return `Новый пользователь добавлен в очередь.${firstLine ? ` ${firstLine}` : ""}`;
      case "new_message_duplicate":
        return firstLine
          ? `Пользователь уже был обработан: ${firstLine}`
          : "Пользователь уже был обработан (повтор не выполнялся).";
      case "invite_attempt":
        return `Попытка отправить инвайт.${firstLine ? ` ${formatLineWithUsername(firstLine)}` : ""}`;
      case "invite_sent":
        return `Инвайт отправлен.${firstLine ? ` ${formatLineWithUsername(firstLine)}` : ""}`;
      case "invite_failed":
        return `Инвайт не удался.${firstLine ? ` ${formatLineWithUsername(firstLine)}` : ""}`;
      case "invite_skipped":
        return firstLine
          ? `Пропуск инвайта: ${formatLineWithUsername(firstLine)}`
          : "Пропуск инвайта.";
      case "confirm_ok":
        return `Участие подтверждено.${userLabel ? ` ${userLabel}` : ""}`;
      case "confirm_unconfirmed":
        return `Участие не подтверждено.${userLabel ? ` ${userLabel}` : ""}${firstLine && firstLine.includes("USER_NOT_PARTICIPANT") ? " (инвайт отправлен, но пользователь ещё не вступил)" : ""}`;
      case "confirm_retry_scheduled":
        return `Повторная проверка запланирована.${firstLine ? ` ${firstLine}` : ""}`;
      case "confirm_retry_ok":
        return `Повторная проверка: участие подтверждено.${firstLine ? ` ${firstLine}` : ""}`;
      case "confirm_retry_failed":
        return `Повторная проверка: не подтверждено.${firstLine ? ` ${firstLine}` : ""}`;
      case "auto_join_ok":
        return `Автовступление выполнено.${firstLine ? ` ${firstLine}` : ""}`;
      case "auto_join_request":
        return `Заявка на вступление отправлена.${firstLine ? ` ${firstLine}` : ""}`;
      case "auto_join_already":
        return `Аккаунт уже в группе.${firstLine ? ` ${firstLine}` : ""}`;
      case "auto_join_failed":
        return `Автовступление не удалось.${firstLine ? ` ${firstLine}` : ""}`;
      case "roles_changed":
        return `Роли аккаунтов обновлены.${firstLine ? ` ${firstLine}` : ""}`;
      case "preset_applied":
        return `Применен пресет настроек.${firstLine ? ` ${firstLine}` : ""}`;
      default:
        return firstLine ? `Событие: ${firstLine}` : "Событие: подробности в «Подробнее».";
    }
  };

  const eventTypes = useMemo(() => {
    const types = new Set(accountEvents.map((event) => event.eventType));
    return ["all", ...Array.from(types)];
  }, [accountEvents]);

  const filtered = useMemo(() => {
    const q = query.trim().toLowerCase();
    return accountEvents.filter((event) => {
      if (typeFilter !== "all" && event.eventType !== typeFilter) return false;
      if (!q) return true;
      const text = [event.eventType, event.message, event.phone, event.accountId]
        .join(" ")
        .toLowerCase();
      return text.includes(q);
    });
  }, [accountEvents, typeFilter, query]);

  return (
    <section className="card logs">
      <div className="row-header">
        <h3>Основной поток</h3>
        <div className="row-inline">
          <button type="button" className="secondary" onClick={() => window.dispatchEvent(new CustomEvent("openLogsTab"))}>
            Показать историю запусков
          </button>
          <button type="button" className="danger" onClick={onClearEvents}>Сбросить</button>
        </div>
      </div>
      <div className="row-inline column">
        <input
          type="text"
          value={query}
          onChange={(event) => setQuery(event.target.value)}
          placeholder="Поиск по событиям"
        />
        <div className="task-filters">
          {eventTypes.map((type) => (
            <button
              key={type}
              type="button"
              className={`chip ${typeFilter === type ? "active" : ""}`}
              onClick={() => setTypeFilter(type)}
            >
              {type === "all" ? "Все" : type}
            </button>
          ))}
        </div>
      </div>
      {filtered.length === 0 && <div className="empty">Событий нет.</div>}
      {filtered.map((event) => (
        <div key={event.id} className="log-row">
          <div className="log-time">
            <div>{formatTimestamp(event.createdAt)}</div>
            <div>{event.eventType}</div>
          </div>
          <div className="log-details">
            <div>Аккаунт: {(() => {
              const account = accountById ? accountById.get(event.accountId) : null;
              return account ? formatAccountLabel(account) : (event.phone || event.accountId);
            })()}</div>
            <div className="log-users wrap">{buildEventSummary(event)}</div>
            <button
              type="button"
              className="ghost"
              onClick={() => setExpandedEventId(expandedEventId === event.id ? null : event.id)}
            >
              {expandedEventId === event.id ? "Скрыть детали" : "Подробнее"}
            </button>
            {expandedEventId === event.id && (
              <div className="invite-details">
                <div className="pre-line">{event.message || "—"}</div>
              </div>
            )}
          </div>
        </div>
      ))}
    </section>
  );
}

export default memo(EventsTab);
