import { useTrips } from "@/contexts/TripContext";
import { createDocumentUploadPlan } from "@/services/documentGuards";
import { uploadDocumentSafely } from "@/services/documentUploadService";
import { useSupabaseStorage } from "@/hooks/useSupabaseStorage";
import { normalizeDocumentCategory } from "@/services/documentCategories";

export function useDocumentUploadFlow() {
  const { addDocument } = useTrips();
  const { uploadDocument, deleteStorageDocument } = useSupabaseStorage();

  const uploadDocumentFile = async (tripId: string, file: File, type: string, stepId?: string) => {
    const plan = createDocumentUploadPlan(tripId, file);
    return uploadDocumentSafely(tripId, plan, {
      uploadStorageFile: async (targetPlan) => {
        await uploadDocument(tripId, file, targetPlan);
      },
      createDatabaseRow: async (targetPlan) => {
        const document = await addDocument(tripId, {
          id: targetPlan.id,
          name: targetPlan.displayName,
          type: normalizeDocumentCategory(type),
          url: targetPlan.storagePath,
          stepId,
          mimeType: targetPlan.mimeType,
          sizeBytes: targetPlan.sizeBytes,
        });
        if (!document) throw new Error("L'association SQL du document a échoué.");
        return document;
      },
      deleteStorageFile: async (targetTripId, storagePath) => {
        await deleteStorageDocument(targetTripId, storagePath);
      },
    });
  };

  return { uploadDocumentFile };
}
