import { Body, Controller, Get, Post, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, IsString, MaxLength } from 'class-validator';
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 { CrmPruebaService } from './crm-prueba.service';

export class IniciarPruebaDto {
  @ApiProperty({ example: 'CRM_CONTRATOS', description: 'Código del submódulo a probar.' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(40)
  codigo: string;
}

/**
 * Estado del período de prueba. NO lleva @RequireSubmodulo: justamente tiene que
 * seguir respondiendo cuando la prueba venció, para que el panel pueda mostrar
 * el cartel de "contratá el add-on" en vez de un 403 sin explicación.
 */
@ApiTags('CRM · Período de prueba')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard)
@RequireModule('CRM')
@Controller({ path: 'crm/prueba', version: '1' })
export class CrmPruebaController {
  constructor(private readonly pruebaService: CrmPruebaService) {}

  @Get('estado')
  @ApiOperation({ summary: 'Estado de prueba de cada submódulo del CRM para la empresa' })
  estado(@GetUser() user: LoginUserInfo) {
    return this.pruebaService.estadoCrm(user.empresa_id);
  }

  @Post('iniciar')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_CFG_PRUEBA_INICIAR')
  @ApiOperation({ summary: 'Arranca el período de prueba de un submódulo. Una sola vez por empresa.' })
  @ApiBody({ type: IniciarPruebaDto })
  iniciar(@Body(ValidationPipe) dto: IniciarPruebaDto, @GetUser() user: LoginUserInfo) {
    return this.pruebaService.iniciarPrueba(user.empresa_id, dto.codigo, user.id);
  }
}
