"use client"
import { useMutation, useQuery } from "@tanstack/react-query"
import { signUpQueryKey, signUp, signInQueryKey, signIn, profileQueryKey, fetchUserProfile, uploadProfileImage, forgotPasswordQueryKey, forgotPassword, verifyOtpQueryKey, verifyOtp, updateProfileInfo } from "../queries/auth"
import type { SignUpPayload, LoginPayload, ForgotPasswordPayload, VerifyOtpPayload } from "@/types/auth"
import { useToaster } from "@/context/ToasterContext"
import Cookies from "js-cookie"
import { useRouter } from "next/navigation"
import { useAuth } from "@/context/AuthContext"
import type { AxiosError } from "axios"
import { queryClient } from "../client"

export function useSignUp() {
  const toast = useToaster()
  return useMutation({
    mutationKey: signUpQueryKey,
    mutationFn: (payload: SignUpPayload) => signUp(payload),
    onSuccess: data => {
      // Note: Sign-up typically doesn't set token until email verification
      // If your API returns a token on sign-up, uncomment below:
      // if (data?.token) {
      //   Cookies.set("iit_token", data.token, { expires: 7, secure: true })
      // }
      toast.showSuccess(data?.message || "Sign up successful. Please check your email to verify your account!")
    },
    onError: (error: AxiosError) => {
      console.error("Sign-up failed:", error)
      const errorMessage = (error.response?.data as any)?.message || error.message || "Sign Up failed. Please try again."
      toast.showError(errorMessage)
    }
  })
}

export function useSignIn() {
  const toast = useToaster()
  const router = useRouter()
  const { updateToken } = useAuth()
  return useMutation({
    mutationKey: signInQueryKey,
    mutationFn: (payload: LoginPayload) => signIn(payload),
    onSuccess: data => {
      if (data?.token) {
        Cookies.set("iit_token", data.token, { expires: 7, secure: true })
        // Update token in AuthContext to trigger profile fetch
        updateToken(data.token)
      }
      // toast.showSuccess(data?.message || "Sign in successful. Welcome back!")
      router.push("/dashboard")
    },
    onError: (error: AxiosError) => {
      console.error("Sign-in failed:", error.response)
      const errorMessage =
        (error.response?.data as any)?.message || error.message || "Sign In failed. Please check your credentials and try again."
      toast.showError(errorMessage)
    }
  })
}

export function useProfile() {
  return useQuery({
    queryKey: profileQueryKey,
    queryFn: fetchUserProfile,
    refetchOnWindowFocus: false,
    enabled: false // Will be controlled by AuthProvider
  })
}

export function useUpdateProfileImage() {
  const toast = useToaster()
  return useMutation({
    mutationFn: (imageData: FormData) => uploadProfileImage(imageData),
    onSuccess: data => {
      toast.showSuccess("Profile image updated successfully!")
      // Invalidate profile query to refetch updated data
      queryClient.invalidateQueries({ queryKey: profileQueryKey })
    },
    onError: (error: AxiosError) => {
      console.error("Profile image upload failed:", error)
      const errorMessage = (error.response?.data as any)?.message || error.message || "Failed to update profile image. Please try again."
      toast.showError(errorMessage)
    }
  })
}

export function useForgotPassword() {
  const toast = useToaster()
  return useMutation({
    mutationKey: forgotPasswordQueryKey,
    mutationFn: (payload: ForgotPasswordPayload) => forgotPassword(payload),
    onSuccess: data => {
      toast.showSuccess(data?.message || "OTP sent to your email address!")
    },
    onError: (error: AxiosError) => {
      console.error("Forgot password request failed:", error)
      const errorMessage = (error.response?.data as any)?.message || error.message || "Failed to send OTP. Please try again."
      toast.showError(errorMessage)
    }
  })
}



export function useVerifyOtp() {
  const toast = useToaster()
  const router = useRouter()
  return useMutation({
    mutationKey: verifyOtpQueryKey,
    mutationFn: (payload: VerifyOtpPayload) => verifyOtp(payload),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Password reset successfully!")
      router.push("/sign-in")
    },
    onError: (error: AxiosError) => {
      console.error("OTP verification failed:", error)
      const errorMessage = (error.response?.data as any)?.message || error.message || "Invalid OTP or password reset failed. Please try again."
      toast.showError(errorMessage)
    }
  })
}

export function useUpdateProfileInfo() {
  const toast = useToaster()
  return useMutation({
    mutationFn: (payload: any) => updateProfileInfo(payload),
    onSuccess: data => {
      toast.showSuccess("Profile updated successfully!")
      queryClient.invalidateQueries({ queryKey: profileQueryKey })
    },
    onError: (error: AxiosError) => {
      console.error("Profile info update failed:", error)
      const errorMessage = (error.response?.data as any)?.message || error.message || "Failed to update profile. Please try again."
      toast.showError(errorMessage)
    }
  })
}
