import { Injectable, Logger } from '@nestjs/common';
import { CreateExpenseDto } from './dto/create-expense.dto';
import { UpdateExpenseDto } from './dto/update-expense.dto';
import { PrismaService } from 'nestjs-prisma';

@Injectable()
export class ExpensesService {
	constructor(private prisma: PrismaService) {}
	private readonly logger = new Logger(ExpensesService.name);

	async create(createExpenseDto: CreateExpenseDto) {
		const transaction = await this.prisma.$transaction(async (tx) => {
			const expense = await tx.expenses.create({
				data: {
					...createExpenseDto,
				},
			});

			this.logger.log(`Created expense with id: ${expense.id}`);

			return expense;
		});

		return transaction;
	}

	async findAll() {
		const transaction = await this.prisma.$transaction(async (tx) => {
			const expenses = await tx.expenses.findMany();
			// this.logger.log(`Found ${expenses.length} expenses`);
			return expenses;
		});

		return transaction;
	}

	findOne(id: number) {
		const transaction = this.prisma.$transaction(async (tx) => {
			const expense = await tx.expenses.findUnique({
				where: {
					id,
				},
			});
			// this.logger.log(`Found expense with id: ${id}`);
			return expense;
		});

		return transaction;
	}

	update(id: number, updateExpenseDto: CreateExpenseDto) {
		const transaction = this.prisma.$transaction(async (tx) => {
			const expense = await tx.expenses.upsert({
				where: {
					id,
				},
				create: {
					...updateExpenseDto,
				},
				update: {
					...updateExpenseDto,
				},
			});
			this.logger.log(`Updated expense with id: ${id}`);
			return expense;
		});

		return transaction;
	}

	remove(id: number) {
		const transaction = this.prisma.$transaction(async (tx) => {
			const expense = await tx.expenses.delete({
				where: {
					id,
				},
			});
			this.logger.log(`Deleted expense with id: ${id}`);
			return expense;
		});

		return transaction;
	}
}
