import { ContactImportJob } from "@prisma/client";
import { prisma } from "@/shared/infra/prisma/prisma-client";
import {
  ContactImportJobsRepository,
  CreateImportJobData,
  IncrementImportJobCountersData,
  UpdateImportJobMappingData,
} from "./contact-import-jobs-repository";

export class PrismaContactImportJobsRepository implements ContactImportJobsRepository {
  async create(data: CreateImportJobData): Promise<ContactImportJob> {
    return prisma.contactImportJob.create({
      data: {
        fileName: data.fileName,
        totalRows: data.totalRows,
        createdById: data.createdById,
      },
    });
  }

  async findById(id: string): Promise<ContactImportJob | null> {
    return prisma.contactImportJob.findUnique({ where: { id } });
  }

  async updateMapping(id: string, data: UpdateImportJobMappingData): Promise<ContactImportJob> {
    return prisma.contactImportJob.update({
      where: { id },
      data: {
        columnMapping: data.columnMapping as never,
        duplicateStrategy: data.duplicateStrategy,
        targetListId: data.targetListId,
        status: "PROCESSING",
      },
    });
  }

  async incrementCounters(id: string, data: IncrementImportJobCountersData): Promise<ContactImportJob> {
    return prisma.contactImportJob.update({
      where: { id },
      data: {
        processedRows: { increment: data.processedRows },
        importedCount: { increment: data.importedCount },
        updatedCount: { increment: data.updatedCount },
        skippedCount: { increment: data.skippedCount },
        errorCount: { increment: data.errorCount },
      },
    });
  }

  async markCompleted(id: string): Promise<ContactImportJob> {
    return prisma.contactImportJob.update({ where: { id }, data: { status: "COMPLETED" } });
  }
}
