import { Body, Controller, Get, Param, Post, Query } from '@nestjs/common';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { z } from 'zod';
import { TaskQuerySchema, NextTaskSchema, ConfirmTaskSchema, TaskExceptionSchema, AssignTasksSchema, ReprioritiseTasksSchema, CancelTasksSchema, CreateMoveTaskSchema, PaginationQuery } from '@wms/shared';
import { RequirePermissions } from '@/common/auth/decorators';
import { zodBody, zodQuery } from '@/common/validation/zod.pipe';
import { TasksService } from './tasks.service';

const TaskListQuery = TaskQuerySchema.merge(PaginationQuery);

@ApiTags('tasks')
@ApiBearerAuth()
@Controller('tasks')
export class TasksController {
  constructor(private readonly tasks: TasksService) {}

  @Get() @RequirePermissions('tasks.read') list(@Query(zodQuery(TaskListQuery)) q: z.infer<typeof TaskListQuery>) { return this.tasks.list(q); }
  @Get('summary') @RequirePermissions('tasks.read') summary(@Query('warehouseId') warehouseId: string) { return this.tasks.summary(warehouseId); }
  @Get(':id') @RequirePermissions('tasks.read') get(@Param('id') id: string) { return this.tasks.get(id); }

  // RF
  @Post('next') @RequirePermissions('tasks.execute') next(@Body(zodBody(NextTaskSchema)) dto: z.infer<typeof NextTaskSchema>) { return this.tasks.next(dto); }
  @Post(':id/start') @RequirePermissions('tasks.execute') start(@Param('id') id: string) { return this.tasks.start(id); }
  @Post(':id/confirm') @RequirePermissions('tasks.execute') confirm(@Param('id') id: string, @Body(zodBody(ConfirmTaskSchema)) dto: z.infer<typeof ConfirmTaskSchema>) { return this.tasks.confirm(id, dto); }
  @Post(':id/exception') @RequirePermissions('tasks.execute') exception(@Param('id') id: string, @Body(zodBody(TaskExceptionSchema)) dto: z.infer<typeof TaskExceptionSchema>) { return this.tasks.exception(id, dto); }

  // supervisor
  @Post('assign') @RequirePermissions('tasks.manage') assign(@Body(zodBody(AssignTasksSchema)) dto: z.infer<typeof AssignTasksSchema>) { return this.tasks.assign(dto); }
  @Post('reprioritise') @RequirePermissions('tasks.manage') reprioritise(@Body(zodBody(ReprioritiseTasksSchema)) dto: z.infer<typeof ReprioritiseTasksSchema>) { return this.tasks.reprioritise(dto); }
  @Post('cancel') @RequirePermissions('tasks.manage') cancel(@Body(zodBody(CancelTasksSchema)) dto: z.infer<typeof CancelTasksSchema>) { return this.tasks.cancel(dto); }
  @Post('move') @RequirePermissions('tasks.manage') createMove(@Body(zodBody(CreateMoveTaskSchema)) dto: z.infer<typeof CreateMoveTaskSchema>) { return this.tasks.createMoveTask(dto); }
}
