import { Injectable } from '@nestjs/common';
import { ToolExecutionResult, ToolDefinition, ToolContext } from './tool.types';
import { EverdigmMailClient } from '../../outbound/everdigm-mail/everdigm-mail.client';

type EverdigmSpamActionArgs = {
  mode?: string;
  action?: string;
  mids?: string;
  mid?: string;
  isspamdb?: string;
};

@Injectable()
export class EverdigmMailSpamActionUsecase {
  constructor(private readonly everdigmMailClient: EverdigmMailClient) {}

  definition(): ToolDefinition {
    return {
      name: 'everdigm_mail.spam_action',
      description:
        'Submit spam action (pass/deny/new) for Everdigm mail. Accepts mode or action.',
      inputSchema: {
        type: 'object',
        properties: {
          mode: {
            type: 'string',
            description: 'Mode value: p, d, n. Alternative to action.',
          },
          action: {
            type: 'string',
            description: 'Action value: pass, deny, new. Alternative to mode.',
          },
          mid: { type: 'string', description: 'Single mid value.' },
          mids: { type: 'string', description: 'Comma-separated mid list.' },
          isspamdb: { type: 'string', description: 'y or n. Defaults to y.' },
        },
        additionalProperties: false,
      },
      handler: async (args, context) => this.execute(args, context),
    };
  }

  async execute(args: unknown, _context: ToolContext): Promise<ToolExecutionResult> {
    const typedArgs = (args ?? {}) as EverdigmSpamActionArgs;
    const mids = (typedArgs.mids ?? typedArgs.mid ?? '').trim();

    try {
      const payload = await this.everdigmMailClient.submitSpamAction({
        mode: typedArgs.mode,
        action: typedArgs.action,
        mids,
        isspamdb: typedArgs.isspamdb,
      });

      return {
        output: [
          {
            kind: 'text',
            text: JSON.stringify(payload, null, 2),
          },
        ],
        isError: false,
      };
    } catch (error) {
      const details = error instanceof Error ? error.message : String(error);
      return {
        output: [{ kind: 'text', text: `everdigm_mail.spam_action failed: ${details}` }],
        isError: true,
      };
    }
  }
}
