import { useMutation, useQuery } from "@tanstack/react-query";
import { CAM_BASE } from "../utils/config";
import { useEffect } from "react";
import { toast } from "sonner";
import type { BearerTypeFieldType, OptionalBOF2Constants, OptionalBOF2LaneIDs } from "../types/types";

const getDispatcherConfig = async () => {
  const response = await fetch(`${CAM_BASE}/api/fetch-config?id=Dispatcher`);
  if (!response.ok) throw new Error("Cannot get dispatcher configuration");
  return response.json();
};

const updateDispatcherConfig = async (data: BearerTypeFieldType) => {
  const updateConfigPayload = {
    id: "Dispatcher",
    fields: [
      {
        property: "propEnabled",
        value: data.enabled,
      },
      {
        property: "propFormat",
        value: data.format,
      },
    ],
  };
  const response = await fetch(`${CAM_BASE}/api/update-config`, {
    method: "POST",
    body: JSON.stringify(updateConfigPayload),
  });
  if (!response.ok) throw new Error("Cannot update dispatcher configuration");
  return response.json();
};

const updateBackOfficeDispatcher = async (data: OptionalBOF2Constants) => {
  const bof2ContantsPayload = {
    id: "Dispatcher-bof2-constants",
    fields: [
      {
        property: "propFeedIdentifier",
        value: data?.FFID,
      },
      {
        property: "propSourceIdentifier",
        value: data?.SCID,
      },
      {
        property: "propTimeZoneType",
        value: data?.timestampSource,
      },
      {
        property: "propGpsFormat",
        value: data?.GPSFormat,
      },
    ],
  };
  const response = await fetch(`${CAM_BASE}/api/update-config`, {
    method: "POST",
    body: JSON.stringify(bof2ContantsPayload),
  });
  if (!response.ok) throw new Error("Cannot update dispatcher configuration");
  return response.json();
};

const getBof2DispatcherData = async () => {
  const response = await fetch(`${CAM_BASE}/api/fetch-config?id=Dispatcher-bof2-constants`);
  if (!response.ok) throw new Error("Cannot get BOF2 dispatcher config");
  return response.json();
};

const updateBOF2LaneId = async (data: OptionalBOF2LaneIDs) => {
  const bof2LaneIds = {
    id: data?.laneId,
    fields: [
      {
        property: "propLaneID1",
        value: data?.LID1,
      },
      {
        property: "propLaneID2",
        value: data?.LID2,
      },
    ],
  };

  const response = await fetch(`${CAM_BASE}/api/update-config`, {
    method: "post",
    body: JSON.stringify(bof2LaneIds),
  });
  if (!response.ok) throw new Error("cannot send to lane IDs");
  return response.json();
};

const getBOF2LaneId = async () => {
  const response = await fetch(`${CAM_BASE}/api/fetch-config?id=SightingAmmendA-lane-ids`);
  if (!response.ok) throw new Error("Canot get Lane Ids");
  return response.json();
};

export const useCameraOutput = () => {
  const dispatcherQuery = useQuery({
    queryKey: ["dispatcher"],
    queryFn: getDispatcherConfig,
  });

  const dispatcherMutation = useMutation({
    mutationFn: updateDispatcherConfig,
    mutationKey: ["dispatcherUpdate"],
    onError: (error) => toast.error(error.message),
    onSuccess: (data) => {
      if (data) {
        toast.success("Settings successfully updated", { id: "dispatchSettings" });
      }
    },
  });

  const backOfficeDispatcherMutation = useMutation({
    mutationKey: ["backofficedDispatcher"],
    mutationFn: updateBackOfficeDispatcher,
    onSuccess: (data) => {
      if (data) {
        toast.success("Settings successfully updated", { id: "dispatchSettings" });
      }
    },
  });

  const bof2LandMutation = useMutation({
    mutationKey: ["updateBOF2LaneId"],
    mutationFn: updateBOF2LaneId,
  });

  const laneIdQuery = useQuery({
    queryKey: ["getBOF2LaneId"],
    queryFn: getBOF2LaneId,
  });

  useEffect(() => {
    if (dispatcherQuery.isError) toast.error(dispatcherQuery.error.message);
  }, [dispatcherQuery?.error?.message, dispatcherQuery.isError]);

  return {
    dispatcherQuery,
    dispatcherMutation,
    backOfficeDispatcherMutation,
    bof2LandMutation,
    laneIdQuery,
  };
};

export const useGetDispatcherConfig = () => {
  const bof2ConstantsQuery = useQuery({
    queryKey: ["getBof2DispatcherData"],
    queryFn: getBof2DispatcherData,
  });

  return { bof2ConstantsQuery };
};
