import { useState, useEffect } from "react"
import { useAccount } from "wagmi"
import axios from "axios"
import { SWELL_CHAIN_ID } from "@/constants"
import {
  RewardsState,
  ActivationState,
  FlowState,
  MerklRewardsResponse,
  SwellSubscriptionResponse,
  RewardsAmount,
} from "@/components/swell/types"
import { HARDCODED_REGISTRY_ID } from "@/pages/swell-reward"
import { API_KEY, API_URL } from "@/components/swell/components/ActivatedState"

const WSWELL_TOKEN_ADDRESS = "0xda1F8EA667dc5600F5f654DF44b47F1639a83DD1"

const fetchMerklRewards = async (
  address: string,
): Promise<MerklRewardsResponse> => {
  try {
    const response = await axios.get<MerklRewardsResponse>(
      `https://api.merkl.xyz/v3/rewards?user=${address}&chainIds=${SWELL_CHAIN_ID}`,
      {
        headers: {
          "x-api-key": API_KEY,
          "Content-Type": "application/json",
        },
      },
    )
    return response.data
  } catch (error) {
    console.error("Error fetching Merkl rewards:", error)
    throw error
  }
}

const fetchRewardsStatus = async (
  address: string,
): Promise<{
  status: "activated" | "not_active"
  automationAccount: string
}> => {
  try {
    const response = await axios.get<SwellSubscriptionResponse>(
      `${API_URL}/automations/subscriptions/owner/${address}/${HARDCODED_REGISTRY_ID}`,
      {
        headers: {
          "x-api-key": API_KEY,
          "Content-Type": "application/json",
        },
      },
    )

    console.log("response for fetch rewards statu", response.data)

    return response.data.data.length > 0
      ? {
          status: "activated",
          automationAccount: response.data.data[0].subAccountAddress,
        }
      : {
          status: "not_active",
          automationAccount: "",
        }
  } catch (error) {
    console.error("Error fetching rewards status:", error)
    return {
      status: "not_active",
      automationAccount: "",
    }
  }
}

const checkUserEligibility = (rewards: MerklRewardsResponse): boolean => {
  const chainData = rewards[SWELL_CHAIN_ID]
  if (!chainData?.tokenData?.[WSWELL_TOKEN_ADDRESS]) {
    return false
  }

  const unclaimedAmount = chainData.tokenData[WSWELL_TOKEN_ADDRESS].unclaimed
  return BigInt(unclaimedAmount) > BigInt(0)
}

export function useRewardsStatus() {
  const { address } = useAccount()
  const [rewardsState, setRewardsState] =
    useState<RewardsState>("non_connected")
  const [automationAccount, setAutomationAccount] = useState<string>("")
  const [rewardsAmount, setRewardsAmount] = useState<RewardsAmount>({
    total: "0",
    unclaimed: "0",
    decimals: 18,
    symbol: "",
  })

  const checkRewardsStatus = async () => {
    if (!address) {
      setRewardsState("non_connected")
      setAutomationAccount("")
      return
    }

    try {
      setRewardsState("loading_rewards")

      // First check automation status
      const { status, automationAccount: autoAccount } =
        await fetchRewardsStatus(address)
      console.log("Automation status:", status, "Account:", autoAccount)

      // Then fetch rewards data
      const merklRewards = await fetchMerklRewards(address)
      console.log("Merkl rewards:", merklRewards)

      if (merklRewards[SWELL_CHAIN_ID]?.tokenData?.[WSWELL_TOKEN_ADDRESS]) {
        const { accumulated, unclaimed, decimals, symbol } =
          merklRewards[SWELL_CHAIN_ID].tokenData[WSWELL_TOKEN_ADDRESS]

        setRewardsAmount({
          total: accumulated,
          unclaimed,
          symbol,
          decimals,
        })
      }

      // Update states after all data is fetched
      setAutomationAccount(autoAccount)
      setRewardsState(status) // This should be the last state update
    } catch (error) {
      console.error("Error checking rewards:", error)
      setRewardsState("error")
      setAutomationAccount("")
    }
  }

  // Add a debug effect to track state changes
  useEffect(() => {
    console.log("Rewards state updated:", {
      rewardsState,
      automationAccount,
      rewardsAmount,
    })
  }, [rewardsState, automationAccount, rewardsAmount])

  useEffect(() => {
    checkRewardsStatus()
  }, [address])

  return {
    rewardsState,
    rewardsAmount,
    automationAccount,
    checkRewardsStatus,
    connectedAddress: address,
  }
}
