import {
  IsString,
  IsNotEmpty,
  IsOptional,
  IsNumber,
  IsBoolean,
  Length,
  Min,
  Max,
} from 'class-validator';

/**
 * DTO para agregar mercancia a Carta Porte
 * Segun especificacion SAT CFDI 3.1
 */
export class CreateMercanciaCartaPorteDto {
  /**
   * Clave de bienes transportados (catalogo SAT c_ClaveProdServCP)
   */
  @IsString()
  @IsNotEmpty({ message: 'bienesTransp es requerido' })
  @Length(6, 8, { message: 'bienesTransp debe ser codigo SAT de 6-8 caracteres' })
  bienesTransp!: string;

  /**
   * Descripcion de la mercancia
   */
  @IsString()
  @IsNotEmpty({ message: 'descripcion es requerida' })
  @Length(1, 1000)
  descripcion!: string;

  /**
   * Cantidad
   */
  @IsNumber()
  @IsNotEmpty()
  @Min(0.001)
  cantidad!: number;

  /**
   * Clave de unidad SAT (catalogo c_ClaveUnidad)
   */
  @IsString()
  @IsNotEmpty({ message: 'claveUnidad es requerida' })
  @Length(2, 3)
  claveUnidad!: string;

  /**
   * Descripcion de la unidad
   */
  @IsOptional()
  @IsString()
  @Length(1, 100)
  unidad?: string;

  /**
   * Peso en KG
   */
  @IsNumber()
  @IsNotEmpty({ message: 'pesoEnKg es requerido' })
  @Min(0.001)
  @Max(100000)
  pesoEnKg!: number;

  /**
   * Valor de la mercancia
   */
  @IsOptional()
  @IsNumber()
  @Min(0)
  valorMercancia?: number;

  /**
   * Moneda del valor (default MXN)
   */
  @IsOptional()
  @IsString()
  @Length(3, 3)
  moneda?: string;

  // ========== DIMENSIONES (para calculo de volumen) ==========

  /**
   * Longitud en cm
   */
  @IsOptional()
  @IsNumber()
  @Min(0)
  dimensionesLargo?: number;

  /**
   * Ancho en cm
   */
  @IsOptional()
  @IsNumber()
  @Min(0)
  dimensionesAncho?: number;

  /**
   * Alto en cm
   */
  @IsOptional()
  @IsNumber()
  @Min(0)
  dimensionesAlto?: number;

  // ========== MATERIAL PELIGROSO ==========

  /**
   * Indica si es material peligroso
   */
  @IsOptional()
  @IsBoolean()
  materialPeligroso?: boolean;

  /**
   * Clave de material peligroso (catalogo c_MaterialPeligroso)
   */
  @IsOptional()
  @IsString()
  @Length(4, 4)
  cveMaterialPeligroso?: string;

  /**
   * Tipo de embalaje (catalogo c_TipoEmbalaje)
   */
  @IsOptional()
  @IsString()
  embalaje?: string;

  /**
   * Descripcion del embalaje
   */
  @IsOptional()
  @IsString()
  @Length(1, 100)
  descripEmbalaje?: string;

  // ========== COMERCIO EXTERIOR ==========

  /**
   * Fraccion arancelaria
   */
  @IsOptional()
  @IsString()
  @Length(8, 10)
  fraccionArancelaria?: string;

  /**
   * UUID de comercio exterior
   */
  @IsOptional()
  @IsString()
  uuidComercioExt?: string;

  // ========== GUIAS ==========

  /**
   * Numero de guia o conocimiento de embarque
   */
  @IsOptional()
  @IsString()
  @Length(1, 30)
  guiaIdentificacion?: string;

  /**
   * Descripcion de guia
   */
  @IsOptional()
  @IsString()
  guiaDescripcion?: string;

  /**
   * Peso de guia en KG
   */
  @IsOptional()
  @IsNumber()
  @Min(0)
  guiaPesoKg?: number;

  /**
   * Numero de secuencia de la mercancia
   */
  @IsNumber()
  @IsNotEmpty()
  @Min(1)
  numeroSecuencia!: number;
}

/**
 * DTO para actualizar mercancia
 */
export class UpdateMercanciaCartaPorteDto {
  @IsOptional()
  @IsString()
  @Length(1, 1000)
  descripcion?: string;

  @IsOptional()
  @IsNumber()
  @Min(0.001)
  cantidad?: number;

  @IsOptional()
  @IsNumber()
  @Min(0.001)
  pesoEnKg?: number;

  @IsOptional()
  @IsNumber()
  @Min(0)
  valorMercancia?: number;
}
