import {
  IsString,
  IsNotEmpty,
  IsEnum,
  IsOptional,
  IsArray,
  ValidateNested,
  Length,
  Matches,
} from 'class-validator';
import { Type } from 'class-transformer';
import { TipoFiguraTransporte } from '../entities';

/**
 * DTO para partes de transporte (propietario/arrendador)
 */
export class PartesTransporteDto {
  @IsString()
  @IsNotEmpty()
  parteTransporte!: string;
}

/**
 * DTO para domicilio de figura de transporte
 */
export class DomicilioFiguraDto {
  @IsOptional()
  @IsString()
  @Length(2, 3)
  pais?: string;

  @IsOptional()
  @IsString()
  @Length(2, 3)
  estado?: string;

  @IsOptional()
  @IsString()
  @Length(5, 5)
  codigoPostal?: string;

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

  @IsOptional()
  @IsString()
  @Length(1, 55)
  numExterior?: string;

  @IsOptional()
  @IsString()
  @Length(1, 30)
  numInterior?: string;

  @IsOptional()
  @IsString()
  @Length(1, 100)
  colonia?: string;

  @IsOptional()
  @IsString()
  @Length(1, 100)
  municipio?: string;

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

/**
 * DTO para agregar figura de transporte a Carta Porte
 * Tipos: Operador (01), Propietario (02), Arrendador (03), Notificado (04)
 */
export class CreateFiguraTransporteDto {
  /**
   * Tipo de figura de transporte (catalogo c_TipoFiguraTransporte)
   * 01 = Operador
   * 02 = Propietario
   * 03 = Arrendador
   * 04 = Notificado
   */
  @IsEnum(TipoFiguraTransporte, { message: 'tipoFigura debe ser 01, 02, 03 o 04' })
  @IsNotEmpty()
  tipoFigura!: TipoFiguraTransporte;

  /**
   * RFC de la figura (opcional para operadores extranjeros)
   */
  @IsOptional()
  @IsString()
  @Matches(/^([A-Z&Ñ]{3,4}[0-9]{6}[A-Z0-9]{3}|XEXX010101000)$/, {
    message: 'rfcFigura debe ser un RFC valido o extranjero generico',
  })
  rfcFigura?: string;

  /**
   * Nombre de la figura de transporte
   */
  @IsString()
  @IsNotEmpty({ message: 'nombreFigura es requerido' })
  @Length(1, 254)
  nombreFigura!: string;

  /**
   * Numero de licencia (requerido para operadores tipo 01)
   */
  @IsOptional()
  @IsString()
  @Length(1, 16)
  numLicencia?: string;

  /**
   * Numero de registro tributario (para extranjeros)
   */
  @IsOptional()
  @IsString()
  @Length(1, 40)
  numRegIdTribFigura?: string;

  /**
   * Residencia fiscal (ISO 3166-1 alpha-3, para extranjeros)
   */
  @IsOptional()
  @IsString()
  @Length(3, 3)
  residenciaFiscalFigura?: string;

  /**
   * Partes de transporte (para propietario/arrendador)
   */
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => PartesTransporteDto)
  partesTransporte?: PartesTransporteDto[];

  /**
   * Domicilio de la figura
   */
  @IsOptional()
  @ValidateNested()
  @Type(() => DomicilioFiguraDto)
  domicilio?: DomicilioFiguraDto;
}

/**
 * DTO para actualizar figura de transporte
 */
export class UpdateFiguraTransporteDto {
  @IsOptional()
  @IsString()
  @Length(1, 254)
  nombreFigura?: string;

  @IsOptional()
  @IsString()
  @Length(1, 16)
  numLicencia?: string;

  @IsOptional()
  @ValidateNested()
  @Type(() => DomicilioFiguraDto)
  domicilio?: DomicilioFiguraDto;
}
