import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Req,
  UseGuards,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from '../auth/dto/login.dto';
import { GetUser } from '../auth/get-user.decorator';
import { UpsertPerfilDto } from './dto/upsert-perfil.dto';
import { SeguridadService } from './seguridad.service';
import { SeguridadSeedOrchestrator } from './seeds/seed-orchestrator.service';

@ApiTags('Seguridad (v2)')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@Controller('seguridad')
export class SeguridadController {
  constructor(
    private readonly service: SeguridadService,
    private readonly seedOrch: SeguridadSeedOrchestrator,
  ) {}

  @Get('modulos/arbol')
  @ApiOperation({ summary: 'Árbol jerárquico Módulo → Submódulo → Privilegio (filtrado por suscripción)' })
  getArbol(@GetUser() user: LoginUserInfo) {
    return this.service.getArbol(user.empresa_id, user.id);
  }

  @Get('perfiles')
  @ApiOperation({ summary: 'Listar perfiles de la empresa' })
  listarPerfiles(@GetUser() user: LoginUserInfo) {
    return this.service.listarPerfiles(user.empresa_id);
  }

  @Get('perfiles/:id')
  @ApiOperation({ summary: 'Obtener perfil con sus privilegios' })
  obtenerPerfil(@GetUser() user: LoginUserInfo, @Param('id') id: string) {
    return this.service.obtenerPerfil(user.empresa_id, id);
  }

  @Post('perfiles')
  @ApiOperation({ summary: 'Crear perfil con privilegios' })
  crearPerfil(
    @GetUser() user: LoginUserInfo,
    @Body() dto: UpsertPerfilDto,
    @Req() req: any,
  ) {
    return this.service.crearPerfil(user.empresa_id, dto, {
      userId: user.id,
      ip: req.ip,
      userAgent: req.headers['user-agent'],
    });
  }

  @Patch('perfiles/:id')
  @ApiOperation({ summary: 'Actualizar perfil (bloqueado para perfiles del sistema)' })
  actualizarPerfil(
    @GetUser() user: LoginUserInfo,
    @Param('id') id: string,
    @Body() dto: UpsertPerfilDto,
    @Req() req: any,
  ) {
    return this.service.actualizarPerfil(user.empresa_id, id, dto, {
      userId: user.id,
      ip: req.ip,
      userAgent: req.headers['user-agent'],
    });
  }

  @Post('perfiles/:id/clonar')
  @ApiOperation({ summary: 'Clonar un perfil (sirve para customizar perfiles del sistema)' })
  clonarPerfil(
    @GetUser() user: LoginUserInfo,
    @Param('id') id: string,
    @Req() req: any,
  ) {
    return this.service.clonarPerfil(user.empresa_id, id, {
      userId: user.id,
      ip: req.ip,
      userAgent: req.headers['user-agent'],
    });
  }

  @Delete('perfiles/:id')
  @ApiOperation({ summary: 'Eliminar perfil (bloqueado si es del sistema o tiene usuarios)' })
  eliminarPerfil(
    @GetUser() user: LoginUserInfo,
    @Param('id') id: string,
    @Req() req: any,
  ) {
    return this.service.eliminarPerfil(user.empresa_id, id, {
      userId: user.id,
      ip: req.ip,
      userAgent: req.headers['user-agent'],
    });
  }

  @Post('perfiles/cargar-sugeridos')
  @ApiOperation({ summary: 'Carga los perfiles del sistema sugeridos para la empresa' })
  cargarSugeridos(@GetUser() user: LoginUserInfo, @Req() req: any) {
    return this.service.cargarPerfilesSugeridos(user.empresa_id, {
      userId: user.id,
      ip: req.ip,
      userAgent: req.headers['user-agent'],
    });
  }

  @Post('seed-maestro')
  @ApiOperation({
    summary: 'Re-siembra catálogo global de módulos/submódulos/privilegios (idempotente)',
  })
  async seedMaestro() {
    return this.seedOrch.runCatalogoMaestro();
  }
}
