import type { LiveChatConversation, LiveChatMessage, SupportTicket, SupportTicketMessage, User } from "@prisma/client";

type PublicUser = Pick<User, "id" | "email" | "username">;

export type TicketWithRelations = SupportTicket & {
  user: PublicUser;
  assignedAdmin?: PublicUser | null;
  messages: Array<SupportTicketMessage & { sender?: PublicUser | null }>;
};

export type ConversationWithRelations = LiveChatConversation & {
  user: PublicUser;
  assignedAdmin?: PublicUser | null;
  messages: Array<LiveChatMessage & { sender?: PublicUser | null }>;
};

export function serializeSupportTicket(ticket: TicketWithRelations) {
  return {
    id: ticket.id,
    userId: ticket.userId,
    subject: ticket.subject,
    category: ticket.category,
    status: ticket.status,
    priority: ticket.priority,
    lastMessageAt: ticket.lastMessageAt,
    closedAt: ticket.closedAt,
    createdAt: ticket.createdAt,
    updatedAt: ticket.updatedAt,
    user: serializeUser(ticket.user),
    assignedAdmin: ticket.assignedAdmin ? serializeUser(ticket.assignedAdmin) : null,
    messages: ticket.messages.map(serializeTicketMessage)
  };
}

export function serializeTicketMessage(message: SupportTicketMessage & { sender?: PublicUser | null }) {
  return {
    id: message.id,
    ticketId: message.ticketId,
    senderRole: message.senderRole,
    body: message.body,
    internal: message.internal,
    createdAt: message.createdAt,
    sender: message.sender ? serializeUser(message.sender) : null
  };
}

export function serializeLiveChatConversation(conversation: ConversationWithRelations) {
  return {
    id: conversation.id,
    userId: conversation.userId,
    status: conversation.status,
    lastMessageAt: conversation.lastMessageAt,
    rating: conversation.rating,
    ratingComment: conversation.ratingComment,
    ratingRequestedAt: conversation.ratingRequestedAt,
    ratedAt: conversation.ratedAt,
    closedAt: conversation.closedAt,
    createdAt: conversation.createdAt,
    updatedAt: conversation.updatedAt,
    user: serializeUser(conversation.user),
    assignedAdmin: conversation.assignedAdmin ? serializeUser(conversation.assignedAdmin) : null,
    messages: conversation.messages.map(serializeLiveChatMessage)
  };
}

export function serializeLiveChatMessage(message: LiveChatMessage & { sender?: PublicUser | null }) {
  return {
    id: message.id,
    conversationId: message.conversationId,
    senderRole: message.senderRole,
    body: message.body,
    createdAt: message.createdAt,
    sender: message.sender ? serializeUser(message.sender) : null
  };
}

function serializeUser(user: PublicUser) {
  return {
    id: user.id,
    email: user.email,
    username: user.username
  };
}
