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

export class InMemoryContactImportRowsRepository implements ContactImportRowsRepository {
  public items: ContactImportRow[] = [];

  async createMany(jobId: string, rows: CreateImportRowData[]): Promise<void> {
    for (const row of rows) {
      this.items.push({
        id: `import-row-${this.items.length + 1}`,
        jobId,
        rowIndex: row.rowIndex,
        rawData: row.rawData as never,
        status: "PENDING",
        errorMessage: null,
      });
    }
  }

  async findPendingBatch(jobId: string, limit: number): Promise<ContactImportRow[]> {
    return this.items
      .filter((item) => item.jobId === jobId && item.status === "PENDING")
      .sort((a, b) => a.rowIndex - b.rowIndex)
      .slice(0, limit);
  }

  async updateStatus(id: string, status: ImportRowStatus, errorMessage?: string): Promise<void> {
    const index = this.items.findIndex((item) => item.id === id);
    if (index === -1) return;
    this.items[index] = { ...this.items[index], status, errorMessage: errorMessage ?? null };
  }

  async findErrorsByJobId(jobId: string): Promise<ContactImportRow[]> {
    return this.items
      .filter((item) => item.jobId === jobId && item.status === "ERROR")
      .sort((a, b) => a.rowIndex - b.rowIndex);
  }

  async countRemaining(jobId: string): Promise<number> {
    return this.items.filter((item) => item.jobId === jobId && item.status === "PENDING").length;
  }
}
