import {
  Body,
  Controller,
  Get,
  HttpCode,
  NotFoundException,
  Param,
  ParseIntPipe,
  Put,
  Query,
} from '@nestjs/common';
import { createZodDto } from 'nestjs-zod';
import {
  ProdutoListQuerySchema,
  UpdateLogoBodySchema,
  type EmpresaInfo,
  type UpdateLogoBody,
  type FormaPagamento,
  type Municipio,
  type Pauta,
  type ProdutoDetail,
  type ProdutoListQuery,
  type ProdutoListResponse,
} from '@sar/api-interface';
import { CatalogService } from './catalog.service';

class ProdutoListQueryDto extends createZodDto(ProdutoListQuerySchema) {}
class UpdateLogoDto extends createZodDto(UpdateLogoBodySchema) {}

// ADR 0006 revogado: UUID → Int para ID de produto. Sync removido (ERP direto via view).

@Controller({ path: 'catalog' })
export class CatalogController {
  constructor(private readonly catalog: CatalogService) {}

  @Get('municipios')
  municipios(@Query('q') q?: string): Promise<Municipio[]> {
    return this.catalog.municipios(q);
  }

  @Get('pautas')
  pautas(): Promise<Pauta[]> {
    return this.catalog.pautas();
  }

  @Get('payment-methods')
  formasPagamento(): Promise<FormaPagamento[]> {
    return this.catalog.formasPagamento();
  }

  @Get('company')
  company(): Promise<EmpresaInfo> {
    return this.catalog.company();
  }

  @Put('company/logo')
  @HttpCode(204)
  updateLogo(@Body() body: UpdateLogoDto): Promise<void> {
    return this.catalog.updateLogo(body as unknown as UpdateLogoBody);
  }

  @Get()
  list(@Query() query: ProdutoListQueryDto): Promise<ProdutoListResponse> {
    const parsed = ProdutoListQuerySchema.parse(query) as ProdutoListQuery;
    return this.catalog.list(parsed);
  }

  @Get(':id')
  async findOne(@Param('id', ParseIntPipe) id: number): Promise<ProdutoDetail> {
    const product = await this.catalog.findOne(id);
    if (!product) throw new NotFoundException(`Produto ${id} não encontrado`);
    return product;
  }
}
