import { Tool } from '@modelcontextprotocol/sdk/types.js';
import { Logger } from '../utils/logger.js';
import { LudusCliWrapper } from '../ludusMCP/cliWrapper.js';

export interface DestroyRangeArgs {
  user?: string;
  noPrompt?: boolean;
  help?: boolean;
}

export function createDestroyRangeTool(logger: Logger, cliWrapper: LudusCliWrapper): Tool {
  return {
    name: 'destroy_range',
    description: `Destroy a Ludus range, permanently removing all VMs and freeing resources. This action is irreversible and will delete all data.

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
- DESTRUCTION IS PERMANENT: Destroying ranges deletes all VMs and data irreversibly
- ADMIN vs USER: Admin operations (--user flag) affect other users' ranges - be explicit

DESTRUCTIVE OPERATION WARNING:
- This operation permanently deletes resources and cannot be undone
- Confirm user intent explicitly before proceeding
- Suggest checking range status first to show what will be affected
- Explain the time commitment and impact of the operation`,
    inputSchema: {
      type: 'object',
      properties: {
        user: {
          type: 'string',
          description: 'User ID to destroy range for (admin only). If omitted, destroys range for current user.'
        },
        noPrompt: {
          type: 'boolean',
          description: 'Skip the confirmation prompt when destroying the range',
          default: false
        },
        help: {
          type: 'boolean',
          description: 'Show help information for the destroy_range command',
          default: false
        }
      },
      required: []
    }
  };
}

export async function handleDestroyRange(
  args: DestroyRangeArgs,
  logger: Logger,
  cliWrapper: LudusCliWrapper
): Promise<any> {
  const { user, noPrompt = false, help = false } = args;

  // Handle help request
  if (help) {
    logger.info('Getting help for destroy range command', { user, noPrompt });
    const result = await cliWrapper.executeArbitraryCommand('range', ['rm', '--help']);
    
    if (result.success) {
      return {
        success: true,
        message: 'Help information for ludus range rm command',
        help: true,
        content: result.rawOutput || result.message
      };
    } else {
      throw new Error(`Failed to get help: ${result.message}`);
    }
  }

  // Execute the destroy range command
  logger.info('Executing destroy range command', { user, noPrompt });

  try {
    const destroyResult = await cliWrapper.destroyRange(user, noPrompt);
    
    if (destroyResult.success) {
      logger.info('Destroy range command completed successfully', { 
        user: user || 'current user',
        result: destroyResult.message 
      });
      
      return {
        success: true,
        message: destroyResult.message,
        data: destroyResult.data,
        rawOutput: destroyResult.rawOutput,
        user: user || 'current user',
        operation: 'destroy_range',
        timestamp: new Date().toISOString()
      };
    } else {
      logger.error('Destroy range command failed', { 
        user: user || 'current user',
        error: destroyResult.message 
      });
      
      return {
        success: false,
        message: `Failed to destroy range: ${destroyResult.message}`,
        error: destroyResult.message,
        user: user || 'current user',
        operation: 'destroy_range',
        timestamp: new Date().toISOString()
      };
    }
  } catch (error) {
    const errorMessage = error instanceof Error ? error.message : String(error);
    logger.error('Exception during destroy range operation', { 
      user: user || 'current user',
      error: errorMessage 
    });
    
    throw new Error(`Destroy range operation failed: ${errorMessage}`);
  }
} 