import { Injectable, Logger } from '@nestjs/common';
import { CreateLineitemDto } from './dto/create-lineitem.dto';
import { UpdateLineitemDto } from './dto/update-lineitem.dto';
import { PrismaService } from 'src/prisma/prisma.service';

@Injectable()
export class LineitemsService {
	constructor(private prisma: PrismaService) {}
	private readonly logger = new Logger(LineitemsService.name);
	create(createLineitemDto: CreateLineitemDto) {
		const transaction = this.prisma.$transaction(async (tx) => {
			this.logger.log({ level: 'info', message: `Lineitem created with ${createLineitemDto}`, refCode: '35201' });

			// split out sizes for sizes table

			const lineitem = await tx.lineitem.create({ data: createLineitemDto });

			this.logger.log({ level: 'info', message: `Lineitem created with ID ${lineitem.id}`, refCode: '35201' });

			const sizes = createLineitemDto.sizes.map((size: { name: any; quantity: any }) => ({
				lineitemId: lineitem.id,
				name: size.name,
				quantity: size.quantity,
			}));

			this.logger.log({ level: 'info', message: `Creating sizes for lineitem ${lineitem.id} with ${JSON.stringify(sizes)}`, refCode: '35201' });

			await tx.size.createMany({
				data: sizes,
			});
			return lineitem;
		});
		return transaction;
	}

	findAll() {
		const transaction = this.prisma.$transaction(async (tx) => {
			// this.logger.log({ level: 'info', message: 'Returning all lineitems', refCode: '35202' });
			return tx.lineitem.findMany({
				include: {
					sizes: true,
				},
			});
		});
		return transaction;
	}

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

	update(id: number, updateLineitemDto: UpdateLineitemDto) {
		const transaction = this.prisma.$transaction(async (tx) => {
			this.logger.log({ level: 'info', message: `Updating one lineitem ${id} with ${updateLineitemDto}`, refCode: '35203' });
			return tx.lineitem.update({
				where: { id },
				data: updateLineitemDto,
			});
		});
		return transaction;
	}

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