import { BaseContextProvider } from "../index.js";
function splitPath(path, withRoot) {
    let parts = path.includes("/") ? path.split("/") : path.split("\\");
    if (withRoot !== undefined) {
        const rootParts = splitPath(withRoot);
        parts = parts.slice(rootParts.length - 1);
    }
    return parts;
}
function formatFileTree(tree, indentation = "") {
    let result = "";
    for (const file of tree.files) {
        result += `${indentation}${file}\n`;
    }
    for (const directory of tree.directories) {
        result += `${indentation}${directory.name}/\n`;
        result += formatFileTree(directory, `${indentation}  `);
    }
    return result;
}
class FileTreeContextProvider extends BaseContextProvider {
    static description = {
        title: "tree",
        displayTitle: "File Tree",
        description: "Attach a representation of the file tree",
        type: "normal",
    };
    async getContextItems(query, extras) {
        const workspaceDirs = await extras.ide.getWorkspaceDirs();
        const trees = [];
        for (const workspaceDir of workspaceDirs) {
            const contents = await extras.ide.listWorkspaceContents(workspaceDir);
            const subDirTree = {
                name: splitPath(workspaceDir).pop() ?? "",
                files: [],
                directories: [],
            };
            for (const file of contents) {
                const parts = splitPath(file, workspaceDir);
                let currentTree = subDirTree;
                for (const part of parts.slice(0, -1)) {
                    if (!currentTree.directories.some((d) => d.name === part)) {
                        currentTree.directories.push({
                            name: part,
                            files: [],
                            directories: [],
                        });
                    }
                    currentTree = currentTree.directories.find((d) => d.name === part);
                }
                currentTree.files.push(parts.pop());
            }
            trees.push(formatFileTree(subDirTree));
        }
        return [
            {
                content: `Here is a file tree of the current workspace:\n\n${trees.join("\n\n")}`,
                name: "File Tree",
                description: "File Tree",
            },
        ];
    }
}
export default FileTreeContextProvider;
