import { configToGraph } from "./config.js";
import { Config } from "./types.js";
import { Network } from "./graph.js";
import { GithubRepository } from "./github.js";

describe("configToGraph", () => {
	it("should create a simple graph from a basic service configuration", () => {
		const config: Config = {
			service: [
				{
					nodeId: "service-1",
					name: "my-app",
					type: "nodejs:24.0.2",
					source: {
						repository: "git@github.com:user/repo.git",
						branch: "main",
						rootDir: "/",
					},
					ports: [{ name: "http", value: 3000, protocol: "TCP" }],
				},
			],
		};

		const networks: Network[] = [
			{
				name: "Public",
				domain: "v1.dodo.cloud",
				hasAuth: true,
			},
		];

		const repos: GithubRepository[] = [
			{
				id: 123,
				name: "repo",
				full_name: "user/repo",
				html_url: "https://github.com/user/repo",
				ssh_url: "git@github.com:user/repo.git",
			},
		];

		const graph = configToGraph(config, networks, repos);

		// Expect one service node, one repo node, and one network node
		expect(graph.nodes).toHaveLength(3);

		const serviceNode = graph.nodes.find((n) => n.type === "app");
		expect(serviceNode).toBeDefined();
		expect(serviceNode?.data.label).toBe("my-app");

		const repoNode = graph.nodes.find((n) => n.type === "github");
		expect(repoNode).toBeDefined();
		expect(repoNode?.data.repository?.sshURL).toBe("git@github.com:user/repo.git");

		const networkNode = graph.nodes.find((n) => n.type === "network");
		expect(networkNode).toBeDefined();
		expect(networkNode?.data.domain).toBe("v1.dodo.cloud");

		// Expect one edge from repo to service
		expect(graph.edges).toHaveLength(1);
		const repoEdge = graph.edges.find((e) => e.source === repoNode?.id && e.target === serviceNode?.id);
		expect(repoEdge).toBeDefined();
		console.log(JSON.stringify(graph, null, 2));
	});
});
