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

type EverdigmMailLogsArgs = {
  startdate?: string;
  enddate?: string;
  type?: string;
  status?: string;
  fromaddr?: string;
  toaddr?: string;
  subject?: string;
  ipaddr?: string;
  page?: string | number;
  linenum?: string | number;
};

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

  definition(): ToolDefinition {
    return {
      name: 'everdigm_mail.logs',
      description:
        'Fetch Everdigm mail logs with optional filters (type/status/from/to/subject/ip).',
      inputSchema: {
        type: 'object',
        properties: {
          startdate: { type: 'string', description: 'YYYY/MM/DD HH:mm:ss' },
          enddate: { type: 'string', description: 'YYYY/MM/DD HH:mm:ss' },
          type: {
            type: 'string',
            description: 'spam|block|receive|send or p|b|r|s',
          },
          status: {
            type: 'string',
            description: 'success|fail|delay or s|f|d',
          },
          fromaddr: { type: 'string' },
          toaddr: { type: 'string' },
          subject: { type: 'string' },
          ipaddr: { type: 'string' },
          page: { type: ['string', 'integer'], minimum: 1 },
          linenum: { type: ['string', 'integer'], minimum: 1 },
        },
        additionalProperties: false,
      },
      handler: async (args, context) => this.execute(args, context),
    };
  }

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

    try {
      const payload = await this.everdigmMailClient.fetchMailLogs({
        startdate: this.toOptionalString(typedArgs.startdate),
        enddate: this.toOptionalString(typedArgs.enddate),
        type: this.toOptionalString(typedArgs.type),
        status: this.toOptionalString(typedArgs.status),
        fromaddr: this.toOptionalString(typedArgs.fromaddr),
        toaddr: this.toOptionalString(typedArgs.toaddr),
        subject: this.toOptionalString(typedArgs.subject),
        ipaddr: this.toOptionalString(typedArgs.ipaddr),
        page: this.toOptionalString(typedArgs.page),
        linenum: this.toOptionalString(typedArgs.linenum),
      });

      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.logs 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;
  }
}
