import {
  IsString,
  IsNotEmpty,
  IsOptional,
  IsNumber,
  IsArray,
  ValidateNested,
  Length,
  Min,
  Max,
} from 'class-validator';
import { Type } from 'class-transformer';

/**
 * DTO para remolque/semirremolque
 */
export class RemolqueDto {
  /**
   * Subtipo de remolque (catalogo c_SubTipoRem)
   */
  @IsString()
  @IsNotEmpty()
  @Length(4, 4)
  subTipoRem!: string;

  /**
   * Placa del remolque
   */
  @IsString()
  @IsNotEmpty()
  @Length(6, 8)
  placa!: string;
}

/**
 * DTO para agregar datos de autotransporte a Carta Porte
 */
export class CreateAutotransporteDto {
  /**
   * Tipo de permiso SCT (catalogo c_TipoPermiso)
   * TPAF01 = Autotransporte Federal de Carga General
   * TPAF02 = Autotransporte Federal de Mudanzas
   * etc.
   */
  @IsString()
  @IsNotEmpty({ message: 'permSCT es requerido' })
  @Length(4, 10)
  permSCT!: string;

  /**
   * Numero de permiso SCT
   */
  @IsString()
  @IsNotEmpty({ message: 'numPermisoSCT es requerido' })
  @Length(1, 50)
  numPermisoSCT!: string;

  /**
   * Configuracion vehicular (catalogo c_ConfigAutotransporte)
   * C2 = Camion Unitario (2 llantas eje delantero, 4-8 trasero)
   * C3 = Camion Unitario (3 ejes)
   * T3S2 = Tractocamion con semirremolque
   * etc.
   */
  @IsString()
  @IsNotEmpty({ message: 'configVehicular es requerida' })
  configVehicular!: string;

  /**
   * Placa del vehiculo motor
   */
  @IsString()
  @IsNotEmpty({ message: 'placaVM es requerida' })
  @Length(6, 8, { message: 'placaVM debe tener entre 6 y 8 caracteres' })
  placaVM!: string;

  /**
   * Año modelo del vehiculo
   */
  @IsOptional()
  @IsNumber()
  @Min(1990)
  @Max(2100)
  anioModeloVM?: number;

  /**
   * Remolques (maximo 2)
   */
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => RemolqueDto)
  remolques?: RemolqueDto[];
}

/**
 * DTO para actualizar autotransporte
 */
export class UpdateAutotransporteDto {
  @IsOptional()
  @IsString()
  @Length(1, 50)
  numPermisoSCT?: string;

  @IsOptional()
  @IsString()
  @Length(6, 8)
  placaVM?: string;

  @IsOptional()
  @IsNumber()
  @Min(1990)
  anioModeloVM?: number;

  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => RemolqueDto)
  remolques?: RemolqueDto[];
}
