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

/**
 * Ítem de gasto de rendición.
 * - Con factura: obligatorio tipo_gasto_id.
 * - Sin factura: obligatorio tipo_gasto_id + descripcion libre.
 */
export class GastoRendicionItemDto {
  @ApiProperty() @IsUUID() tipo_gasto_id!: string;
  @ApiPropertyOptional() @IsOptional() @IsString() descripcion?: string;
  @ApiProperty() @IsNumber({ maxDecimalPlaces: 4 }) @Min(0.0001) cantidad!: number;
  @ApiProperty() @IsNumber({ maxDecimalPlaces: 4 }) @Min(0) precio_unitario!: number;

  @ApiPropertyOptional({ description: 'IVA % (0, 5 o 10). Ignorado si sin_factura=true.' })
  @IsOptional()
  @IsIn([0, 5, 10])
  porcentaje_iva?: number;
}

/**
 * Alta de gasto vinculado a una rendición de viáticos.
 * Modo con_factura=false → solo descripción + monto + tipo (sin proveedor/timbrado).
 * Modo con_factura=true → flujo completo tipo gasto normal.
 */
export class CreateGastoRendicionDto {
  @ApiProperty({ description: 'Si true, el gasto es deducible con IVA crédito.' })
  @IsBoolean()
  con_factura!: boolean;

  // ── Documentos fiscales (solo si con_factura=true) ────────────────────────

  @ApiPropertyOptional() @IsOptional() @IsUUID() proveedor_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() ruc?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() timbrado?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() establecimiento?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() punto_expedicion?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() numero_factura?: string;

  /**
   * Comprobante preimpreso (talonario físico). false = electrónico: la DNIT ya lo
   * tiene por el documento del proveedor y no se declara en el Libro IVA Compras.
   */
  @ApiPropertyOptional({ default: true }) @IsOptional() @IsBoolean() es_preimpreso?: boolean;

  // ── Comunes ──────────────────────────────────────────────────────────────

  @ApiProperty() @IsDateString() fecha_emision!: string;
  @ApiPropertyOptional() @IsOptional() @IsString() descripcion?: string;
  @ApiPropertyOptional() @IsOptional() @IsUUID() sucursal_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsUUID() moneda_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsNumber() cotizacion?: number;

  @ApiProperty({ type: [GastoRendicionItemDto] })
  @IsArray()
  @ArrayMinSize(1)
  @ValidateNested({ each: true })
  @Type(() => GastoRendicionItemDto)
  items!: GastoRendicionItemDto[];
}
