import { ApiLog } from './entities/api-log.entity';
import { Repository } from 'typeorm';
import * as nodemailer from 'nodemailer';
import { mailConfig } from 'src/common/mail/mail-config';
import { errorMailContent } from 'src/common/mail/mail-content';
import { Logs } from './entities/logs.entity';
import { HttpException } from '@nestjs/common';

export async function saveError(
  error: Error,
  logRepository: Repository<ApiLog>,
) {
  let statusCode = 500;

  // Check if the error is an instance of HttpException
  if (error instanceof HttpException) {
    statusCode = error.getStatus();
  }

  // Save error message to database
  const logEntry = new ApiLog();
  logEntry.response_code = '500';
  logEntry.error_message = error.message;
  logEntry.stack_trace = JSON.stringify(error);

  await logRepository.save(logEntry);

  const isLocal = process.env.IS_LOCAL === 'true';

  if (!isLocal) {
    // Send error email
    if (statusCode === 500) {
      const transporter = nodemailer.createTransport(mailConfig);

      const errorMailOptions = {
        from: process.env.EMAIL_FROM,
        to: process.env.EMAIL_TO,
        cc: process.env.EMAIL_CC,
        bcc: process.env.EMAIL_BCC,
        subject: 'Error 500 occurred',
        html: errorMailContent(logEntry),
      };

      await transporter.sendMail(errorMailOptions);
    }
  }
}

export async function saveLogs(
  label: string,
  value: any,
  logsRepo: Repository<Logs>,
) {
  const logsEntity = new Logs();

  logsEntity.label = label;
  logsEntity.value = value;

  await logsRepo.save(logsEntity);
}
