import { and, eq, isNull } from 'drizzle-orm';
import type { DrizzleClient } from '../client.js';
import { imageUploads } from '../schema.js';

export async function createImageUpload(
  db: DrizzleClient,
  values: typeof imageUploads.$inferInsert,
): Promise<void> {
  await db.insert(imageUploads).values(values);
}

export async function markUploadScanStatus(
  db: DrizzleClient,
  uploadId: string,
  scanStatus: typeof imageUploads.$inferInsert.scanStatus,
): Promise<void> {
  await db.update(imageUploads).set({ scanStatus }).where(eq(imageUploads.id, uploadId));
}

export async function flagUploadForHumanReview(
  db: DrizzleClient,
  uploadId: string,
  flagReason: string,
): Promise<boolean> {
  const updated = await db
    .update(imageUploads)
    .set({
      aiDecision: 'FLAG',
      aiReason: flagReason,
    })
    .where(
      and(
        eq(imageUploads.id, uploadId),
        eq(imageUploads.approvalStatus, 'PENDING'),
        isNull(imageUploads.aiDecision),
      ),
    )
    .returning({ id: imageUploads.id });
  return updated.length > 0;
}

export async function setImageApprovalStatus(
  db: DrizzleClient,
  imageId: string,
  approvalStatus: typeof imageUploads.$inferInsert.approvalStatus,
): Promise<void> {
  await db.update(imageUploads).set({ approvalStatus }).where(eq(imageUploads.id, imageId));
}

export async function markImageRejected(
  db: DrizzleClient,
  imageId: string,
  rejectReasonCode: string,
): Promise<void> {
  await db
    .update(imageUploads)
    .set({ approvalStatus: 'REJECTED', rejectReasonCode })
    .where(eq(imageUploads.id, imageId));
}

export async function markImageFlaggedForAdminReview(
  db: DrizzleClient,
  imageId: string,
  reason: string,
): Promise<void> {
  await db
    .update(imageUploads)
    .set({
      aiDecision: 'FLAG',
      aiReason: reason,
    })
    .where(eq(imageUploads.id, imageId));
}
