import { Controller, Get, Post, Body, Patch, Param, Delete, ParseIntPipe, DefaultValuePipe, Query } from '@nestjs/common';
import { MatricesService } from './matrices.service';
import { CreateMatrixDto } from './dto/create-matrix.dto';
import { UpdateMatrixDto } from './dto/update-matrix.dto';
import { ApiTags } from '@nestjs/swagger';

@Controller('matrices')
@ApiTags('matrices')
export class MatricesController {
	constructor(private readonly matricesService: MatricesService) {}

	@Post()
	createMatrix(@Body() createMatrixDto: CreateMatrixDto) {
		return this.matricesService.createMatrix(createMatrixDto);
	}

	@Post('/row')
	createRow(@Body() createMatrixDto: CreateMatrixDto[]) {
		return this.matricesService.createRow(createMatrixDto);
	}

	@Get('/primary')
	findPrimary() {
		return this.matricesService.findPrimary();
	}

	@Get('/secondary')
	findSecondary() {
		return this.matricesService.findSecondary();
	}

	@Get('/tertiary')
	findTertiary() {
		return this.matricesService.findTertiary();
	}

	@Get('/primary/all')
	findAllPrimary(@Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number, @Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit: number, @Query('sortBy') sortBy: string, @Query('sortOrder') sortOrder: string, @Query('search') search: string) {
		return this.matricesService.findAllPrimary(page, limit, sortBy, sortOrder, search);
	}

	@Get('/secondary/all')
	findAllSecondary(@Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number, @Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit: number, @Query('sortBy') sortBy: string, @Query('sortOrder') sortOrder: string, @Query('search') search: string) {
		return this.matricesService.findAllSecondary(page, limit, sortBy, sortOrder, search);
	}

	@Get('/tertiary/all')
	findAllTertiary(@Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number, @Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit: number, @Query('sortBy') sortBy: string, @Query('sortOrder') sortOrder: string, @Query('search') search: string) {
		return this.matricesService.findAllTertiary(page, limit, sortBy, sortOrder, search);
	}

	@Patch('/:id')
	updateMatrix(@Param('id') id: string, @Body() updateMatrixDto: UpdateMatrixDto) {
		return this.matricesService.updateMatrix(+id, updateMatrixDto);
	}

	@Patch()
	updateManyMatrices(@Body() list: { id: number; data: UpdateMatrixDto }[]) {
		return this.matricesService.updateManyMatrices(list);
	}

	@Delete('/:id')
	deleteMatrix(@Param('id') id: string) {
		return this.matricesService.deleteMatrix(+id);
	}

	@Delete()
	deleteManyMatrices(@Body() ids: number[]) {
		return this.matricesService.deleteManyMatrices(ids);
	}
}
