import { Body, Controller, Delete, Get, Param, Post, Put, Query, Request, Res } from '@nestjs/common';
import { Response } from 'express';
import { LettersService } from './letters.service';
import { WordGeneratorService } from './word-generator.service';
import { RequirePermissions } from '../../common/decorators/permissions.decorator';

@Controller('letters')
export class LettersController {
  constructor(
    private svc: LettersService,
    private wordGen: WordGeneratorService,
  ) {}

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

  @Get('variables')
  @RequirePermissions('letters.view')
  getVariables() {
    return { groups: this.wordGen.getVariableCatalog() };
  }

  @Get('variables/flat')
  @RequirePermissions('letters.view')
  getVariablesFlat() {
    const names = this.wordGen.getAllVariableNames();
    return { variables: names, total: names.length };
  }

  @Post('seed')
  @RequirePermissions('letters.create')
  seed(@Request() req: any) {
    return this.svc.seedDefaultTemplates(req.tenant);
  }

  @Post(':id/generate')
  @RequirePermissions('letters.view')
  async generate(
    @Request() req: any,
    @Param('id') id: string,
    @Body() body: any,
    @Res() res: Response,
  ) {
    const result = await this.svc.generateDocument(req.tenant, id, body);
    res.set({
      'Content-Type': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
      'Content-Disposition': `attachment; filename="${result.filename}"`,
    });
    res.send(result.buffer);
  }

  @Post('preview')
  @RequirePermissions('letters.view')
  async previewVariables(@Body() body: { variables: Record<string, string> }) {
    return { merged: body.variables, allVarNames: this.wordGen.getAllVariableNames() };
  }

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

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

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

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