import {
  Body, Controller, Delete, Get,
  Param, Post, Put, Query, Request, Res,
} from '@nestjs/common';
import type { Response } from 'express';
import { DocumentsService } from './documents.service';
import { ObjectStorageService } from '../object-storage/object-storage.service';
import { RequirePermissions } from '../../common/decorators/permissions.decorator';

@Controller('documents')
export class DocumentsController {
  constructor(
    private svc: DocumentsService,
    private storage: ObjectStorageService,
  ) {}

  @Get()
  @RequirePermissions('documents.view')
  findAll(@Request() req: any, @Query() q: any) {
    return this.svc.findAll(req.tenant, {
      category: q.category,
      memberId: q.memberId,
      relatedEntityId: q.relatedEntityId,
      q: q.q,
      page: Number(q.page) || 1,
      limit: Number(q.limit) || 20,
    });
  }

  @Get('upload-url')
  @RequirePermissions('documents.create')
  async getUploadUrl() {
    return this.storage.getUploadUrl();
  }

  @Get(':id')
  @RequirePermissions('documents.view')
  findOne(@Request() req: any, @Param('id') id: string) {
    return this.svc.findOne(req.tenant, id);
  }

  @Post()
  @RequirePermissions('documents.create')
  create(@Request() req: any, @Body() body: any) {
    return this.svc.create(req.tenant, body, req.user?.sub, req.user?.name);
  }

  @Put(':id')
  @RequirePermissions('documents.update')
  update(@Request() req: any, @Param('id') id: string, @Body() body: any) {
    return this.svc.update(req.tenant, id, body);
  }

  @Delete(':id')
  @RequirePermissions('documents.delete')
  remove(@Request() req: any, @Param('id') id: string) {
    return this.svc.remove(req.tenant, id);
  }

  // ── Serve files from GCS ───────────────────────────────────────────────────
  @Get('serve/*')
  @RequirePermissions('documents.view')
  async serveFile(@Param('0') objectId: string, @Res() res: Response) {
    const objectPath = `/objects/${objectId}`;
    const { stream, contentType, size } = await this.storage.streamObject(objectPath);
    res.setHeader('Content-Type', contentType);
    res.setHeader('Cache-Control', 'private, max-age=3600');
    if (size) res.setHeader('Content-Length', size);
    stream.pipe(res);
  }
}
