import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseUUIDPipe,
  Patch,
  Post,
  Query,
  UseGuards,
  ValidationPipe,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { inm_unidad_estado } from '@prisma/client';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { RequireSubmodulo } from 'src/auth/decorators/require-submodulo.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { SubmoduloGuard } from 'src/auth/guards/submodulo.guard';
import {
  BloquearUnidadDto,
  CambiarPrecioDto,
  CreateUnidadDto,
  ImportarUnidadesDto,
  UpdateUnidadDto,
  VersionDto,
} from './dto/unidad.dto';
import { UnidadesInmService } from './unidades.service';

@ApiTags('Inmobiliario · Unidades')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('INM_UNIDADES')
@Controller({ path: 'inmobiliario/unidades', version: '1' })
export class UnidadesInmController {
  constructor(private readonly service: UnidadesInmService) {}

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_UNIDAD_VER')
  @ApiQuery({ name: 'proyecto_id', required: false })
  @ApiQuery({ name: 'estado', required: false, enum: inm_unidad_estado })
  @ApiQuery({ name: 'etapa_id', required: false })
  @ApiQuery({ name: 'q', required: false })
  @ApiQuery({ name: 'incluir_inactivas', required: false })
  listar(
    @GetUser() user: LoginUserInfo,
    @Query('proyecto_id') proyecto_id?: string,
    @Query('estado') estado?: inm_unidad_estado,
    @Query('etapa_id') etapa_id?: string,
    @Query('q') q?: string,
    @Query('incluir_inactivas') inactivas?: string,
  ) {
    return this.service.listar(user.empresa_id, {
      proyecto_id,
      estado,
      etapa_id,
      q,
      incluir_inactivas: inactivas === 'true',
    });
  }

  @Get(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_UNIDAD_VER')
  @ApiOperation({ summary: 'Unidad con historial de precios, vinculadas y venta vigente' })
  detalle(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.detalle(id, user.empresa_id);
  }

  @Post()
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_UNIDAD_CREAR')
  crear(@Body(ValidationPipe) dto: CreateUnidadDto, @GetUser() user: LoginUserInfo) {
    return this.service.crear(dto, user.empresa_id, user.id);
  }

  @Post('importar')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_UNIDAD_IMPORTAR')
  @ApiOperation({ summary: 'Carga masiva: crea o actualiza por código. Devuelve los errores por fila.' })
  importar(@Body(ValidationPipe) dto: ImportarUnidadesDto, @GetUser() user: LoginUserInfo) {
    return this.service.importar(dto, user.empresa_id, user.id);
  }

  @Patch(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_UNIDAD_EDITAR')
  actualizar(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: UpdateUnidadDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.actualizar(id, dto, user.empresa_id, user.id);
  }

  @Post(':id/precio')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_PRECIO_EDITAR')
  @ApiOperation({ summary: 'Cambia el precio de lista y lo deja en el historial' })
  cambiarPrecio(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: CambiarPrecioDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.cambiarPrecio(id, dto, user.empresa_id, user.id);
  }

  @Post(':id/publicar')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_UNIDAD_EDITAR')
  publicar(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: VersionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.publicar(id, dto.version, user.empresa_id, user.id);
  }

  @Post(':id/bloquear')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_UNIDAD_BLOQUEAR')
  bloquear(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: BloquearUnidadDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.bloquear(id, dto, user.empresa_id, user.id);
  }

  @Post(':id/desbloquear')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_UNIDAD_BLOQUEAR')
  desbloquear(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: VersionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.desbloquear(id, dto.version, user.empresa_id, user.id);
  }

  @Delete(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_UNI_UNIDAD_ELIMINAR')
  darDeBaja(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.darDeBaja(id, user.empresa_id, user.id);
  }
}
