import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

import * as admin from 'firebase-admin';
import { isEmpty } from 'class-validator';
import { UserNotification } from 'src/notifications/entities/user-notification.entity';

@Injectable()
export class SendNotificationService {
  constructor(
    @InjectRepository(UserNotification)
    private readonly notificationRepository: Repository<UserNotification>,
  ) {}

  async send(
    tokens: string[],
    title: string,
    body: string,
    extraData?: {
      user_id?: string;
      link?: string;
    },
  ): Promise<boolean> {
    try {
      if (isEmpty(tokens)) {
        return false;
      }

      if (tokens.length > 0) {
        const message: any = {
          tokens,
          notification: {
            title,
            body,
          },
          data: {
            ...extraData,
          },
        };

        const data = await admin.messaging().sendEachForMulticast(message);

        const userIdToSave: any = extraData?.user_id;
        const linkToSave: string = extraData?.link;

        const notification = this.notificationRepository.create({
          app_user_id: userIdToSave,
          title,
          message: body,
        });

        notification.data = JSON.stringify({
          title,
          message: body,
          userId: userIdToSave,
          link: linkToSave,
        });

        await this.notificationRepository.save(notification);
      }

      return true;
    } catch (error) {
      return false;
    }
  }
}
