import { ContactImportRow, ImportRowStatus } from "@prisma/client";
import { prisma } from "@/shared/infra/prisma/prisma-client";
import { ContactImportRowsRepository, CreateImportRowData } from "./contact-import-rows-repository";

export class PrismaContactImportRowsRepository implements ContactImportRowsRepository {
  async createMany(jobId: string, rows: CreateImportRowData[]): Promise<void> {
    await prisma.contactImportRow.createMany({
      data: rows.map((row) => ({
        jobId,
        rowIndex: row.rowIndex,
        rawData: row.rawData as never,
      })),
    });
  }

  async findPendingBatch(jobId: string, limit: number): Promise<ContactImportRow[]> {
    return prisma.contactImportRow.findMany({
      where: { jobId, status: "PENDING" },
      orderBy: { rowIndex: "asc" },
      take: limit,
    });
  }

  async updateStatus(id: string, status: ImportRowStatus, errorMessage?: string): Promise<void> {
    await prisma.contactImportRow.update({
      where: { id },
      data: { status, errorMessage: errorMessage ?? null },
    });
  }

  async findErrorsByJobId(jobId: string): Promise<ContactImportRow[]> {
    return prisma.contactImportRow.findMany({
      where: { jobId, status: "ERROR" },
      orderBy: { rowIndex: "asc" },
    });
  }

  async countRemaining(jobId: string): Promise<number> {
    return prisma.contactImportRow.count({ where: { jobId, status: "PENDING" } });
  }
}
