#!/usr/bin/env node

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

// Import tools
import { listWorkItemsTool, createWorkItemTool, updateWorkItemTool } from "./tools/work-items";
import { listRepositoriesTool, listPullRequestsTool, getRepositoryFileTool, createPullRequestTool } from "./tools/repositories";
import { listProjectsTool } from "./tools/projects";
import { 
    gitCommandTool, 
    cloneRepositoryTool, 
    createBranchTool, 
    pushChangesTool, 
    getRepositoryStatusTool,
    commitChangesTool
} from "./tools/git-commands";
import {
    listBuildPipelinesTool,
    getBuildPipelineDetailsTool,
    listBuildRunsTool,
    listReleasePipelinesTool,
    getReleasePipelineDetailsTool,
    listReleaseRunsTool
} from "./tools/pipelines";
import {
    queryTestCasesTool,
    getTestCaseDetailsTool,
    createTestCaseTool
} from "./tools/test-cases.js";

// FOR TESTING ONLY: Uncomment the following lines to use a specific access token
// import { getAccessToken } from "./utils/token-manager";
// const accessToken = getAccessToken();

// Create server instance
const server = new McpServer({
    name: "azure-devops-mcp-server",
    description: "Azure DevOps MCP Server",
    version: "1.0.0",
    capabilities: {
        resources: {},
        tools: {},
    },
});

// Register tools
server.tool(
    listWorkItemsTool.name,
    listWorkItemsTool.description,
    listWorkItemsTool.parameters,
    listWorkItemsTool.handler
);

server.tool(
    createWorkItemTool.name,
    createWorkItemTool.description,
    createWorkItemTool.parameters,
    createWorkItemTool.handler
);

server.tool(
    updateWorkItemTool.name,
    updateWorkItemTool.description,
    updateWorkItemTool.parameters,
    updateWorkItemTool.handler
);

server.tool(
    listRepositoriesTool.name,
    listRepositoriesTool.description,
    listRepositoriesTool.parameters,
    listRepositoriesTool.handler
);

server.tool(
    listPullRequestsTool.name,
    listPullRequestsTool.description,
    listPullRequestsTool.parameters,
    listPullRequestsTool.handler
);

server.tool(
    getRepositoryFileTool.name,
    getRepositoryFileTool.description,
    getRepositoryFileTool.parameters,
    getRepositoryFileTool.handler
);

server.tool(
    listProjectsTool.name,
    listProjectsTool.description,
    listProjectsTool.parameters,
    listProjectsTool.handler
);

server.tool(
    createPullRequestTool.name,
    createPullRequestTool.description,
    createPullRequestTool.parameters,
    createPullRequestTool.handler
);

// Register Git commands tools
server.tool(
    gitCommandTool.name,
    gitCommandTool.description,
    gitCommandTool.parameters,
    gitCommandTool.handler
);

server.tool(
    cloneRepositoryTool.name,
    cloneRepositoryTool.description,
    cloneRepositoryTool.parameters,
    cloneRepositoryTool.handler
);

server.tool(
    createBranchTool.name,
    createBranchTool.description,
    createBranchTool.parameters,
    createBranchTool.handler
);

server.tool(
    pushChangesTool.name,
    pushChangesTool.description,
    pushChangesTool.parameters,
    pushChangesTool.handler
);

server.tool(
    getRepositoryStatusTool.name,
    getRepositoryStatusTool.description,
    getRepositoryStatusTool.parameters,
    getRepositoryStatusTool.handler
);

server.tool(
    commitChangesTool.name,
    commitChangesTool.description,
    commitChangesTool.parameters,
    commitChangesTool.handler
);

// Register pipeline tools
server.tool(
    listBuildPipelinesTool.name,
    listBuildPipelinesTool.description,
    listBuildPipelinesTool.parameters,
    listBuildPipelinesTool.handler
);

server.tool(
    getBuildPipelineDetailsTool.name,
    getBuildPipelineDetailsTool.description,
    getBuildPipelineDetailsTool.parameters,
    getBuildPipelineDetailsTool.handler
);

server.tool(
    listBuildRunsTool.name,
    listBuildRunsTool.description,
    listBuildRunsTool.parameters,
    listBuildRunsTool.handler
);

server.tool(
    listReleasePipelinesTool.name,
    listReleasePipelinesTool.description,
    listReleasePipelinesTool.parameters,
    listReleasePipelinesTool.handler
);

server.tool(
    getReleasePipelineDetailsTool.name,
    getReleasePipelineDetailsTool.description,
    getReleasePipelineDetailsTool.parameters,
    getReleasePipelineDetailsTool.handler
);

server.tool(
    listReleaseRunsTool.name,
    listReleaseRunsTool.description,
    listReleaseRunsTool.parameters,
    listReleaseRunsTool.handler
);

// Register test case tools
server.tool(
    queryTestCasesTool.name,
    queryTestCasesTool.description,
    queryTestCasesTool.parameters,
    queryTestCasesTool.handler
);

server.tool(
    getTestCaseDetailsTool.name,
    getTestCaseDetailsTool.description,
    getTestCaseDetailsTool.parameters,
    getTestCaseDetailsTool.handler
);

server.tool(
    createTestCaseTool.name,
    createTestCaseTool.description,
    createTestCaseTool.parameters,
    createTestCaseTool.handler
);

// Start the server
async function main() {
    try {
        const transport = new StdioServerTransport();
        await server.connect(transport);
        console.error("Azure DevOps MCP Server running on stdio");
    } catch (error) {
        console.error("Error starting server:", error);
        process.exit(1);
    }
}

main();
