
import { Trip, Document } from "../types";
import { useSupabaseDocuments } from "./useSupabaseDocuments";
import { useSupabaseStorage } from "./useSupabaseStorage";
import { deleteDocumentSafely } from "../services/documentDeletionService";
import * as tripOperations from "../utils/tripOperations";

export function useDocumentOperations(setTrips: React.Dispatch<React.SetStateAction<Trip[]>>) {
  const {
    addDocument: addDoc,
    getDocumentsForTrip,
    getDocumentForDeletion,
    deleteDocumentRow,
  } = useSupabaseDocuments();
  const { deleteStorageDocument } = useSupabaseStorage();

  const addDocument = async (tripId: string, document: Omit<Document, "uploadedAt">) => {
    const newDocument = await addDoc(tripId, document);
    if (newDocument) {
      setTrips((prev: Trip[]) => tripOperations.updateTripsAfterDocumentAdd(prev, tripId, newDocument));
    }
    return newDocument;
  };

  const deleteDocument = async (tripId: string, documentId: string) => {
    const reloadDocuments = async (targetTripId: string) => {
      const documents = await getDocumentsForTrip(targetTripId);
      setTrips((previousTrips) => previousTrips.map((trip) =>
        trip.id === targetTripId ? { ...trip, documents } : trip
      ));
    };

    await deleteDocumentSafely(tripId, documentId, {
      loadTarget: getDocumentForDeletion,
      deleteStorageFile: async (targetTripId, storagePath) => {
        await deleteStorageDocument(targetTripId, storagePath);
      },
      deleteDatabaseRow: deleteDocumentRow,
      reloadDocuments,
    });

    setTrips((prev: Trip[]) => tripOperations.updateTripsAfterDocumentDelete(prev, tripId, documentId));
    return true;
  };

  return {
    addDocument,
    deleteDocument,
  };
}
