import { Body, Controller, Delete, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from '../auth/dto/login.dto';
import { GetUser } from '../auth/get-user.decorator';
import { RequireModule, RequirePermission } from '../auth/decorators';
import { ModuleGuard } from '../auth/guards/module.guard';
import { PermissionGuard } from '../auth/guards/permission.guard';
import { CreateZonaCobranzaDto, UpdateZonaCobranzaDto } from './dto';
import { ZonasCobranzaService } from './zonas-cobranza.service';

@ApiTags('Zonas de Cobranza')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller('zonas-cobranza')
export class ZonasCobranzaController {
  constructor(private readonly service: ZonasCobranzaService) {}

  @Post()
  @RequirePermission('COBRANZAS', 'COB_ZON_ZONA_CREAR')
  @ApiOperation({ summary: 'Crear una nueva zona de cobranza' })
  create(@GetUser() user: LoginUserInfo, @Body() dto: CreateZonaCobranzaDto) {
    return this.service.create(user.empresa_id, dto);
  }

  @Get()
  @RequirePermission('COBRANZAS', 'COB_ZON_ZONA_VER')
  @ApiOperation({ summary: 'Listar zonas de cobranza' })
  @ApiQuery({ name: 'active_only', required: false, type: Boolean })
  findAll(@GetUser() user: LoginUserInfo, @Query('active_only') activeOnly?: string) {
    return this.service.findAll(user.empresa_id, activeOnly === 'true');
  }

  @Get(':id')
  @RequirePermission('COBRANZAS', 'COB_ZON_ZONA_VER')
  @ApiOperation({ summary: 'Obtener una zona de cobranza por ID' })
  findOne(@GetUser() user: LoginUserInfo, @Param('id') id: string) {
    return this.service.findOne(user.empresa_id, id);
  }

  @Patch(':id')
  @RequirePermission('COBRANZAS', 'COB_ZON_ZONA_EDITAR')
  @ApiOperation({ summary: 'Actualizar una zona de cobranza' })
  update(@GetUser() user: LoginUserInfo, @Param('id') id: string, @Body() dto: UpdateZonaCobranzaDto) {
    return this.service.update(user.empresa_id, id, dto);
  }

  @Patch(':id/toggle-active')
  @RequirePermission('COBRANZAS', 'COB_ZON_ZONA_EDITAR')
  @ApiOperation({ summary: 'Activar/desactivar zona de cobranza' })
  toggleActive(@GetUser() user: LoginUserInfo, @Param('id') id: string) {
    return this.service.toggleActive(user.empresa_id, id);
  }

  @Delete(':id')
  @RequirePermission('COBRANZAS', 'COB_ZON_ZONA_ELIMINAR')
  @ApiOperation({ summary: 'Eliminar (desactivar) una zona de cobranza' })
  remove(@GetUser() user: LoginUserInfo, @Param('id') id: string) {
    return this.service.remove(user.empresa_id, id);
  }
}
