import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { ZoomAnalyticsLiveEvent } from 'src/common/entities';
import { AppLoggerService } from 'src/common/services/logger.service';
import { handleKnownErrors } from 'src/common/utils/handle-error.util';
import { ERROR_CODES } from 'src/common/constants/error-string-constants';

/**
 * Owns `zoom_analytics_live_event` — the append-only event log. Insert-only:
 * rows are never updated or deleted.
 */
@Injectable()
export class ZoomAnalyticsLiveEventRepository {
  constructor(
    @InjectRepository(ZoomAnalyticsLiveEvent)
    private readonly repo: Repository<ZoomAnalyticsLiveEvent>,
    private readonly logger: AppLoggerService,
  ) {}

  create(data: Partial<ZoomAnalyticsLiveEvent>): ZoomAnalyticsLiveEvent {
    return this.repo.create(new ZoomAnalyticsLiveEvent(data));
  }

  async insert(row: ZoomAnalyticsLiveEvent): Promise<ZoomAnalyticsLiveEvent> {
    try {
      return await this.repo.save(row);
    } catch (error) {
      this.logger.error('Error inserting Zoom analytics live event', error?.stack, { error });
      handleKnownErrors(ERROR_CODES.ZOOM_PARTICIPANT_SAVE_FAILED, error);
    }
  }

  /** All observed events for a webinar occurrence, oldest first. */
  async findAllByOnlineSessionId(onlineSessionId: number): Promise<ZoomAnalyticsLiveEvent[]> {
    try {
      return await this.repo.find({
        where: { onlineSessionId },
        order: { occurredAt: 'ASC' },
      });
    } catch (error) {
      this.logger.error('Error listing Zoom analytics live events', error?.stack, { error, onlineSessionId });
      handleKnownErrors(ERROR_CODES.ZOOM_PARTICIPANT_GET_FAILED, error);
    }
  }
}
