import {
  Body,
  Controller,
  ForbiddenException,
  Get,
  Param,
  ParseIntPipe,
  Patch,
  Post,
} from '@nestjs/common';
import { ClsService } from 'nestjs-cls';
import { createZodDto } from 'nestjs-zod';
import { CreateChamadoSchema, AddMensagemSchema, ResolverChamadoSchema } from '@sar/api-interface';
import type { WorkspaceClsStore } from '../workspace/workspace.types';
import { SacService } from './sac.service';

class CreateChamadoDto extends createZodDto(CreateChamadoSchema) {}
class AddMensagemDto extends createZodDto(AddMensagemSchema) {}
class ResolverDto extends createZodDto(ResolverChamadoSchema) {}

@Controller('chamados')
export class SacRepController {
  constructor(private readonly sac: SacService) {}

  @Get()
  listar() {
    return this.sac.listarRep();
  }

  @Get(':id')
  detalhe(@Param('id', ParseIntPipe) id: number) {
    return this.sac.detalhe(id, 'rep');
  }

  @Post()
  criar(@Body() dto: CreateChamadoDto) {
    return this.sac.criar(CreateChamadoSchema.parse(dto));
  }

  @Post(':id/mensagens')
  addMensagem(@Param('id', ParseIntPipe) id: number, @Body() dto: AddMensagemDto) {
    return this.sac.addMensagemRep(id, AddMensagemSchema.parse(dto));
  }

  @Patch(':id/cancelar')
  cancelar(@Param('id', ParseIntPipe) id: number) {
    return this.sac.cancelarRep(id);
  }
}

@Controller('ger/chamados')
export class SacGerController {
  constructor(
    private readonly sac: SacService,
    private readonly cls: ClsService<WorkspaceClsStore>,
  ) {}

  // PGD-AUTHZ: visão da empresa toda (detalhe sem checagem de dono) — só gestores.
  private assertGestor(): void {
    const role = this.cls.get('role') ?? 'rep';
    if (role === 'rep') {
      throw new ForbiddenException(
        'Apenas supervisores e gerentes podem acessar os chamados da empresa',
      );
    }
  }

  @Get()
  listar() {
    this.assertGestor();
    return this.sac.listarEmpresa();
  }

  @Get(':id')
  detalhe(@Param('id', ParseIntPipe) id: number) {
    this.assertGestor();
    return this.sac.detalhe(id, 'empresa');
  }

  @Post(':id/mensagens')
  addMensagem(@Param('id', ParseIntPipe) id: number, @Body() dto: AddMensagemDto) {
    this.assertGestor();
    return this.sac.addMensagemEmpresa(id, AddMensagemSchema.parse(dto));
  }

  @Patch(':id/resolver')
  resolver(@Param('id', ParseIntPipe) id: number, @Body() dto: ResolverDto) {
    this.assertGestor();
    return this.sac.resolver(id, ResolverChamadoSchema.parse(dto));
  }
}
