/* screens-11.jsx — Tag Explorer (YOUN-21) */

const API_URL_TAGS = "https://younalyse-api-646149995822.europe-west1.run.app";

const TagsScreen = ({ userId, onToast }) => {
  const [tags, setTags] = React.useState([]);
  const [total, setTotal] = React.useState(0);
  const [loading, setLoading] = React.useState(true);
  const [tab, setTab] = React.useState("all");
  const [search, setSearch] = React.useState("");
  const [selectedChannel, setSelectedChannel] = React.useState("");
  const [availableChannels, setAvailableChannels] = React.useState([]);
  const [pageSize, setPageSize] = React.useState(50);
  const [page, setPage] = React.useState(0);

  // Панель тегов — только для таба избранное
  const [selectedTags, setSelectedTags] = React.useState([]);
  const [copiedTags, setCopiedTags] = React.useState(false);

  const T = window.T || {};

  // ── Загрузка каналов ──────────────────────────────────────────────────

  React.useEffect(() => {
    if (!userId) return;
    fetch(`${API_URL_TAGS}/api/tags/channels-list?user_id=${userId}`)
      .then((r) => r.json())
      .then((d) => setAvailableChannels(d.channels || []))
      .catch(() => {});
  }, [userId]);

  // ── Загрузка тегов ────────────────────────────────────────────────────

  const load = (
    currentTab = tab,
    currentPage = page,
    currentPageSize = pageSize,
  ) => {
    if (!userId) return;
    setLoading(true);
    const params = new URLSearchParams({ user_id: userId });
    if (selectedChannel) params.set("channel_name", selectedChannel);
    if (currentTab === "favorites") params.set("favorites_only", "true");
    if (currentTab === "hidden") params.set("show_hidden", "true");

    fetch(`${API_URL_TAGS}/api/tags?${params}`)
      .then((r) => r.json())
      .then((d) => {
        const all = d.tags || [];
        setTotal(all.length);
        // Пагинация на фронте
        const start = currentPage * currentPageSize;
        setTags(all.slice(start, start + currentPageSize));
        setLoading(false);
      })
      .catch(() => setLoading(false));
  };

  React.useEffect(() => {
    setPage(0);
    setSelectedTags([]);
    load(tab, 0, pageSize);
  }, [userId, selectedChannel, tab]);

  React.useEffect(() => {
    load(tab, page, pageSize);
  }, [page, pageSize]);

  // ── Преференции ───────────────────────────────────────────────────────

  const setPreference = async (tag, update) => {
    // Оптимистичное обновление — меняем состояние локально без перезагрузки
    setTags((prev) =>
      prev.map((t) => (t.tag === tag ? { ...t, ...update } : t)),
    );
    if (update.is_hidden) {
      setSelectedTags((prev) => prev.filter((t) => t !== tag));
    }
    // Фоновый запрос
    fetch(`${API_URL_TAGS}/api/tags/preferences`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ user_id: userId, tag, ...update }),
    }).catch(() => {
      // При ошибке — перезагружаем реальное состояние
      load();
    });
  };

  const handleFavorite = (t) =>
    setPreference(t.tag, { is_favorite: !t.is_favorite });
  const handleHide = (t) => {
    setPreference(t.tag, { is_hidden: true });
    // При скрытии — убираем из текущего списка если таб "все"
    if (tab !== "hidden") {
      setTags((prev) => prev.filter((item) => item.tag !== t.tag));
      setTotal((prev) => prev - 1);
    }
  };
  const handleRestore = (t) => {
    setPreference(t.tag, { is_hidden: false });
    if (tab === "hidden") {
      setTags((prev) => prev.filter((item) => item.tag !== t.tag));
      setTotal((prev) => prev - 1);
    }
  };

  // ── Фильтрация (поиск) ────────────────────────────────────────────────

  const filtered = React.useMemo(() => {
    if (!search) return tags;
    const q = search.toLowerCase();
    return tags.filter((t) => t.tag.toLowerCase().includes(q));
  }, [tags, search]);

  const totalPages = Math.ceil(total / pageSize);

  // ── Копирование тегов ─────────────────────────────────────────────────

  const handleCopyTags = () => {
    if (!selectedTags.length) return;
    navigator.clipboard.writeText(selectedTags.join(", ")).then(() => {
      setCopiedTags(true);
      setTimeout(() => setCopiedTags(false), 2000);
    });
  };

  // ── Рендер ────────────────────────────────────────────────────────────

  return (
    <div className="page" style={{ maxWidth: 1400 }}>
      <div style={{ display: "flex", gap: 20, alignItems: "flex-start" }}>
        {/* ── Основная таблица ── */}
        <div className="table-wrap" style={{ flex: 1 }}>
          <div className="table-toolbar">
            <Search
              value={search}
              onChange={setSearch}
              placeholder={T.tagsSearchPlaceholder || "Поиск по тегу…"}
            />

            {availableChannels.length > 0 && (
              <select
                className="select"
                value={selectedChannel}
                onChange={(e) => {
                  setSelectedChannel(e.target.value);
                  setPage(0);
                }}
                style={{ height: 30, fontSize: 12, width: 180 }}
              >
                <option value="">{T.resultsAllChannels || "Все каналы"}</option>
                {availableChannels.map((ch) => (
                  <option key={ch.channel_name} value={ch.channel_name}>
                    {ch.channel_name}
                  </option>
                ))}
              </select>
            )}

            <div className="segmented">
              {[
                { id: "all", label: T.commentsAll || "Все" },
                {
                  id: "favorites",
                  label: T.commentsFavorites || "★ Избранное",
                },
                { id: "hidden", label: T.commentsHidden || "Скрытые" },
              ].map((t) => (
                <button
                  key={t.id}
                  className={tab === t.id ? "active" : ""}
                  onClick={() => setTab(t.id)}
                >
                  {t.label}
                </button>
              ))}
            </div>

            <div style={{ flex: 1 }} />

            {/* Размер страницы */}
            <div
              style={{
                display: "flex",
                alignItems: "center",
                gap: 6,
                fontSize: 12,
                color: "var(--fg-muted)",
              }}
            >
              <span>{T.transcriptsPerPage || "На странице:"}</span>
              <div className="segmented">
                {[25, 50, 100].map((n) => (
                  <button
                    key={n}
                    className={pageSize === n ? "active" : ""}
                    onClick={() => {
                      setPageSize(n);
                      setPage(0);
                    }}
                  >
                    {n}
                  </button>
                ))}
              </div>
            </div>
          </div>

          <div className="table-scroll">
            {loading ? (
              <div
                style={{
                  padding: "60px 32px",
                  textAlign: "center",
                  color: "var(--fg-faint)",
                  fontSize: 13,
                }}
              >
                {T.loading || "Загружаем…"}
              </div>
            ) : filtered.length === 0 ? (
              <div
                style={{
                  padding: "60px 32px",
                  textAlign: "center",
                  color: "var(--fg-muted)",
                }}
              >
                <div style={{ fontSize: 32, marginBottom: 12 }}>
                  {tab === "favorites" ? "★" : tab === "hidden" ? "🫥" : "🏷️"}
                </div>
                <div style={{ fontSize: 15, fontWeight: 500, marginBottom: 6 }}>
                  {tab === "favorites"
                    ? T.tagsNoFavorites || "Нет избранных тегов"
                    : tab === "hidden"
                      ? T.tagsNoHidden || "Нет скрытых тегов"
                      : T.tagsEmpty || "Тегов пока нет"}
                </div>
                {tab === "all" && (
                  <div style={{ fontSize: 13, color: "var(--fg-faint)" }}>
                    {T.tagsEmptyHint ||
                      "Запустите анализ канала чтобы собрать теги."}
                  </div>
                )}
              </div>
            ) : (
              <table className="data">
                <thead>
                  <tr>
                    <th style={{ minWidth: 260 }}>{T.tagsColTag || "Тег"}</th>
                    <th className="num" style={{ width: 80 }}>
                      {T.tagsColVideos || "Видео"}
                    </th>
                    <th style={{ minWidth: 180 }}>
                      {T.tagsColChannels || "Каналы"}
                    </th>
                    {tab === "favorites" && (
                      <th style={{ width: 80, textAlign: "center" }}>
                        {T.tagsColInTags || "В теги"}
                      </th>
                    )}
                    <th style={{ width: 80 }}></th>
                  </tr>
                </thead>
                <tbody>
                  {filtered.map((t) => {
                    const isSelected = selectedTags.includes(t.tag);
                    return (
                      <tr
                        key={t.tag}
                        style={
                          isSelected ? { background: "var(--accent-soft)" } : {}
                        }
                      >
                        <td>
                          <span style={{ fontSize: 13, color: "var(--fg)" }}>
                            {t.tag}
                          </span>
                        </td>
                        <td
                          className="num"
                          style={{ fontFamily: "var(--mono)", fontSize: 12 }}
                        >
                          {t.count}
                        </td>
                        <td style={{ fontSize: 12, color: "var(--fg-faint)" }}>
                          {t.channels?.join(", ") || "—"}
                        </td>

                        {/* Радиокнопка "В теги" — только на табе Избранное */}
                        {tab === "favorites" && (
                          <td style={{ textAlign: "center" }}>
                            <button
                              className="btn ghost sm"
                              style={{
                                color: isSelected
                                  ? "var(--accent)"
                                  : "var(--fg-faint)",
                                fontSize: 16,
                              }}
                              onClick={() => {
                                if (isSelected)
                                  setSelectedTags((prev) =>
                                    prev.filter((s) => s !== t.tag),
                                  );
                                else
                                  setSelectedTags((prev) => [...prev, t.tag]);
                              }}
                            >
                              {isSelected ? "◉" : "○"}
                            </button>
                          </td>
                        )}

                        <td>
                          <div
                            style={{
                              display: "flex",
                              gap: 4,
                              justifyContent: "flex-end",
                              alignItems: "center",
                            }}
                          >
                            {/* Звёздочка — только добавление в избранное */}
                            <button
                              className="btn ghost sm"
                              title={
                                t.is_favorite
                                  ? T.tagsRemoveFav || "Убрать из избранного"
                                  : T.tagsAddFav || "В избранное"
                              }
                              style={{
                                color: t.is_favorite
                                  ? "var(--warn)"
                                  : "var(--fg-faint)",
                                fontSize: 15,
                              }}
                              onClick={() => handleFavorite(t)}
                            >
                              {t.is_favorite ? "★" : "☆"}
                            </button>

                            {/* Скрыть / Восстановить */}
                            <button
                              className="btn ghost sm"
                              title={
                                tab === "hidden"
                                  ? T.commentRestore || "Восстановить"
                                  : T.commentHide || "Скрыть"
                              }
                              style={{
                                color:
                                  tab === "hidden"
                                    ? "var(--good)"
                                    : "var(--fg-faint)",
                              }}
                              onClick={() =>
                                tab === "hidden"
                                  ? handleRestore(t)
                                  : handleHide(t)
                              }
                            >
                              <Icon name="eye" size={13} />
                            </button>
                          </div>
                        </td>
                      </tr>
                    );
                  })}
                </tbody>
              </table>
            )}
          </div>

          {/* Пагинация */}
          {totalPages > 1 && (
            <div
              style={{
                display: "flex",
                alignItems: "center",
                justifyContent: "space-between",
                padding: "12px 16px",
                borderTop: "1px solid var(--border)",
                fontSize: 13,
              }}
            >
              <span style={{ color: "var(--fg-muted)" }}>
                {page * pageSize + 1}–{Math.min((page + 1) * pageSize, total)}{" "}
                {T.paginationOf || "из"} {total}
              </span>
              <div style={{ display: "flex", gap: 6 }}>
                <button
                  className="btn sm"
                  disabled={page === 0}
                  onClick={() => setPage((p) => p - 1)}
                >
                  <Icon name="chevron-left" size={13} />
                </button>
                {Array.from({ length: Math.min(totalPages, 7) }, (_, i) => {
                  const p =
                    totalPages <= 7
                      ? i
                      : page < 4
                        ? i
                        : page > totalPages - 4
                          ? totalPages - 7 + i
                          : page - 3 + i;
                  return (
                    <button
                      key={p}
                      className={"btn sm" + (p === page ? " primary" : "")}
                      onClick={() => setPage(p)}
                    >
                      {p + 1}
                    </button>
                  );
                })}
                <button
                  className="btn sm"
                  disabled={page >= totalPages - 1}
                  onClick={() => setPage((p) => p + 1)}
                >
                  <Icon name="chevron-right" size={13} />
                </button>
              </div>
            </div>
          )}
        </div>

        {/* ── Панель тегов — только на табе Избранное ── */}
        {tab === "favorites" && (
          <div
            style={{
              width: 300,
              flexShrink: 0,
              border: "1px solid var(--border-strong)",
              borderRadius: "var(--radius-lg)",
              overflow: "hidden",
              display: "flex",
              flexDirection: "column",
            }}
          >
            <div
              style={{
                padding: "12px 16px",
                borderBottom: "1px solid var(--border)",
                display: "flex",
                alignItems: "center",
                justifyContent: "space-between",
              }}
            >
              <span style={{ fontSize: 13, fontWeight: 500 }}>
                {T.tagsFavPanel || "Теги для видео"}
              </span>
              <button
                className="btn ghost sm"
                title={copiedTags ? "✓" : T.tagsCopyAll || "Скопировать"}
                onClick={handleCopyTags}
                disabled={!selectedTags.length}
                style={{
                  color: copiedTags ? "var(--good)" : "var(--fg-faint)",
                  padding: "0 6px",
                }}
              >
                <Icon name="download" size={13} />
              </button>
            </div>

            <div
              style={{
                padding: "10px 14px",
                flex: 1,
                minHeight: 180,
                display: "flex",
                flexWrap: "wrap",
                gap: 6,
                alignContent: "flex-start",
              }}
            >
              {selectedTags.length === 0 ? (
                <span
                  style={{
                    fontSize: 13,
                    color: "var(--fg-faint)",
                    fontStyle: "italic",
                  }}
                >
                  {T.tagsFavPlaceholder || "Выберите теги из избранного слева"}
                </span>
              ) : (
                selectedTags.map((tag) => (
                  <span
                    key={tag}
                    style={{
                      display: "inline-flex",
                      alignItems: "center",
                      gap: 6,
                      padding: "3px 10px",
                      borderRadius: 100,
                      background: "var(--accent-soft)",
                      border: "1px solid rgba(79,124,255,0.2)",
                      fontSize: 12,
                      color: "var(--accent)",
                    }}
                  >
                    {tag}
                    <button
                      onClick={() =>
                        setSelectedTags((prev) => prev.filter((t) => t !== tag))
                      }
                      style={{
                        background: "none",
                        border: "none",
                        cursor: "pointer",
                        color: "var(--accent)",
                        padding: 0,
                        lineHeight: 1,
                        fontSize: 14,
                      }}
                    >
                      ×
                    </button>
                  </span>
                ))
              )}
            </div>

            <div
              style={{
                padding: "8px 16px",
                borderTop: "1px solid var(--border)",
                fontSize: 11,
                color: "var(--fg-faint)",
                textAlign: "right",
                fontFamily: "var(--mono)",
              }}
            >
              {selectedTags.join(", ").length} / 500
            </div>
          </div>
        )}
      </div>
    </div>
  );
};

Object.assign(window, { TagsScreen });
