import * as plugins from '../plugins.js';
import { EmailService } from './email.classes.emailservice.js';
import { logger } from '../logger.js';

export class ApiManager {
  public emailRef: EmailService;
  public typedRouter = new plugins.typedrequest.TypedRouter();

  constructor(emailRefArg: EmailService) {
    this.emailRef = emailRefArg;
    this.emailRef.typedrouter.addTypedRouter(this.typedRouter);

    // Register API endpoints
    this.registerApiEndpoints();
  }

  /**
   * Register API endpoints for email functionality
   */
  private registerApiEndpoints() {
    // Register the SendEmail endpoint
    this.typedRouter.addTypedHandler<plugins.servezoneInterfaces.platformservice.mta.IRequest_SendEmail>(
      new plugins.typedrequest.TypedHandler('sendEmail', async (requestData) => {
        const mailToSend = new plugins.smartmail.Smartmail({
          body: requestData.body,
          from: requestData.from,
          subject: requestData.title,
        });

        if (requestData.attachments) {
          for (const attachment of requestData.attachments) {
            mailToSend.addAttachment(
              await plugins.smartfile.SmartFile.fromString(
                attachment.name,
                attachment.binaryAttachmentString,
                'binary'
              )
            );
          }
        }

        // Send email through the service which will route to the appropriate connector
        const emailId = await this.emailRef.sendEmail(mailToSend, requestData.to, {});
        
        logger.log(
          'info',
          `sent an email to ${requestData.to} with subject '${mailToSend.getSubject()}'`,
          {
            eventType: 'sentEmail',
            email: {
              to: requestData.to,
              subject: mailToSend.getSubject(),
            },
          }
        );
        
        return {
          responseId: emailId,
        };
      })
    );

    // Add endpoint to check email status
    this.typedRouter.addTypedHandler<{ emailId: string }>(
      new plugins.typedrequest.TypedHandler('checkEmailStatus', async (requestData) => {
        // If MTA is enabled, use it to check status
        if (this.emailRef.mtaConnector) {
          const status = await this.emailRef.mtaConnector.checkEmailStatus(requestData.emailId);
          return status;
        }
        
        // For Mailgun, we don't have a status check implementation currently
        return {
          status: 'unknown',
          details: { message: 'Status tracking not available for current provider' }
        };
      })
    );

    // Add statistics endpoint
    this.typedRouter.addTypedHandler<void>(
      new plugins.typedrequest.TypedHandler('getEmailStats', async () => {
        return this.emailRef.getStats();
      })
    );
  }
}