import { Injectable, BadRequestException, InternalServerErrorException } from '@nestjs/common';
import { Kysely } from 'kysely';
import { DB } from '@/database/database.type';
import { Logger } from 'pino-nestjs';

@Injectable()
export class AnalyticsService {
  constructor(
    private readonly db: Kysely<DB>,
    private readonly logger: Logger,
  ) {}

  async logEvent(data: any, userId?: string) {
    const { eventName, properties = {}, sessionId, platform } = data;

    if (!eventName || typeof eventName !== 'string') {
      throw new BadRequestException('eventName required');
    }

    const safeName = eventName.slice(0, 100);
    const safeProps = typeof properties === 'object' && !Array.isArray(properties) ? { ...properties } : {};

    // Clean sensitive info
    const sensitiveKeys = ['email', 'phone', 'password', 'name', 'token'];
    sensitiveKeys.forEach((key) => delete safeProps[key]);

    try {
      await this.db
        .insertInto('analytics_events')
        .values({
          event_name: safeName,
          properties: JSON.stringify(safeProps),
          user_id: userId || null,
          session_id: sessionId || null,
          platform: platform || null,
        })
        .execute();

      return { status: true, statusCode: 201, message: 'Event logged' };
    } catch (error) {
      this.logger.error('Failed to log event', error);
      throw new InternalServerErrorException('Failed to log event');
    }
  }
}
