import type { Argv } from 'yargs'
import { tools } from '../lib/tools/tools'
import { logger } from '../'
import { ListCommandSchema } from '../zod_schemas'
import { sync as write } from '@plastichub/fs/write'
import { toYargs } from '@plastichub/osr-commons'
export const options = (yargs: Argv) => toYargs(yargs, ListCommandSchema)
export const list = async (argv: any, options?: any) => {
    const fsTools = tools.fs(process.cwd(), options)
    const npmTools = tools.npm(process.cwd(), options)
    const gitTools = tools.git(process.cwd(), options)
    const terminalTools = tools.terminal(process.cwd(), options)
    const toolsList = {
        fs: fsTools.map(tool => ({
            name: tool.function.name,
            description: tool.function.description,
            category: 'fs'
        })),
        npm: npmTools.map(tool => ({
            name: tool.function.name,
            description: tool.function.description,
            category: 'npm'
        })),
        git: gitTools.map(tool => ({
            name: tool.function.name,
            description: tool.function.description,
            category: 'git'
        })),
        terminal: terminalTools.map(tool => ({
            name: tool.function.name,
            description: tool.function.description,
            category: 'terminal'
        }))
    };

    logger.info('Available Tools:\n');

    logger.info('Filesystem Tools:');
    fsTools.forEach(tool => {
        logger.info(`  ${tool.function.name}: ${tool.function.description}`);
    });

    logger.info('\nNPM Tools:');
    npmTools.forEach(tool => {
        logger.info(`  ${tool.function.name}: ${tool.function.description}`);
    });

    logger.info('\nGit Tools:');
    gitTools.forEach(tool => {
        logger.info(`  ${tool.function.name}: ${tool.function.description}`);
    });

    logger.info('\nTerminal Tools:');
    terminalTools.forEach(tool => {
        logger.info(`  ${tool.function.name}: ${tool.function.description}`);
    });

    if (argv.output) {
        logger.info(`\nWriting tools list to ${argv.output}`);
        write(argv.output, JSON.stringify(toolsList, null, 2));
    }
};