// PublicAlbumsView — read-only album player backed by published server albums.

function PublicAlbumsView({
  albums,
  selectedAlbumId,
  loading,
  error,
  onRefresh,
  onSelectAlbum,
  onExit,
  onCopyToWorkspace,
  onUnpublishAlbum,
}) {
  const hasAudioAsset = (song) => (
    !!(song?.audioServerUrl || song?.audio?.filename || song?.audio?.url || song?.exportState?.audioFilename)
  );
  const hasVideoAsset = (song) => !!song?.exportState?.videoFilename;
  const resolveAudioUrl = React.useCallback((song) => buildPublicAlbumMediaUrl(
    "audio",
    song?.audioServerUrl || song?.audio?.filename || song?.audio?.url || song?.exportState?.audioFilename || ""
  ), []);
  const resolveVideoUrl = React.useCallback(
    (song) => buildPublicAlbumMediaUrl("video", song?.exportState?.videoFilename || ""),
    []
  );

  const renderPlayActionsExtra = React.useCallback((item, album) => {
    const { Icon } = window;
    const session = window.SongfilmAuth?.getSession?.();
    const publisherEmail = String(album?.publishedBy?.email || "").trim().toLowerCase();
    const sessionEmail = String(session?.email || "").trim().toLowerCase();
    const isMine = !!publisherEmail && !!sessionEmail && publisherEmail === sessionEmail;
    const showCopy = !!onCopyToWorkspace;
    const showUnpublish = isMine && !!onUnpublishAlbum;
    if (!showCopy && !showUnpublish) return null;
    return (
      <>
        {showCopy && (
          <button
            className="pill-btn"
            data-role="main-album-player-copy-workspace-btn"
            onClick={(e) => { e.stopPropagation(); onCopyToWorkspace(item); }}
            title="이 공개 앨범을 내 워크스페이스에 복사합니다"
          >
            <Icon.Download size={12}/> <span className="btn-label">내 워크스페이스로 복사</span>
          </button>
        )}
        {showUnpublish && (
          <button
            className="pill-btn danger"
            data-role="main-hub-unpublish-btn"
            onClick={(e) => { e.stopPropagation(); onUnpublishAlbum(item); }}
            title="내가 공개한 앨범의 공개를 취소합니다"
          >
            <Icon.X size={12}/> <span className="btn-label">Publish 취소</span>
          </button>
        )}
      </>
    );
  }, [onCopyToWorkspace, onUnpublishAlbum]);

  return (
    <AlbumPlayerView
      albums={albums}
      selectedAlbumId={selectedAlbumId}
      onSelectAlbum={onSelectAlbum}
      loading={loading}
      error={error}
      onRefresh={onRefresh}
      onExit={onExit}
      copy={{
        headerLabel: "PUBLIC LIBRARY",
        title: "공개 앨범",
        subtitle: "공개된 Songfilm 앨범을 읽기 전용으로 재생합니다.",
        loadingText: "공개 앨범을 불러오는 중입니다.",
        emptyText: "공개된 앨범이 없습니다.",
      }}
      hasAudioAsset={hasAudioAsset}
      hasVideoAsset={hasVideoAsset}
      resolveAudioUrl={resolveAudioUrl}
      resolveVideoUrl={resolveVideoUrl}
      getAlbumItems={(items) => items}
      getAlbumFromItem={(item) => item?.album || null}
      getItemId={(item) => item?.id || ""}
      getCardTitle={(item, album) => item?.title || album?.title || "Untitled Album"}
      getCardSubtitle={(item, album) => {
        const songCount = item?.songCount ?? album?.songs?.length ?? 0;
        const publisher = album?.publishedBy?.nickname ? ` · by ${album.publishedBy.nickname}` : "";
        return `${item?.artist || album?.artist || "Unknown"} · ${songCount}곡${publisher}`;
      }}
      getCardBadge={(item, album) => album?.year || "PUBLIC"}
      getPanelLabel={() => "읽기 전용 공개 앨범"}
      getPanelPublisher={(item, album) => (
        album?.publishedBy?.nickname ? `Published by ${album.publishedBy.nickname}` : ""
      )}
      getSelectedMissingText={() => "선택한 공개 앨범 데이터를 불러오지 못했습니다."}
      renderPlayActionsExtra={renderPlayActionsExtra}
    />
  );
}
