import {
  IsString,
  IsNotEmpty,
  IsEnum,
  IsOptional,
  IsNumber,
  IsDateString,
  Length,
  Min,
  Max,
} from 'class-validator';
import { TipoUbicacionCartaPorte } from '../entities';

/**
 * DTO para agregar ubicacion a Carta Porte
 * Soporta origen, destinos intermedios y destino final
 */
export class CreateUbicacionCartaPorteDto {
  /**
   * Tipo de ubicacion: Origen o Destino
   */
  @IsEnum(TipoUbicacionCartaPorte, { message: 'tipoUbicacion debe ser Origen o Destino' })
  @IsNotEmpty()
  tipoUbicacion!: TipoUbicacionCartaPorte;

  /**
   * ID de ubicacion (catalogo SAT c_CodigoPostal)
   */
  @IsOptional()
  @IsString()
  idUbicacion?: string;

  /**
   * RFC del remitente o destinatario
   */
  @IsOptional()
  @IsString()
  @Length(12, 13)
  rfcRemitenteDestinatario?: string;

  /**
   * Nombre del remitente o destinatario
   */
  @IsOptional()
  @IsString()
  @Length(1, 254)
  nombreRemitenteDestinatario?: string;

  /**
   * Numero de estacion (para transporte ferroviario)
   */
  @IsOptional()
  @IsString()
  numEstacion?: string;

  /**
   * Nombre de la estacion
   */
  @IsOptional()
  @IsString()
  nombreEstacion?: string;

  /**
   * Fecha y hora de salida (para origen)
   */
  @IsOptional()
  @IsDateString()
  fechaHoraSalidaLlegada?: string;

  /**
   * Distancia recorrida en KM (0 para origen)
   */
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(10000)
  distanciaRecorrida?: number;

  // ========== DOMICILIO ==========

  /**
   * Codigo postal (catalogo SAT, requerido)
   */
  @IsString()
  @IsNotEmpty({ message: 'codigoPostal es requerido' })
  @Length(5, 5, { message: 'codigoPostal debe ser de 5 digitos' })
  codigoPostal!: string;

  /**
   * Estado (catalogo SAT c_Estado)
   */
  @IsOptional()
  @IsString()
  @Length(2, 3)
  estado?: string;

  /**
   * Municipio (catalogo SAT c_Municipio)
   */
  @IsOptional()
  @IsString()
  municipio?: string;

  /**
   * Localidad (catalogo SAT c_Localidad)
   */
  @IsOptional()
  @IsString()
  localidad?: string;

  /**
   * Colonia (catalogo SAT c_Colonia)
   */
  @IsOptional()
  @IsString()
  colonia?: string;

  /**
   * Calle
   */
  @IsOptional()
  @IsString()
  @Length(1, 100)
  calle?: string;

  /**
   * Numero exterior
   */
  @IsOptional()
  @IsString()
  @Length(1, 55)
  numExterior?: string;

  /**
   * Numero interior
   */
  @IsOptional()
  @IsString()
  @Length(1, 30)
  numInterior?: string;

  /**
   * Referencia geografica
   */
  @IsOptional()
  @IsString()
  @Length(1, 250)
  referencia?: string;

  /**
   * Numero de secuencia (orden de visita, 1=origen)
   */
  @IsNumber()
  @IsNotEmpty()
  @Min(1)
  numeroSecuencia!: number;
}

/**
 * DTO para actualizar ubicacion
 */
export class UpdateUbicacionCartaPorteDto {
  @IsOptional()
  @IsDateString()
  fechaHoraSalidaLlegada?: string;

  @IsOptional()
  @IsNumber()
  @Min(0)
  distanciaRecorrida?: number;

  @IsOptional()
  @IsString()
  @Length(1, 250)
  referencia?: string;
}
