import type { ChannelStatus, ChatMessage, InboundKickEvent } from "../types.ts";

type JsonObject = Record<string, unknown>;

export const parseInboundPayload = (event: InboundKickEvent): JsonObject => {
  const value = JSON.parse(event.payload_json) as unknown;
  if (!value || typeof value !== "object" || Array.isArray(value)) {
    throw new Error("Payload webhook Kick invalide.");
  }
  return value as JsonObject;
};

export const toChatMessage = (
  event: InboundKickEvent,
  channel: ChannelStatus,
  payload: JsonObject
): ChatMessage | null => {
  if (event.event_type !== "chat.message.sent") return null;
  const sender = (payload.sender ?? {}) as JsonObject;
  const identity = (sender.identity ?? {}) as JsonObject;
  const badges = Array.isArray(identity.badges) ? identity.badges : [];
  const roles = badges
    .map((badge) => String((badge as JsonObject).type ?? "").toLowerCase())
    .filter(Boolean);
  const content = String(payload.content ?? "").trim();
  const senderId = String(sender.user_id ?? "");
  if (!content || !senderId) return null;
  return {
    event_id: String(payload.message_id ?? event.kick_message_id),
    channel_id: channel.channel_id,
    kick_channel_id: channel.kick_channel_id,
    kick_chatroom_id: channel.kick_chatroom_id,
    content,
    sender: {
      kick_user_id: senderId,
      username: String(sender.username ?? "viewer"),
      roles: [...new Set(roles)]
    },
    created_at: String(payload.created_at ?? new Date().toISOString())
  };
};
