import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsEnum, IsObject, IsOptional, IsString, IsUUID } from 'class-validator';

export enum EstadoAutorizacionCaja {
  PENDIENTE = 'pendiente',
  APROBADA = 'aprobada',
  RECHAZADA = 'rechazada',
  EXPIRADA = 'expirada',
  // Aprobada y ya consumida por la operación que la solicitó (p. ej. una factura
  // con descuento por encima del tope). Evita reusar la misma autorización dos veces.
  UTILIZADA = 'utilizada',
}

export enum TipoAutorizacionCaja {
  APERTURA_CAJA = 'apertura_caja',
  CIERRE_CAJA = 'cierre_caja',
  ANULACION_VENTA = 'anulacion_venta',
  DESCUENTO = 'descuento',
  RETIRO_CAJA = 'retiro_caja',
  INGRESO_CAJA = 'ingreso_caja',
  NOTA_CREDITO = 'nota_credito',
  CAMBIO_PRECIO = 'cambio_precio',
  VENTA_CREDITO = 'venta_credito',
  ARQUEO_DIFERENCIA = 'arqueo_diferencia',
  CANCELAR_CIERRE = 'cancelar_cierre',
}

export class CrearAutorizacionDto {
  @ApiPropertyOptional({ description: 'ID de la sesión de caja (opcional)' })
  @IsOptional()
  @IsUUID()
  sesion_caja_id?: string;

  @ApiProperty({ description: 'Tipo de autorización', enum: TipoAutorizacionCaja })
  @IsEnum(TipoAutorizacionCaja)
  tipo: TipoAutorizacionCaja;

  @ApiPropertyOptional({ description: 'Motivo de la solicitud' })
  @IsOptional()
  @IsString()
  motivo?: string;

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

  @ApiPropertyOptional({ description: 'IP del solicitante' })
  @IsOptional()
  @IsString()
  ip_solicitante?: string;

  @ApiPropertyOptional({ description: 'Contexto adicional de la operación' })
  @IsOptional()
  @IsObject()
  contexto?: Record<string, unknown>;
}
