import { and, eq } from "drizzle-orm";

import { db } from "@/lib/db";
import { invitation, member, user } from "@/lib/db/schema";

export type MemberRow = {
  id: string;
  userId: string;
  role: "owner" | "admin" | "member";
  email: string;
  name: string;
  createdAt: Date;
};

export async function listMembers(organizationId: string): Promise<MemberRow[]> {
  const rows = await db
    .select({
      id: member.id,
      userId: member.userId,
      role: member.role,
      email: user.email,
      name: user.name,
      createdAt: member.createdAt,
    })
    .from(member)
    .innerJoin(user, eq(user.id, member.userId))
    .where(eq(member.organizationId, organizationId))
    .orderBy(member.createdAt);

  return rows.map((r) => ({
    id: r.id,
    userId: r.userId,
    role: r.role as "owner" | "admin" | "member",
    email: r.email,
    name: r.name,
    createdAt: r.createdAt,
  }));
}

export type PendingInvitationRow = {
  id: string;
  email: string;
  role: "admin" | "member";
  expiresAt: Date;
};

export async function listPendingInvitations(
  organizationId: string,
): Promise<PendingInvitationRow[]> {
  const rows = await db
    .select({
      id: invitation.id,
      email: invitation.email,
      role: invitation.role,
      expiresAt: invitation.expiresAt,
    })
    .from(invitation)
    .where(and(eq(invitation.organizationId, organizationId), eq(invitation.status, "pending")))
    .orderBy(invitation.expiresAt);

  return rows.map((r) => ({
    id: r.id,
    email: r.email,
    role: r.role as "admin" | "member",
    expiresAt: r.expiresAt,
  }));
}
