import { NextResponse } from "next/server";
import {
  BEXOGAMES_DISCORD_GUILD_ID,
  BEXOGAMES_STREAMER_ROLE_ID,
  type DiscordStreamer,
  type DiscordStreamerStatus,
} from "../../../../lib/discord";

export const dynamic = "force-dynamic";

function avatarUrl(user: any) {
  if (!user?.id || !user?.avatar) return null;
  return `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png?size=128`;
}

export async function GET() {
  const token = process.env.DISCORD_BOT_TOKEN;
  // IDs sind für BexoGames fest hinterlegt. Env-Werte können sie bei Bedarf überschreiben.
  const guildId = process.env.DISCORD_GUILD_ID || BEXOGAMES_DISCORD_GUILD_ID;
  const streamerRoleId = process.env.DISCORD_STREAMER_ROLE_ID || BEXOGAMES_STREAMER_ROLE_ID;

  if (!token) {
    const payload: DiscordStreamerStatus = { ok: true, configured: false, count: 0, streamers: [] };
    return NextResponse.json(payload);
  }

  try {
    const allMembers: any[] = [];
    let after: string | undefined;

    for (let page = 0; page < 20; page++) {
      const params = new URLSearchParams({ limit: "1000" });
      if (after) params.set("after", after);

      const response = await fetch(`https://discord.com/api/v10/guilds/${guildId}/members?${params.toString()}`, {
        cache: "no-store",
        headers: {
          Authorization: `Bot ${token}`,
          "User-Agent": "BexoGames.de Website",
        },
      });

      if (!response.ok) {
        const payload: DiscordStreamerStatus = {
          ok: false,
          configured: true,
          count: 0,
          streamers: [],
          error: `Discord Member API antwortete mit ${response.status}`,
        };
        return NextResponse.json(payload, { status: 200 });
      }

      const members = await response.json();
      allMembers.push(...members);
      if (members.length < 1000) break;
      after = members[members.length - 1]?.user?.id;
      if (!after) break;
    }

    const streamers: DiscordStreamer[] = allMembers
      .filter((member) => Array.isArray(member.roles) && member.roles.includes(streamerRoleId) && member.user)
      .map((member) => ({
        id: member.user.id,
        username: member.user.username,
        displayName: member.nick || member.user.global_name || member.user.username,
        avatar: avatarUrl(member.user),
      }))
      .sort((a, b) => a.displayName.localeCompare(b.displayName, "de"));

    const payload: DiscordStreamerStatus = {
      ok: true,
      configured: true,
      count: streamers.length,
      streamers,
    };
    return NextResponse.json(payload);
  } catch (error) {
    const payload: DiscordStreamerStatus = {
      ok: false,
      configured: true,
      count: 0,
      streamers: [],
      error: error instanceof Error ? error.message : "Streamer-Rolle konnte nicht gelesen werden",
    };
    return NextResponse.json(payload, { status: 200 });
  }
}
