import { ArrayMinSize, IsArray, IsBoolean, IsDateString, IsIn, IsInt, IsObject, IsOptional, IsString, IsUUID, Max, MaxLength, Min } from 'class-validator';
import type { CondicionRegla, DimensionesDocumento } from '../services/reglas-mapeo';

/**
 * Reglas de cuenta por dimensión (spec 2026-10-13). Las condiciones se validan
 * en el servicio con `validarCondiciones` (mismo mensaje para la API y la
 * pantalla), por eso acá solo se pide que sea una lista.
 */
export class GuardarReglaMapeoDto {
  @IsString()
  @MaxLength(50)
  concepto: string;

  @IsArray()
  condiciones: CondicionRegla[];

  @IsOptional()
  @IsIn(['CUENTA', 'SUMAR_A_PRINCIPAL'])
  modo?: 'CUENTA' | 'SUMAR_A_PRINCIPAL';

  @IsOptional()
  @IsUUID()
  cuenta_id?: string | null;

  /** Fecha contable desde la que aplica (YYYY-MM-DD). */
  @IsDateString()
  vigente_desde: string;

  @IsOptional()
  @IsString()
  @MaxLength(200)
  descripcion?: string | null;
}

export class OrdenReglasDto {
  @IsString()
  @MaxLength(50)
  concepto: string;

  @IsArray()
  @ArrayMinSize(1)
  @IsUUID('all', { each: true })
  ids: string[];
}

export class RetirarReglaDto {
  /** Hasta qué fecha contable (sin incluir) aplica; por defecto hoy. Igual al inicio = nunca aplicó. */
  @IsOptional()
  @IsDateString()
  vigenteHasta?: string;
}

export class ProbadorReglaDto {
  @IsString()
  @MaxLength(50)
  concepto: string;

  @IsObject()
  dimensiones: DimensionesDocumento;

  @IsOptional()
  @IsDateString()
  fecha?: string;

  @IsOptional()
  @IsBoolean()
  incluirBorradores?: boolean;
}

export class VistaPreviaMapeoDto {
  @IsString()
  @MaxLength(60)
  origenTipo: string;

  @IsUUID()
  origenId: string;

  @IsOptional()
  @IsBoolean()
  incluirBorradores?: boolean;
}

export class ProbarMapeoDto {
  @IsString()
  @MaxLength(60)
  origenTipo: string;

  @IsOptional()
  @IsInt()
  @Min(1)
  @Max(100)
  ultimos?: number;

  @IsOptional()
  @IsBoolean()
  incluirBorradores?: boolean;
}
