import { useMemo } from "react"
import { toast } from "@medusajs/ui"
import { ClientError } from "@mercurjs/client"
import { useFeatureFlag } from "../providers/feature-flag-provider"
import {
  useViewConfigurations as useViewConfigurationsBase,
  useActiveViewConfiguration as useActiveViewConfigurationBase,
  useCreateViewConfiguration as useCreateViewConfigurationBase,
  useUpdateViewConfiguration as useUpdateViewConfigurationBase,
  useDeleteViewConfiguration as useDeleteViewConfigurationBase,
  useSetActiveViewConfiguration as useSetActiveViewConfigurationBase,
} from "./api/views"

// Common error handler
const handleError = (error: Error, message?: string) => {
  let errorMessage = message
  if (!errorMessage) {
    if (error instanceof ClientError) {
      errorMessage = error.message
    } else if (error.message) {
      errorMessage = error.message
    } else {
      errorMessage = "An error occurred"
    }
  }

  toast.error(errorMessage)
}

export const useViewConfigurations = (entity: string) => {
  const isViewConfigEnabled = useFeatureFlag("view_configurations")

  // List views
  const listViews = useViewConfigurationsBase(entity, { limit: 100 }, {
    enabled: isViewConfigEnabled && !!entity,
  })

  // Active view
  const activeView = useActiveViewConfigurationBase(entity, {
    enabled: isViewConfigEnabled && !!entity,
  })

  // Create view mutation
  const createView = useCreateViewConfigurationBase(entity, {
    onSuccess: () => {
      toast.success(`View created`)
    },
    onError: (error) => {
      handleError(error, "Failed to create view")
    },
  })

  // Set active view mutation
  const setActiveView = useSetActiveViewConfigurationBase(entity, {
    onSuccess: () => {
    },
    onError: (error) => {
      handleError(error, "Failed to update active view")
    },
  })
  
  return useMemo(() => ({
    isViewConfigEnabled,
    listViews,
    activeView,
    createView,
    setActiveView,
    isDefaultViewActive: activeView?.is_default_active ?? true,
  }), [
    isViewConfigEnabled,
    listViews,
    activeView,
    createView,
    setActiveView,
  ])
}

// Hook for update/delete operations on a specific view
export const useViewConfiguration = (entity: string, viewId: string) => {
  const updateView = useUpdateViewConfigurationBase(entity, viewId, {
    onSuccess: () => {
      toast.success(`View updated`)
    },
    onError: (error) => {
      handleError(error, "Failed to update view")
    },
  })

  const deleteView = useDeleteViewConfigurationBase(entity, viewId, {
    onSuccess: () => {
      toast.success("View deleted successfully")
    },
    onError: (error) => {
      handleError(error, "Failed to delete view")
    },
  })

  return {
    updateView,
    deleteView,
  }
}
