/**
 * Shutdown Command Extension
 *
 * Adds a /quit command that allows extensions to trigger clean shutdown.
 * Demonstrates how extensions can use ctx.shutdown() to exit shortcut cleanly.
 */

import { Type } from '@sinclair/typebox';
import type { ExtensionAPI } from 'shortcutxl/app';

export default function (shortcut: ExtensionAPI) {
  // Register a /quit command that cleanly exits shortcut
  shortcut.registerCommand('quit', {
    description: 'Exit shortcut cleanly',
    handler: async (_args, ctx) => {
      ctx.shutdown();
    }
  });

  // You can also create a tool that shuts down after completing work
  shortcut.registerTool({
    name: 'finish_and_exit',
    label: 'Finish and Exit',
    description: 'Complete a task and exit shortcut',
    parameters: Type.Object({}),
    async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {
      // Do any final work here...
      // Request graceful shutdown (deferred until agent is idle)
      ctx.shutdown();

      // This return is sent to the LLM before shutdown occurs
      return {
        content: [{ type: 'text', text: 'Shutdown requested. Exiting after this response.' }],
        details: {}
      };
    }
  });

  // You could also create a more complex tool with parameters
  shortcut.registerTool({
    name: 'deploy_and_exit',
    label: 'Deploy and Exit',
    description: 'Deploy the application and exit shortcut',
    parameters: Type.Object({
      environment: Type.String({ description: 'Target environment (e.g., production, staging)' })
    }),
    async execute(_toolCallId, params, _signal, onUpdate, ctx) {
      onUpdate?.({
        content: [{ type: 'text', text: `Deploying to ${params.environment}...` }],
        details: {}
      });

      // Example deployment logic
      // const result = await shortcut.exec("npm", ["run", "deploy", params.environment], { signal });

      // On success, request graceful shutdown
      onUpdate?.({
        content: [{ type: 'text', text: 'Deployment complete, exiting...' }],
        details: {}
      });
      ctx.shutdown();

      return {
        content: [{ type: 'text', text: 'Done! Shutdown requested.' }],
        details: { environment: params.environment }
      };
    }
  });
}
