import {
  BadRequestException,
  Body,
  Controller,
  HttpCode,
  Post,
  UploadedFile,
  UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import {
  AssistantAskSchema,
  SuggestBilanSchema,
  type AssistantAsk,
  type SuggestBilan,
} from '@siop/shared';
import { ZodValidationPipe } from '../common/zod-validation.pipe';
import { RequirePermission } from '../permissions/require-permission.decorator';
import { AssistantService } from './assistant.service';

// Dictée (D5) : un enregistrement de quelques dizaines de secondes tient
// largement dans 15 Mo — pas besoin du plafond 20 Mo des documents R3.
const AUDIO_MAX_BYTES = 15 * 1024 * 1024;

@Controller('assistant')
export class AssistantController {
  constructor(private readonly assistant: AssistantService) {}

  /** Poser une question — qui lit les OT peut interroger le corpus. */
  @Post('ask')
  @HttpCode(200)
  @RequirePermission('WORK_ORDERS', 'view')
  ask(@Body(new ZodValidationPipe(AssistantAskSchema)) body: AssistantAsk) {
    return this.assistant.ask(body);
  }

  /** Réindexer le corpus — même droit que la gestion du référentiel (D3). */
  @Post('reindex')
  @HttpCode(200)
  @RequirePermission('ASSETS', 'edit')
  reindex() {
    return this.assistant.reindex();
  }

  /** Suggérer des codes — réservé à qui remplit des bilans (D1). */
  @Post('suggest-bilan')
  @HttpCode(200)
  @RequirePermission('WORK_ORDERS', 'edit')
  suggest(@Body(new ZodValidationPipe(SuggestBilanSchema)) body: SuggestBilan) {
    return this.assistant.suggestBilan(body);
  }

  /** Dictée (D5) — même droit que la saisie du bilan qu'elle alimente. */
  @Post('transcribe')
  @HttpCode(200)
  @RequirePermission('WORK_ORDERS', 'edit')
  @UseInterceptors(FileInterceptor('file', { limits: { fileSize: AUDIO_MAX_BYTES } }))
  transcribe(@UploadedFile() file: Express.Multer.File | undefined) {
    if (!file) throw new BadRequestException('Aucun enregistrement reçu (champ « file »)');
    return this.assistant.transcribe({
      buffer: file.buffer,
      originalName: file.originalname,
      contentType: file.mimetype,
    });
  }
}
