import type { Document } from "@/types";
import type { DocumentUploadPlan } from "./documentGuards";

export interface DocumentUploadDependencies {
  uploadStorageFile: (plan: DocumentUploadPlan) => Promise<void>;
  createDatabaseRow: (plan: DocumentUploadPlan) => Promise<Document>;
  deleteStorageFile: (tripId: string, storagePath: string) => Promise<void>;
}

export class DocumentUploadCleanupError extends Error {
  readonly cause: unknown;
  readonly cleanupCause: unknown;

  constructor(cause: unknown, cleanupCause: unknown) {
    super("L'enregistrement a échoué et le fichier temporaire n'a pas pu être nettoyé.");
    this.name = "DocumentUploadCleanupError";
    this.cause = cause;
    this.cleanupCause = cleanupCause;
  }
}

export async function uploadDocumentSafely(
  tripId: string,
  plan: DocumentUploadPlan,
  dependencies: DocumentUploadDependencies,
): Promise<Document> {
  await dependencies.uploadStorageFile(plan);
  try {
    return await dependencies.createDatabaseRow(plan);
  } catch (error) {
    try {
      await dependencies.deleteStorageFile(tripId, plan.storagePath);
    } catch (cleanupError) {
      throw new DocumentUploadCleanupError(error, cleanupError);
    }
    throw error;
  }
}
