import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { RequireModule } from 'src/auth/decorators/require-module.decorator';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { CreateRubroDto } from './dto/create-rubro.dto';
import { SetSucursalesRubroDto } from './dto/set-sucursales.dto';
import { UpdateRubroDto } from './dto/update-rubro.dto';
import { RubrosService } from './rubros.service';

@ApiTags('Rubros')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard)
@RequireModule('ADMINISTRACION')
@Controller({ path: 'rubros', version: '1' })
export class RubrosController {
  constructor(private readonly rubrosService: RubrosService) {}

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('ADMINISTRACION', 'ADM_RUB_RUBRO_VER')
  @ApiOperation({ summary: 'Rubros (unidades de negocio) de la empresa' })
  @ApiQuery({ name: 'solo_activos', required: false, description: 'true para excluir los dados de baja' })
  findAll(@GetUser() user: LoginUserInfo, @Query('solo_activos') soloActivos?: string) {
    return this.rubrosService.findAll(user.empresa_id, soloActivos === 'true');
  }

  @Post()
  @UseGuards(PermissionGuard)
  @RequirePermission('ADMINISTRACION', 'ADM_RUB_RUBRO_CREAR')
  @ApiBody({ type: CreateRubroDto })
  create(@Body(ValidationPipe) dto: CreateRubroDto, @GetUser() user: LoginUserInfo) {
    return this.rubrosService.create(dto, user.empresa_id, user.id);
  }

  @Patch(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('ADMINISTRACION', 'ADM_RUB_RUBRO_EDITAR')
  @ApiBody({ type: UpdateRubroDto })
  update(@Param('id') id: string, @Body(ValidationPipe) dto: UpdateRubroDto, @GetUser() user: LoginUserInfo) {
    return this.rubrosService.update(id, dto, user.empresa_id, user.id);
  }

  @Put(':id/sucursales')
  @UseGuards(PermissionGuard)
  @RequirePermission('ADMINISTRACION', 'ADM_RUB_RUBRO_EDITAR')
  @ApiOperation({ summary: 'Reemplaza el set de sucursales que operan el rubro' })
  @ApiBody({ type: SetSucursalesRubroDto })
  setSucursales(
    @Param('id') id: string,
    @Body(ValidationPipe) dto: SetSucursalesRubroDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.rubrosService.setSucursales(id, dto.sucursal_ids, user.empresa_id, user.id);
  }

  @Delete(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('ADMINISTRACION', 'ADM_RUB_RUBRO_ELIMINAR')
  @ApiOperation({ summary: 'Baja lógica del rubro (nunca se borra: hay datos referenciándolo)' })
  remove(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.rubrosService.remove(id, user.empresa_id, user.id);
  }
}
