"use client"

import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import { User } from "@/lib/types"
import { useClerk } from "@clerk/nextjs"
import {
  Crown,
  LayoutDashboard,
  LogOut,
  Sparkles,
  User as UserIcon,
} from "lucide-react"
import Link from "next/link"

import { useRouter } from "next/navigation"
import { useEffect, useState } from "react"
import Avatar from "./avatar"
import { Button } from "./button"
import { TIERS } from "@/lib/tiers"

// TODO: Remove this once we have a proper tier system
const TIER_INFO = {
  FREE: {
    color: "text-gray-500",
    icon: Sparkles,
    limit: TIERS.FREE.generations,
  },
  PRO: {
    color: "text-blue-500",
    icon: Crown,
    limit: TIERS.PRO.generations,
  },
  ENTERPRISE: {
    color: "text-purple-500",
    icon: Crown,
    limit: TIERS.ENTERPRISE.generations,
  },
} as const

export default function UserButton({
  userData: initialUserData,
}: {
  userData: User
}) {
  const [userData, setUserData] = useState<User>(initialUserData)
  const [isOpen, setIsOpen] = useState(false)
  const { signOut } = useClerk()
  const router = useRouter()

  const fetchUserData = async () => {
    try {
      const res = await fetch(
        `${process.env.NEXT_PUBLIC_DATABASE_WORKER_URL}/api/user?id=${userData.id}`,
        {
          headers: {
            Authorization: `${process.env.NEXT_PUBLIC_WORKERS_KEY}`,
          },
          cache: "no-store",
        }
      )
      if (res.ok) {
        const updatedUserData = await res.json()
        setUserData(updatedUserData)
      }
    } catch (error) {
      console.error("Failed to fetch user data:", error)
    }
  }

  useEffect(() => {
    if (isOpen) {
      fetchUserData()
    }
  }, [isOpen])

  const tierInfo =
    TIER_INFO[userData.tier as keyof typeof TIER_INFO] || TIER_INFO.FREE
  const TierIcon = tierInfo.icon
  const usagePercentage = Math.floor(
    ((userData.generations || 0) * 100) / tierInfo.limit
  )

  const handleUpgrade = async () => {
    router.push(`/@${userData.username}`)
  }

  return (
    <DropdownMenu open={isOpen} onOpenChange={setIsOpen}>
      <DropdownMenuTrigger>
        <Avatar name={userData.name} avatarUrl={userData.avatarUrl} />
      </DropdownMenuTrigger>
      <DropdownMenuContent className="w-64" align="end">
        <div className="py-1.5 px-2 w-full">
          <div className="font-medium">{userData.name}</div>
          <div className="text-sm w-full overflow-hidden text-ellipsis whitespace-nowrap text-muted-foreground">
            {userData.email}
          </div>
        </div>

        <DropdownMenuSeparator />

        <DropdownMenuItem className="cursor-pointer" asChild>
          <Link href={"/dashboard"}>
            <LayoutDashboard className="mr-2 size-4" />
            <span>Dashboard</span>
          </Link>
        </DropdownMenuItem>
        <DropdownMenuSeparator />
        <DropdownMenuItem className="cursor-pointer" asChild>
          <Link href={`/@${userData.username}`}>
            <UserIcon className="mr-2 size-4" />
            <span>Profile</span>
          </Link>
        </DropdownMenuItem>
        <DropdownMenuSeparator />

        <div className="py-1.5 px-2 w-full">
          <div className="flex items-center justify-between">
            <div className="flex items-center gap-1.5">
              <TierIcon className={`h-4 w-4 ${tierInfo.color}`} />
              <span className="text-sm font-medium">
                {userData.tier || "FREE"} Plan
              </span>
            </div>
            {(userData.tier === "FREE" || userData.tier === "PRO") && (
              <Button
                variant="ghost"
                size="sm"
                className="h-7 text-xs border-b hover:border-b-foreground"
                onClick={handleUpgrade}
              >
                Upgrade
              </Button>
            )}
          </div>
        </div>

        <DropdownMenuSeparator />
        <div className="px-2 py-1.5">
          <div className="w-full">
            <div className="flex items-center justify-between text-sm text-muted-foreground mb-2">
              <span>AI Usage</span>
              <span>
                {userData.generations}/{tierInfo.limit}
              </span>
            </div>

            <div className="rounded-full w-full h-2 overflow-hidden bg-secondary mb-1">
              <div
                className={`h-full rounded-full transition-all duration-300 ${
                  usagePercentage > 90
                    ? "bg-red-500"
                    : usagePercentage > 75
                    ? "bg-yellow-500"
                    : tierInfo.color.replace("text-", "bg-")
                }`}
                style={{
                  width: `${Math.min(usagePercentage, 100)}%`,
                }}
              />
            </div>
          </div>
        </div>
        <DropdownMenuSeparator />

        {/* <DropdownMenuItem className="cursor-pointer">
          <Pencil className="mr-2 size-4" />
          <span>Edit Profile</span>
        </DropdownMenuItem> */}
        <DropdownMenuItem
          onClick={() => signOut(() => router.push("/"))}
          className="!text-destructive cursor-pointer"
        >
          <LogOut className="mr-2 size-4" />
          <span>Log Out</span>
        </DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  )
}
