import { describe, it, expect } from "bun:test"
import { generateProvidersContent } from "../../next-templates/providers"
import type { Chain } from "../../types"

describe("Next.js Providers Generation", () => {
	const mockChains: Chain[] = [
		{
			name: "Ethereum",
			package: "@dynamic-labs/ethereum",
			connector: "EthereumWalletConnectors",
		},
		{
			name: "Solana",
			package: "@dynamic-labs/solana",
			connector: "SolanaWalletConnectors",
		},
	]

	describe("Ethereum with Viem", () => {
		it("should generate correct provider imports", () => {
			const content = generateProvidersContent(true, [mockChains[0]])

			// Check for core imports
			expect(content).toContain(
				'import { DynamicContextProvider } from "@dynamic-labs/sdk-react-core"'
			)
			expect(content).toContain('import { WagmiProvider } from "wagmi"')
			expect(content).toContain(
				'import { QueryClient, QueryClientProvider } from "@tanstack/react-query"'
			)
			expect(content).toContain(
				'import { DynamicWagmiConnector } from "@dynamic-labs/wagmi-connector"'
			)
			expect(content).toContain('import { config } from "@/lib/wagmi"')

			// Check for chain-specific imports
			expect(content).toContain(
				'import { EthereumWalletConnectors } from "@dynamic-labs/ethereum"'
			)
			expect(content).not.toContain("import { SolanaWalletConnectors }")
		})

		it("should include proper environment configuration", () => {
			const content = generateProvidersContent(true, [mockChains[0]])
			expect(content).toContain("process.env.NEXT_PUBLIC_DYNAMIC_ENV_ID")
		})
	})

	describe("Ethereum with Ethers", () => {
		it("should generate correct provider imports", () => {
			const content = generateProvidersContent(false, [mockChains[0]])

			// Check for core imports
			expect(content).toContain(
				'import { DynamicContextProvider } from "@dynamic-labs/sdk-react-core"'
			)
			expect(content).not.toContain("import { WagmiProvider }")

			// Check for chain-specific imports
			expect(content).toContain(
				'import { EthereumWalletConnectors } from "@dynamic-labs/ethereum"'
			)
			expect(content).not.toContain("import { SolanaWalletConnectors }")
		})

		it("should include proper environment configuration", () => {
			const content = generateProvidersContent(false, [mockChains[0]])
			expect(content).toContain("process.env.NEXT_PUBLIC_DYNAMIC_ENV_ID")
		})
	})

	describe("Multiple Chains", () => {
		it("should include all configured chains", () => {
			const content = generateProvidersContent(true, mockChains)

			// Check for chain configuration
			expect(content).toContain("EthereumWalletConnectors")
			expect(content).toContain("SolanaWalletConnectors")
		})

		it("should include proper provider structure", () => {
			const content = generateProvidersContent(true, mockChains)

			// Check for provider structure
			expect(content).toContain("export default function Providers")
			expect(content).toContain("const queryClient = new QueryClient()")
			expect(content).toContain("<WagmiProvider config={config}>")
			expect(content).toContain("<QueryClientProvider client={queryClient}>")
			expect(content).toContain("<DynamicWagmiConnector>")
		})

		it("should include theme configuration", () => {
			const content = generateProvidersContent(true, mockChains)

			// Check for theme configuration
			expect(content).toContain('theme="auto"')
		})
	})
})
