import type { NotificationService, SendNotificationCommand } from '@core/notifications/application/ports/NotificationService';
import type { INotificationRepository } from '@core/notifications/domain/repositories/INotificationRepository';
import type { INotificationPreferenceRepository } from '@core/notifications/domain/repositories/INotificationPreferenceRepository';
import type { NotificationGatewayRegistry } from '@core/notifications/application/ports/NotificationGateway';
import { SendNotificationUseCase } from '@core/notifications/application/use-cases/SendNotificationUseCase';
import type { Logger } from '@core/shared/application';
import type { UseCaseOutputPort } from '@core/shared/application/UseCaseOutputPort';

class NoOpOutputPort implements UseCaseOutputPort<any> {
  present(_result: any): void {
    // No-op for adapter
  }
}

export class NotificationServiceAdapter implements NotificationService {
  private readonly useCase: SendNotificationUseCase;
  private readonly logger: Logger;

  constructor(
    notificationRepository: INotificationRepository,
    preferenceRepository: INotificationPreferenceRepository,
    gatewayRegistry: NotificationGatewayRegistry,
    logger: Logger,
  ) {
    this.logger = logger;
    this.useCase = new SendNotificationUseCase(
      notificationRepository,
      preferenceRepository,
      gatewayRegistry,
      new NoOpOutputPort(),
      logger,
    );
  }

  async sendNotification(command: SendNotificationCommand): Promise<void> {
    const result = await this.useCase.execute(command);
    
    if (result.isErr()) {
      const error = result.error;
      if (error) {
        this.logger.error('Failed to send notification', new Error(error.details.message));
        throw new Error(error.details.message);
      } else {
        throw new Error('Unknown error sending notification');
      }
    }
  }
}