import { Injectable, Logger } from '@nestjs/common';
import { CreateMilestoneDto } from './dto/create-milestone.dto';
import { UpdateMilestoneDto } from './dto/update-milestone.dto';
import { PrismaService } from 'src/prisma/prisma.service';

@Injectable()
export class MilestonesService {
	constructor(private prisma: PrismaService) {}
	private logger = new Logger(MilestonesService.name);
	create(createMilestoneDto: CreateMilestoneDto) {
		const transaction = this.prisma.$transaction(async (tx) => {
			this.logger.log({ level: 'info', message: `Milestone created with ${createMilestoneDto}`, refCode: '37201' });
			return tx.milestone.create({ data: createMilestoneDto });
		});
		return transaction;
	}

	findAll() {
		const transaction = this.prisma.$transaction(async (tx) => {
			// this.logger.log({ level: 'info', message: 'Returning all milestones', refCode: '37202' });
			return tx.milestone.findMany();
		});
		return transaction;
	}

	findByJobId(jobId: number) {
		const transaction = this.prisma.$transaction(async (tx) => {
			// this.logger.log({ level: 'info', message: `Returning all milestones for job ${jobId}`, refCode: '37202' });
			return tx.milestone.findMany({ where: { jobId } });
		});
		return transaction;
	}

	findOne(id: number) {
		const transaction = this.prisma.$transaction(async (tx) => {
			// this.logger.log({ level: 'info', message: `Returning one milestone ${id}`, refCode: '37202' });
			return tx.milestone.findUnique({ where: { id } });
		});
		return transaction;
	}

	update(id: number, updateMilestoneDto: UpdateMilestoneDto) {
		const transaction = this.prisma.$transaction(async (tx) => {
			const returnMilestone = await tx.milestone.update({ where: { id }, data: updateMilestoneDto });
			this.logger.log({ level: 'info', message: `Updating milestone ${returnMilestone.id} with ${JSON.stringify(returnMilestone)}`, refCode: '37203', type: 'milestone', typeId: id });
			this.logger.log({ level: 'info', message: `Updating milestone ${returnMilestone.id} with ${JSON.stringify(returnMilestone)}`, refCode: '37203', type: 'job', typeId: returnMilestone.jobId });
			return returnMilestone;
		});
		return transaction;
	}

	remove(id: number) {
		const transaction = this.prisma.$transaction(async (tx) => {
			this.logger.log({ level: 'info', message: `Deleting one milestone ${id}`, refCode: '37204' });
			return tx.milestone.delete({ where: { id } });
		});
		return transaction;
	}
}
