import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { serviceService } from "../services/service.service";
import {
  CreateServicePayload,
  UpdateServicePayload,
} from "../types/service.type";
import { PaginationParams } from "@/lib/pagination";
import { showToast } from "@/lib/toast";

const SVC_KEY = "services";
const DOC_KEY = "service-documents";

export const useGetServices = (
  params: PaginationParams & { category?: string }
) =>
  useQuery({
    queryKey: [SVC_KEY, params],
    queryFn: () => serviceService.getAllServices(params),
    placeholderData: (prev) => prev,
  });

export const useGetService = (id: string) =>
  useQuery({
    queryKey: [SVC_KEY, "detail", id],
    queryFn: () => serviceService.getService(id),
    enabled: !!id,
  });

export const useGetServiceDocuments = (serviceId: string) =>
  useQuery({
    queryKey: [DOC_KEY, serviceId],
    queryFn: () => serviceService.getDocuments(serviceId),
    enabled: !!serviceId,
  });

export const useCreateService = (onSuccess?: () => void) => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (payload: CreateServicePayload) =>
      serviceService.createService(payload),
    onSuccess: (res) => {
      qc.invalidateQueries({ queryKey: [SVC_KEY] });
      qc.invalidateQueries({ queryKey: ["services"] });
      showToast.success(res.message || "Service created successfully!");
      onSuccess?.();
    },
    onError: (err: any) => {
      showToast.error(err?.response?.data?.error || "Failed to create service");
    },
  });
};

export const useUpdateService = (onSuccess?: () => void) => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({
      id,
      payload,
    }: {
      id: string;
      payload: UpdateServicePayload;
    }) => serviceService.updateService(id, payload),
    onSuccess: (res) => {
      qc.invalidateQueries({ queryKey: [SVC_KEY] });
      showToast.success(res.message || "Service updated successfully!");
      onSuccess?.();
    },
    onError: (err: any) => {
      showToast.error(err?.response?.data?.error || "Failed to update service");
    },
  });
};

export const useDeleteService = () => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (id: string) => serviceService.deleteService(id),
    onSuccess: (res: any) => {
      qc.invalidateQueries({ queryKey: [SVC_KEY] });
      showToast.success(res.message || "Service deleted successfully!");
    },
    onError: (err: any) => {
      showToast.error(err?.response?.data?.error || "Failed to delete service");
    },
  });
};

export const useBulkUpsertDocuments = (
  serviceId: string,
  onSuccess?: () => void
) => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (
      documents: { id?: string; name: string; isRequired: boolean }[]
    ) => serviceService.bulkUpsertDocuments(serviceId, documents),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: [DOC_KEY, serviceId] });
      qc.invalidateQueries({ queryKey: [SVC_KEY, "detail", serviceId] });
      qc.invalidateQueries({ queryKey: [SVC_KEY] });
      onSuccess?.();
    },
    onError: (err: any) => {
      showToast.error(err?.response?.data?.error || "Failed to save documents");
    },
  });
};

export const useDeleteDocument = (serviceId: string) => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (documentId: string) =>
      serviceService.deleteDocument(serviceId, documentId),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: [DOC_KEY, serviceId] });
      showToast.success("Document removed!");
    },
    onError: (err: any) => {
      showToast.error(
        err?.response?.data?.error || "Failed to delete document"
      );
    },
  });
};
