import type { Prisma } from '@prisma/client'

export function softDelete<Model, Args extends object>(
  this: Model,
  args: Prisma.Exact<Args, Prisma.Args<Model, 'delete'>>,
): Promise<Prisma.Result<Model, Args, 'update'>> {
  // @ts-expect-error: Requires more types from Prisma
  return this.update({
    ...args,
    data: {
      deletedAt: new Date(),
    },
  })
}

export function softDeleteMany<Model, Args extends object>(
  this: Model,
  args?: Prisma.Exact<Args, Prisma.Args<Model, 'deleteMany'>>,
): Promise<Prisma.Result<Model, Args, 'updateMany'>> {
  // @ts-expect-error: Requires more types from Prisma
  return this.updateMany({
    ...args,
    data: {
      deletedAt: new Date(),
    },
  })
}

export function softRestore<Model, Args extends object>(
  this: Model,
  args: Prisma.Exact<Args, Prisma.Args<Model, 'delete'>>,
): Promise<Prisma.Result<Model, Args, 'update'>> {
  // @ts-expect-error: Requires more types from Prisma
  return this.update({
    ...args,
    data: {
      deletedAt: null,
    },
  })
}

export function softRestoreMany<Model, Args extends object>(
  this: Model,
  args?: Prisma.Exact<Args, Prisma.Args<Model, 'deleteMany'>>,
): Promise<Prisma.Result<Model, Args, 'updateMany'>> {
  // @ts-expect-error: Requires more types from Prisma
  return this.updateMany({
    ...args,
    data: {
      deletedAt: null,
    },
  })
}
