import {
  Body,
  Controller,
  Get,
  HttpCode,
  Param,
  ParseUUIDPipe,
  Patch,
  Post,
  Put,
} from '@nestjs/common';
import {
  AssigneesUpdateSchema,
  ChecklistPatchSchema,
  CommentCreateSchema,
  ConsumePartSchema,
  LaborTimeCreateSchema,
  ReportUpsertSchema,
  TransitionRequestSchema,
  WorkOrderCreateSchema,
  type AssigneesUpdate,
  type ChecklistPatch,
  type CommentCreate,
  type ConsumePart,
  type LaborTimeCreate,
  type ReportUpsert,
  type TransitionRequest,
  type WorkOrderCreate,
} from '@siop/shared';
import {
  AuthenticatedUser,
  CurrentUser,
} from '../auth/current-user.decorator';
import { ZodValidationPipe } from '../common/zod-validation.pipe';
import { RequirePermission } from '../permissions/require-permission.decorator';
import { WorkOrdersService } from './work-orders.service';

@Controller('work-orders')
export class WorkOrdersController {
  constructor(private readonly workOrders: WorkOrdersService) {}

  @Get()
  @RequirePermission('WORK_ORDERS', 'view')
  list(@CurrentUser() user: AuthenticatedUser) {
    return this.workOrders.list(user);
  }

  @Get(':id')
  @RequirePermission('WORK_ORDERS', 'view')
  get(@Param('id', ParseUUIDPipe) id: string, @CurrentUser() user: AuthenticatedUser) {
    return this.workOrders.get(id, user);
  }

  @Post()
  @RequirePermission('WORK_ORDERS', 'create')
  create(
    @Body(new ZodValidationPipe(WorkOrderCreateSchema)) body: WorkOrderCreate,
    @CurrentUser() user: AuthenticatedUser,
  ) {
    return this.workOrders.create(body, user);
  }

  @Post(':id/transition')
  @HttpCode(200) // le contrat : 200, l'état change — rien n'est « créé »
  @RequirePermission('WORK_ORDERS', 'edit')
  transition(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(new ZodValidationPipe(TransitionRequestSchema)) body: TransitionRequest,
    @CurrentUser() user: AuthenticatedUser,
  ) {
    return this.workOrders.transition(id, body, user);
  }

  @Post(':id/comments')
  @RequirePermission('WORK_ORDERS', 'edit')
  comment(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(new ZodValidationPipe(CommentCreateSchema)) body: CommentCreate,
    @CurrentUser() user: AuthenticatedUser,
  ) {
    return this.workOrders.comment(id, body.message, user);
  }

  @Put(':id/assignees')
  @RequirePermission('WORK_ORDERS', 'edit')
  setAssignees(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(new ZodValidationPipe(AssigneesUpdateSchema)) body: AssigneesUpdate,
    @CurrentUser() user: AuthenticatedUser,
  ) {
    return this.workOrders.setAssignees(id, body, user);
  }

  @Put(':id/report')
  @RequirePermission('WORK_ORDERS', 'edit')
  upsertReport(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(new ZodValidationPipe(ReportUpsertSchema)) body: ReportUpsert,
    @CurrentUser() user: AuthenticatedUser,
  ) {
    return this.workOrders.upsertReport(id, body, user);
  }

  @Post(':id/consume-part')
  @RequirePermission('WORK_ORDERS', 'edit')
  consumePart(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(new ZodValidationPipe(ConsumePartSchema)) body: ConsumePart,
    @CurrentUser() user: AuthenticatedUser,
  ) {
    return this.workOrders.consumePart(id, body, user);
  }

  @Post(':id/labor')
  @RequirePermission('WORK_ORDERS', 'edit')
  addLabor(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(new ZodValidationPipe(LaborTimeCreateSchema)) body: LaborTimeCreate,
    @CurrentUser() user: AuthenticatedUser,
  ) {
    return this.workOrders.addLabor(id, body, user);
  }

  @Patch(':id/checklist/:itemId')
  @RequirePermission('WORK_ORDERS', 'edit')
  patchChecklist(
    @Param('id', ParseUUIDPipe) id: string,
    @Param('itemId', ParseUUIDPipe) itemId: string,
    @Body(new ZodValidationPipe(ChecklistPatchSchema)) body: ChecklistPatch,
    @CurrentUser() user: AuthenticatedUser,
  ) {
    return this.workOrders.patchChecklist(id, itemId, body, user);
  }
}
