import { Injectable, Logger } from '@nestjs/common';
import { MailerService } from '@nestjs-modules/mailer';
import { env } from 'process';

@Injectable()
export class EmailsService {
	private readonly logger = new Logger(EmailsService.name);
	constructor(private readonly mailerService: MailerService) {}

	// public example(): void {
	// 	this.mailerService
	// 		.sendMail({
	// 			to: 'web@mediaengine.com.au', // list of receivers
	// 			from: 'nantone41@ethereal.email', // sender address
	// 			subject: 'Testing Nest MailerModule ✔', // Subject line
	// 			text: 'welcome', // plaintext body
	// 			html: '<b>welcome</b>', // HTML body content
	// 		})
	// 		.then(() => {
	// 			console.log('Email sent');
	// 		})
	// 		.catch(() => {
	// 			console.log('Email failed');
	// 		});
	// }

	public async sendEmail(email: string, subject: string, text: string, html: string): Promise<void> {
		await this.mailerService
			.sendMail({
				to: email,
				from: process.env.EMAIL_USER,
				subject: subject,
				text: text,
				html: html,
			})
			.then(() => {
				console.log('Email sent');
			})
			.catch(() => {
				console.log('Email failed');
			});
	}

	public async newUserEmail(email: string, name: string, link: string): Promise<void> {
		await this.mailerService
			.sendMail({
				to: email,
				from: process.env.EMAIL_USER,
				subject: 'Welcome to the team!',
				template: 'newUser',
				context: {
					name: name,
					email: email,
					link: process.env.EMAIL_SITE + '/user/activate/' + link,
				},
			})
			.then(() => {
				this.logger.log({ level: 'info', message: `Email sent to ${email} for new user ${name}`, refCode: '51200' });
			})
			.catch((e) => {
				this.logger.error({ level: 'error', message: `Email failed to send to ${email} for new user ${name}. Error ${e}`, refCode: '51402' });
			});
	}

	public async passwordResetEmail(email: string, link: string): Promise<void> {
		await this.mailerService
			.sendMail({
				to: email,
				from: process.env.EMAIL_USER,
				subject: 'Password Reset',
				template: 'passwordResetUser',
				context: {
					link: process.env.EMAIL_SITE + '/user/reset/' + link,
				},
			})
			.then(() => {
				this.logger.log({ level: 'info', message: `Email sent to ${email} for password reset`, refCode: '51200' });
			})
			.catch((error) => {
				this.logger.log({ level: 'error', message: `Email failed to send to ${email} for password reset. error => ${error}`, refCode: '51402' });
			});
	}

	public async sendEmailWithTemplate(email: string, subject: string, template: string, context: Record<string, any>): Promise<void> {
		await this.mailerService
			.sendMail({
				to: email,
				from: process.env.EMAIL_USER,
				subject: subject,
				template: template,
				context: context,
			})
			.then(() => {
				this.logger.log({ level: 'info', message: `Email sent to ${email} with template ${template}`, refCode: '51200' });
			})
			.catch((error) => {
				this.logger.log({ level: 'error', message: `Email failed to send to ${email} with template ${template}. error => ${error}`, refCode: '51402' });
			});
	}
}
