import { CalendarConnection } from '../models/entities/CalendarConnection.entity';
import { env } from '../config/env';
import { EmbedConfig } from '../models/entities/EmbedConfig.entity';

export class CalendarView {
  static toConnection(conn: CalendarConnection) {
    return {
      id: conn.id,
      provider: conn.provider,
      email: conn.providerAccountEmail,
      calendars: (conn.calendarConfig ?? []).map((c) => ({
        id: c.externalId,
        name: c.name,
        checkConflicts: c.checkConflicts,
        writeTarget: c.writeTarget,
      })),
      status: conn.status,
      lastSyncedAt: conn.lastSyncedAt?.toISOString() ?? null,
    };
  }

  static toList(connections: CalendarConnection[]) {
    return { data: connections.map(CalendarView.toConnection) };
  }

  static toEvents(
    events: Array<{
      id: string;
      title: string;
      start: Date;
      end: Date;
      calendarId: string;
      calendarName?: string;
      allDay?: boolean;
    }>,
  ) {
    return {
      data: events.map((e) => ({
        id: e.id,
        title: e.title,
        start: e.start.toISOString(),
        end: e.end.toISOString(),
        calendarId: e.calendarId,
        calendarName: e.calendarName ?? null,
        allDay: Boolean(e.allDay),
      })),
    };
  }
}

export class EmbedView {
  private static widgetTargetId(embedKey: string) {
    return `calendar-booking-widget-${embedKey}`;
  }

  static toHost(config: EmbedConfig, username: string, eventSlug: string) {
    const targetId = EmbedView.widgetTargetId(config.embedKey);
    const htmlSnippet = `<div id="${targetId}"></div>`;
    const scriptSnippet = `<script src="${env.EMBED_SCRIPT_URL}" data-embed-key="${config.embedKey}" data-mode="${config.displayMode}" data-target="#${targetId}" async></script>`;
    const snippet = `${htmlSnippet}\n${scriptSnippet}`;

    return {
      id: config.id,
      embedKey: config.embedKey,
      eventTypeId: config.eventTypeId,
      displayMode: config.displayMode,
      theme: config.theme,
      allowedOrigins: config.allowedOrigins,
      hideBranding: Boolean(config.hideBranding),
      isActive: Boolean(config.isActive),
      publicUrl: `${env.bookingAppUrl}/book/${encodeURIComponent(username)}/${encodeURIComponent(eventSlug)}`,
      // Embed widget SPA (nginx /embed/widget/) — not host-dashboard catch-all
      iframeUrl: `${env.APP_URL}/embed/widget/${config.embedKey}`,
      htmlSnippet,
      scriptSnippet,
      snippet,
      scriptUrl: env.EMBED_SCRIPT_URL,
      createdAt: config.createdAt.toISOString(),
    };
  }

  static toPublicConfig(config: EmbedConfig, username: string, eventSlug: string) {
    return {
      embedKey: config.embedKey,
      displayMode: config.displayMode,
      theme: config.theme,
      publicUrl: `${env.bookingAppUrl}/book/${encodeURIComponent(username)}/${encodeURIComponent(eventSlug)}`,
      iframeUrl: `${env.APP_URL}/embed/widget/${config.embedKey}`,
      allowedPostMessageOrigins: config.allowedOrigins,
    };
  }
}
