import {
  IsString,
  IsOptional,
  IsBoolean,
  IsNumber,
  IsUUID,
  IsEnum,
  IsDateString,
  MaxLength,
  Min,
} from 'class-validator';
import { TipoTarifa } from '../entities';

/**
 * DTO for creating a tarifa
 */
export class CreateTarifaDto {
  @IsString()
  @MaxLength(50)
  codigo: string;

  @IsString()
  @MaxLength(200)
  nombre: string;

  @IsOptional()
  @IsString()
  descripcion?: string;

  @IsOptional()
  @IsUUID()
  clienteId?: string;

  @IsOptional()
  @IsUUID()
  laneId?: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  modalidadServicio?: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  tipoEquipo?: string;

  @IsEnum(TipoTarifa)
  tipoTarifa: TipoTarifa;

  @IsNumber()
  @Min(0)
  tarifaBase: number;

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

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

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

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

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

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

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

  @IsOptional()
  @IsString()
  @MaxLength(3)
  moneda?: string;

  @IsDateString()
  fechaInicio: string;

  @IsOptional()
  @IsDateString()
  fechaFin?: string;
}

/**
 * DTO for updating a tarifa
 */
export class UpdateTarifaDto {
  @IsOptional()
  @IsString()
  @MaxLength(50)
  codigo?: string;

  @IsOptional()
  @IsString()
  @MaxLength(200)
  nombre?: string;

  @IsOptional()
  @IsString()
  descripcion?: string;

  @IsOptional()
  @IsUUID()
  clienteId?: string;

  @IsOptional()
  @IsUUID()
  laneId?: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  modalidadServicio?: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  tipoEquipo?: string;

  @IsOptional()
  @IsEnum(TipoTarifa)
  tipoTarifa?: TipoTarifa;

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

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

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

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

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

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

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

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

  @IsOptional()
  @IsString()
  @MaxLength(3)
  moneda?: string;

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

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

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

/**
 * DTO for cloning a tarifa
 */
export class ClonarTarifaDto {
  @IsString()
  @MaxLength(50)
  nuevoCodigo: string;

  @IsDateString()
  nuevaFechaInicio: string;

  @IsOptional()
  @IsDateString()
  nuevaFechaFin?: string;
}
