import { Injectable, Logger } from '@nestjs/common';
import { CreateCategoryDto } from './dto/create-category.dto';
import { UpdateCategoryDto } from './dto/update-category.dto';
import { PrismaService } from 'src/prisma/prisma.service';
import { title } from 'process';

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

	create(createCategoryDto: CreateCategoryDto) {
		const transaction = this.prisma.$transaction(async (tx) => {
			this.logger.log({ level: 'info', message: `Category created with ${createCategoryDto}`, refCode: '34201' });
			return tx.category.create({ data: createCategoryDto });
		});
		return transaction;
	}

	findAll(skip = 0, take = 10, sortBy: string = 'name', sortOrder: string = 'asc', search: string = '') {
		const transaction = this.prisma.$transaction(async (tx) => {
			if (take < 0) {
				take = 100;
			}

			// Default Query
			let query = {
				skip,
				take,
				orderBy: {
					[sortBy]: sortOrder,
				},
			} as any;

			if (search) {
				query.where = { name: { contains: search } };
			}

			this.logger.log({ level: 'info', message: `Returning all categories`, refCode: '34202' });

			return tx.category.findManyAndCount(query);
		});
		return transaction;
	}

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

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

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