import "server-only"

import { registryItemSchema } from "shadcn/schema"

import { BASES, getThemesForBaseColor, type BaseName } from "@/registry/config"
import {
  ALLOWED_ITEM_TYPES,
  EXCLUDED_ITEMS,
} from "@/app/(app)/(create)/lib/constants"

export async function getItemsForBase(base: BaseName) {
  const { Index } = await import("@/registry/bases/__index__")
  const index = Index[base]

  if (!index) {
    return []
  }

  return Object.values(index).filter(
    (item) =>
      ALLOWED_ITEM_TYPES.includes(item.type) &&
      !EXCLUDED_ITEMS.includes(item.name)
  )
}

export async function getBaseItem(name: string, base: BaseName) {
  const { Index } = await import("@/registry/bases/__index__")
  const index = Index[base]

  if (!index?.[name] || EXCLUDED_ITEMS.includes(name)) {
    return null
  }

  return registryItemSchema.parse(index[name])
}

export async function getBaseComponent(name: string, base: BaseName) {
  const { Index } = await import("@/registry/bases/__index__")
  const index = Index[base]

  if (!index?.[name] || EXCLUDED_ITEMS.includes(name)) {
    return null
  }

  const { getComponent } = await import("@/registry/bases/__components__")
  return getComponent(base, name) ?? null
}

export async function getAllItems() {
  const entries = await Promise.all(
    BASES.map(async (base) => {
      const items = await getItemsForBase(base.name as BaseName)
      const filtered: Pick<
        NonNullable<(typeof items)[number]>,
        "name" | "title" | "type"
      >[] = []
      for (const item of items) {
        if (item !== null && !/\d+$/.test(item.name)) {
          filtered.push({
            name: item.name,
            title: item.title,
            type: item.type,
          })
        }
      }
      return [base.name, filtered] as const
    })
  )
  return Object.fromEntries(entries)
}

// Re-export for server-side use.
export { getThemesForBaseColor }
