import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  IsBoolean,
  IsDateString,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Min,
  ValidateNested,
} from 'class-validator';

/** Detalle del primer adelanto (opcional cuando sin_adelanto=true). */
export class CreateAdelantoDto {
  @ApiProperty() @IsNumber() @Min(0.01) monto!: number;
  @ApiProperty() @IsDateString() fecha!: string;
  @ApiPropertyOptional() @IsOptional() @IsUUID() medio_pago_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsUUID() tes_cuenta_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() numero_operacion?: string;
  @ApiPropertyOptional() @IsOptional() @IsUUID() banco_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() observaciones?: string;

  // Datos de cheque (si medio_pago es CHEQUE)
  @ApiPropertyOptional() @IsOptional() @IsString() numero_cheque?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() banco_emisor?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() titular_cheque?: string;
  @ApiPropertyOptional() @IsOptional() @IsDateString() fecha_emision_cheque?: string;
  @ApiPropertyOptional() @IsOptional() @IsDateString() fecha_vencimiento_cheque?: string;
}

export class CreateRendicionViaticoDto {
  @ApiProperty() @IsUUID() empleado_id!: string;
  @ApiProperty() @IsString() @IsNotEmpty() concepto!: string;
  @ApiProperty() @IsDateString() fecha_inicio!: string;
  @ApiProperty() @IsDateString() fecha_fin!: string;

  @ApiPropertyOptional({ default: false })
  @IsOptional()
  @IsBoolean()
  sin_adelanto?: boolean;

  @ApiPropertyOptional() @IsOptional() @IsUUID() moneda_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsNumber() @Min(0) cotizacion?: number;
  @ApiPropertyOptional() @IsOptional() @IsString() observaciones?: string;

  /**
   * Primer adelanto (opcional). Si viene, se ejecuta en el mismo request.
   * Si `sin_adelanto=true`, se ignora.
   */
  @ApiPropertyOptional({ type: CreateAdelantoDto })
  @IsOptional()
  @ValidateNested()
  @Type(() => CreateAdelantoDto)
  primer_adelanto?: CreateAdelantoDto;
}
