import {
  Controller,
  Get,
  Post,
  Patch,
  Param,
  Query,
  Req,
  Res,
  Body,
  ParseIntPipe,
  UseGuards,
  UseInterceptors,
  UploadedFile,
  BadRequestException,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import type { Response } from 'express';
import { JwtAuthGuard } from './../auth/guards/jwt-auth.guard';
import { AuditSchedulesService } from './../audit-schedules/services/audit-schedules.service';
import { MyAuditsQueryDto } from './dto/my-audits.dto';
import { memoryStorage } from 'multer';

@Controller()
@UseGuards(JwtAuthGuard)
export class MyAuditsController {
  constructor(private readonly service: AuditSchedulesService) { }

  @Get('my-audits')
  async list(@Query() q: MyAuditsQueryDto, @Req() req: any) {
    const userId: number = req.user.id;
    return this.service.myRows(userId, q);
  }

  @Get('my-audits/analytics')
  async analytics(@Req() req: any) {
    const userId: number = req.user.id;
    return this.service.myRowsAnalytics(userId);
  }

  @Get('audits/:rowId/workspace')
  async workspace(
    @Param('rowId', ParseIntPipe) rowId: number,
    @Req() req: any,
  ) {
    const userId: number = req.user.id;
    return this.service.workspace(rowId, userId);
  }

  @Patch('audits/:rowId/complete')
  async markComplete(
    @Param('rowId', ParseIntPipe) rowId: number,
    @Req() req: any,
  ) {
    const userId: number = req.user.id;
    return this.service.markComplete(rowId, userId);
  }

  // Frontend posts multipart/form-data: field "file" + field "doc_type".
  @Post('audits/:rowId/documents')
  @UseInterceptors(
    FileInterceptor('file', {
      storage: memoryStorage(),                  
      limits: { fileSize: 1024 * 1024 * 1024 }, 
    }),
  )
  async uploadDocument(
    @Param('rowId', ParseIntPipe) rowId: number,
    @UploadedFile() file: Express.Multer.File,
    @Body('doc_type') docType: string,
    @Req() req: any,
  ) {
    const userId: number = req.user.id;
    if (!file) {
      throw new BadRequestException('No file uploaded (field "file" missing).');
    }
    return this.service.uploadAuditReport(rowId, docType, file, userId);
  }

  // 🆕 ─── Stream/download an audit document ───
  @Get('audits/:rowId/documents/:docType')
  async openDocument(
    @Param('rowId', ParseIntPipe) rowId: number,
    @Param('docType') docType: string,
    @Req() req: any,
    @Res() res: Response,
  ) {
    const userId: number = req.user.id;
    const { stream, size, mimeType, filename } =
      await this.service.openAuditReport(rowId, docType, userId);

    res.setHeader('Content-Type', mimeType);
    res.setHeader('Content-Length', size);
    res.setHeader(
      'Content-Disposition',
      `inline; filename="${encodeURIComponent(filename)}"`,
    );
    stream.pipe(res);
  }
  
}