import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseUUIDPipe,
  Patch,
  Post,
  Put,
  UseGuards,
  ValidationPipe,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
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 {
  EntregaDto,
  EscrituraDto,
  FirmarEscrituraDto,
  InscribirEscrituraDto,
  ObservacionDto,
  TareaDto,
  UpdateEntregaDto,
  UpdateObservacionDto,
  UpdateTareaDto,
} from './dto/postventa.dto';
import { PostventaInmService } from './postventa.service';

@ApiTags('Inmobiliario · Escrituración y entrega')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('INM_POSTVENTA')
@Controller({ path: 'inmobiliario', version: '1' })
export class PostventaInmController {
  constructor(private readonly service: PostventaInmService) {}

  @Get('operaciones/:id/escritura')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_POSTVENTA_VER')
  escritura(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.obtenerEscritura(id, user.empresa_id);
  }

  @Put('operaciones/:id/escritura')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_ESCRITURA_EDITAR')
  @ApiOperation({ summary: 'Abre o actualiza el expediente de escritura (la primera vez crea el checklist)' })
  guardarEscritura(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: EscrituraDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.guardarEscritura(id, dto, user.empresa_id, user.id);
  }

  @Post('operaciones/:id/escritura/firmar')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_ESCRITURA_CONFIRMAR')
  @ApiOperation({ summary: 'Registra la firma. Con saldo, exige hipoteca por el saldo' })
  firmar(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: FirmarEscrituraDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.firmarEscritura(id, dto, user.empresa_id, user.id);
  }

  @Post('operaciones/:id/escritura/inscribir')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_ESCRITURA_EDITAR')
  inscribir(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: InscribirEscrituraDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.inscribirEscritura(id, dto, user.empresa_id, user.id);
  }

  @Post('operaciones/:id/escritura/tareas')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_ESCRITURA_EDITAR')
  agregarTarea(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: TareaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.agregarTarea(id, dto, user.empresa_id);
  }

  @Patch('escritura-tareas/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_ESCRITURA_EDITAR')
  actualizarTarea(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: UpdateTareaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.actualizarTarea(id, dto, user.empresa_id);
  }

  @Delete('escritura-tareas/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_ESCRITURA_EDITAR')
  eliminarTarea(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.eliminarTarea(id, user.empresa_id);
  }

  @Get('operaciones/:id/entrega')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_POSTVENTA_VER')
  entrega(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.obtenerEntrega(id, user.empresa_id);
  }

  @Post('operaciones/:id/entrega')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_ENTREGA_CONFIRMAR')
  @ApiOperation({ summary: 'Registra la entrega con su acta; las cuotas contra posesión pasan a vencer ese día' })
  registrarEntrega(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: EntregaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.registrarEntrega(id, dto, user.empresa_id, user.id);
  }

  @Patch('operaciones/:id/entrega')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_OBSERVACION_EDITAR')
  actualizarEntrega(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: UpdateEntregaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.actualizarEntrega(id, dto, user.empresa_id, user.id);
  }

  @Post('operaciones/:id/entrega/observaciones')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_OBSERVACION_EDITAR')
  agregarObservacion(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: ObservacionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.agregarObservacion(id, dto, user.empresa_id);
  }

  @Patch('entrega-observaciones/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_POS_OBSERVACION_EDITAR')
  actualizarObservacion(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: UpdateObservacionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.actualizarObservacion(id, dto, user.empresa_id, user.id);
  }
}
