import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
    IsArray,
    IsBoolean,
    IsNotEmpty,
    IsNumber,
    IsOptional,
    IsString,
    IsUUID,
    MaxLength,
    Min,
    ValidateNested,
} from 'class-validator';

export class PlanAddonDto {
  @ApiProperty({ description: 'ID del submódulo addon' })
  @IsUUID()
  submodulo_id: string;

  @ApiPropertyOptional({
    description: 'Precio override del addon en este plan (en Gs). Si se omite, se usa el precio default del submódulo.',
  })
  @IsNumber()
  @IsOptional()
  @Min(0)
  precio_override?: number;
}

export class CreatePlaneDto {
  @ApiProperty({ description: 'Código único del plan', example: 'PLAN-PRO' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(16)
  codigo: string;

  @ApiProperty({
    description: 'Nombre/descripción del plan',
    example: 'Plan Profesional',
  })
  @IsString()
  @IsNotEmpty()
  @MaxLength(60)
  descripcion: string;

  @ApiProperty({ description: 'Precio del plan por ciclo', example: 150000 })
  @IsNumber()
  @Min(0)
  precio: number;

  @ApiPropertyOptional({
    description: 'Tipo de ciclo de facturación',
    example: 'mensual',
    default: 'mensual',
  })
  @IsString()
  @IsOptional()
  tipo_ciclo?: string;

  @ApiProperty({ description: 'Máximo de usuarios permitidos', example: 5 })
  @IsNumber()
  @Min(1)
  max_user: number;

  @ApiProperty({ description: 'Máximo de productos permitidos, 0 = ilimitado', example: 1000 })
  @IsNumber()
  @Min(0)
  max_producto: number;

  @ApiProperty({ description: 'Máximo de documentos por ciclo, 0 = ilimitado', example: 500 })
  @IsNumber()
  @Min(0)
  max_documentos: number;

  @ApiPropertyOptional({
    description: 'Días de período de prueba',
    example: 7,
    default: 0,
  })
  @IsNumber()
  @IsOptional()
  @Min(0)
  periodo_prueba?: number;

  @ApiPropertyOptional({
    description: 'Máximo de documentos durante prueba',
    example: 10,
  })
  @IsNumber()
  @IsOptional()
  @Min(0)
  max_documento_prueba?: number;

  @ApiPropertyOptional({
    description: 'Días de gracia después del vencimiento',
    example: 5,
    default: 0,
  })
  @IsNumber()
  @IsOptional()
  @Min(0)
  dias_gracia?: number;

  @ApiPropertyOptional({
    description: 'Máximo de clientes permitidos',
    example: 500,
  })
  @IsNumber()
  @IsOptional()
  @Min(0)
  max_clientes?: number;

  @ApiPropertyOptional({
    description: 'Monto máximo de facturación por ciclo',
    example: 50000000,
  })
  @IsNumber()
  @IsOptional()
  @Min(0)
  monto_facturacion?: number;

  @ApiPropertyOptional({
    description: 'Máximo de empresas permitidas',
    example: 3,
  })
  @IsNumber()
  @IsOptional()
  @Min(0)
  max_empresas?: number;

  @ApiPropertyOptional({
    description: 'Máximo de sucursales permitidas',
    example: 5,
  })
  @IsNumber()
  @IsOptional()
  @Min(0)
  max_sucursales?: number;

  @ApiPropertyOptional({
    description: 'Cuota mensual de tokens de IA incluida en el plan (0 = no incluye IA de plataforma)',
    example: 1000000,
  })
  @IsNumber()
  @IsOptional()
  @Min(0)
  tokens_ia_mensual?: number;

  @ApiPropertyOptional({
    description: 'DEPRECATED — IDs de módulos legacy. Usar modulos_raiz_ids.',
    example: ['uuid-modulo-1', 'uuid-modulo-2'],
  })
  @IsArray()
  @IsOptional()
  modulos?: string[];

  @ApiPropertyOptional({
    description: 'IDs de módulos raíz incluidos en el plan',
    example: ['uuid-modulo-raiz-1'],
  })
  @IsArray()
  @IsOptional()
  @IsUUID('all', { each: true })
  modulos_raiz_ids?: string[];

  @ApiPropertyOptional({
    description: 'Addons (submódulos con es_addon=true) incluidos en el plan, con precio opcional override',
    type: [PlanAddonDto],
  })
  @IsArray()
  @IsOptional()
  @ValidateNested({ each: true })
  @Type(() => PlanAddonDto)
  addons?: PlanAddonDto[];

  @ApiPropertyOptional({
    description: 'IDs de submódulos no-addon explícitamente habilitados dentro de los módulos raíz seleccionados',
    example: ['uuid-submodulo-1'],
  })
  @IsArray()
  @IsOptional()
  @IsUUID('all', { each: true })
  submodulos_ids?: string[];

  @ApiPropertyOptional({
    description: 'Activar el plan inmediatamente',
    default: true,
  })
  @IsBoolean()
  @IsOptional()
  active?: boolean;
}
