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

export class ArqueoDetalleItemDto {
  @ApiPropertyOptional({ description: 'ID de la moneda' })
  @IsOptional()
  @IsUUID()
  moneda_id?: string;

  @ApiProperty({ description: 'Tipo: efectivo, tarjeta, transferencia, cheque, otro' })
  @IsNotEmpty()
  @IsString()
  tipo: string;

  @ApiPropertyOptional({ description: 'Valor de la denominación (ej: 50000)' })
  @IsOptional()
  @IsNumber()
  denominacion?: number;

  @ApiProperty({ description: 'Cantidad contada', default: 0 })
  @IsNumber()
  cantidad: number;

  @ApiProperty({ description: 'Subtotal = denominación × cantidad' })
  @IsNumber()
  subtotal: number;

  @ApiPropertyOptional({ description: 'Observación del ítem' })
  @IsOptional()
  @IsString()
  observacion?: string;
}

export class CerrarCajaDto {
  @ApiProperty({ example: 500000, description: 'Monto contado en efectivo' })
  @IsNotEmpty()
  @IsNumber()
  @Min(0)
  monto_cierre: number;

  @ApiPropertyOptional({ example: 'Cierre sin novedades', description: 'Observaciones del cierre' })
  @IsOptional()
  @IsString()
  observaciones?: string;

  @ApiPropertyOptional({ description: 'Token de autorización del supervisor' })
  @IsOptional()
  @IsString()
  token_autorizacion?: string;

  @ApiPropertyOptional({ description: 'Detalle del arqueo por denominación/medio', type: [ArqueoDetalleItemDto] })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => ArqueoDetalleItemDto)
  arqueo_detalle?: ArqueoDetalleItemDto[];

  @ApiPropertyOptional({ description: 'Fingerprint del dispositivo' })
  @IsOptional()
  @IsString()
  dispositivo_fingerprint?: string;
}
