import { prisma } from "@/lib/prisma";
import { Prisma } from "@/app/generated/prisma/client";

export const bookingRepo = {
  async findById(id: string) {
    return prisma.booking.findUnique({ where: { id } });
  },

  async findByParticipantId(participantId: string) {
    return prisma.booking.findUnique({
      where: { participantId },
      include: { payments: { orderBy: { createdAt: "desc" } } },
    });
  },

  async findByTripAndUser(tripId: string, userId: string) {
    return prisma.booking.findUnique({
      where: { tripId_userId: { tripId, userId } },
      include: { payments: { orderBy: { createdAt: "desc" } } },
    });
  },

  /**
   * Daftar booking di trip ini yang masih menunggu konfirmasi pembayaran
   * dari organizer (Payment MANUAL status AWAITING).
   */
  async findAwaitingManualConfirmation(tripId: string) {
    return prisma.booking.findMany({
      where: {
        tripId,
        status: "AWAITING_PAY",
        payments: {
          some: { provider: "MANUAL", status: "AWAITING" },
        },
      },
      include: {
        participant: true,
        user: { select: { id: true, name: true, image: true } },
        payments: {
          where: { provider: "MANUAL", status: "AWAITING" },
          orderBy: { createdAt: "desc" },
          take: 1,
        },
      },
      orderBy: { updatedAt: "asc" },
    });
  },

  async create(
    data: Pick<
      Prisma.BookingUncheckedCreateInput,
      "tripId" | "userId" | "participantId" | "amount" | "status"
    >
  ) {
    return prisma.booking.create({ data });
  },

  async updateStatus(id: string, status: Prisma.BookingUpdateInput["status"]) {
    return prisma.booking.update({
      where: { id },
      data: { status },
    });
  },

  async updateStatusByParticipantId(
    participantId: string,
    status: Prisma.BookingUpdateInput["status"]
  ) {
    return prisma.booking.updateMany({
      where: { participantId },
      data: { status },
    });
  },
};
