import { Tool } from '@modelcontextprotocol/sdk/types.js';
import { Logger } from '../utils/logger.js';
import { LudusCliWrapper } from '../ludusMCP/cliWrapper.js';

export interface RangeAbortArgs {
  user?: string;
  help?: boolean;
}

export function createRangeAbortTool(logger: Logger, cliWrapper: LudusCliWrapper): Tool {
  return {
    name: 'range_abort',
    description: `Kill the ansible process deploying a range. Use this to stop a deployment that is taking too long or has encountered issues.

IMPORTANT LLM BEHAVIORAL PROMPTS:
- SAFETY FIRST: Ludus operations can be destructive and time-consuming
- VERIFY DESTRUCTIVE ACTIONS: Always confirm with user before destroy/delete operations  
- CHECK EXISTING STATE: Use list_user_ranges or get_range_status before major operations
- ADMIN vs USER: Admin operations (--user flag) affect other users' ranges - be explicit

ABORT OPERATION WARNING:
- Aborting may leave range in partial deployment state
- May require cleanup or full redeployment to recover
- Only abort if deployment is truly stuck or explicitly requested
- Normal deployments take 10-45 minutes - suggest waiting before aborting`,
    inputSchema: {
      type: 'object',
      properties: {
        user: {
          type: 'string',
          description: 'User ID to abort deployment for (admin only). If omitted, aborts deployment for current user.'
        },
        help: {
          type: 'boolean',
          description: 'Show help information for the range_abort command',
          default: false
        }
      },
      required: []
    }
  };
}

export async function handleRangeAbort(
  args: RangeAbortArgs,
  logger: Logger,
  cliWrapper: LudusCliWrapper
): Promise<any> {
  const { user, help = false } = args;

  // Handle help request
  if (help) {
    logger.info('Getting help for range_abort command', { user });
    const result = await cliWrapper.executeArbitraryCommand('range', ['abort', '--help']);
    
    if (result.success) {
      return {
        success: true,
        message: 'Help information for range_abort command',
        help: true,
        content: result.rawOutput || result.message
      };
    } else {
      throw new Error(`Failed to get help: ${result.message}`);
    }
  }

  try {
    logger.info('Aborting range deployment', { user });

    const result = await cliWrapper.abortRange(user);

    if (!result.success) {
      throw new Error(`Failed to abort range deployment: ${result.message}`);
    }

    const targetUser = user || 'current user';
    
    return {
      success: true,
      message: `Range deployment aborted for ${targetUser}`,
      user: targetUser,
      result: result.data,
      rawOutput: result.rawOutput
    };
  } catch (error: any) {
    logger.error('Range abort failed', { error: error.message, user });
    throw error;
  }
} 