import { Injectable } from '@angular/core';

export type EmbedMessageType =
  | 'calendar.embed.ready'
  | 'calendar.embed.bookingComplete'
  | 'calendar.embed.resize';

export interface EmbedMessage {
  type: EmbedMessageType;
  payload?: Record<string, unknown>;
}

@Injectable({ providedIn: 'root' })
export class EmbedMessengerService {
  private allowedOrigins: string[] = ['*'];

  configure(origins: string[]): void {
    this.allowedOrigins = origins.length ? origins : ['*'];
  }

  post(type: EmbedMessageType, payload?: Record<string, unknown>): void {
    const message: EmbedMessage = { type, payload };
    if (window.parent === window) {
      return;
    }
    if (this.allowedOrigins.includes('*')) {
      window.parent.postMessage(message, '*');
      return;
    }
    this.allowedOrigins.forEach((origin) => {
      window.parent.postMessage(message, origin);
    });
  }

  notifyReady(): void {
    this.post('calendar.embed.ready');
  }

  notifyBookingComplete(bookingId: string): void {
    this.post('calendar.embed.bookingComplete', { bookingId });
  }
}
