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

type EverdigmUnspamRequestsArgs = {
  viewcont?: string | number;
  start?: string | number;
  end?: string | number;
};

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

  definition(): ToolDefinition {
    return {
      name: 'everdigm_mail.unspam_requests',
      description:
        'Fetch Everdigm mail unspam request list (maillist, newcount, total) from the API.',
      inputSchema: {
        type: 'object',
        properties: {
          viewcont: {
            type: ['string', 'integer'],
            description: 'Range string like "0,30".',
          },
          start: { type: ['string', 'integer'], description: 'Start offset (e.g., 0).' },
          end: { type: ['string', 'integer'], description: 'End offset (e.g., 30).' },
        },
        additionalProperties: false,
      },
      handler: async (args, context) => this.execute(args, context),
    };
  }

  async execute(args: unknown, _context: ToolContext): Promise<ToolExecutionResult> {
    const typedArgs = (args ?? {}) as EverdigmUnspamRequestsArgs;

    try {
      const payload = await this.everdigmMailClient.fetchUnspamRequests({
        viewcont: this.toOptionalString(typedArgs.viewcont),
        start: this.toOptionalString(typedArgs.start),
        end: this.toOptionalString(typedArgs.end),
      });

      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.unspam_requests failed: ${details}` }],
        isError: true,
      };
    }
  }

  private toOptionalString(value: string | number | undefined): string | undefined {
    if (value === undefined || value === null) {
      return undefined;
    }
    const text = String(value).trim();
    return text.length ? text : undefined;
  }
}
