import { ApiProperty } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import { IsArray, IsBoolean, IsIn, IsInt, IsNumber, IsOptional, IsString, IsUUID, Max, Min } from 'class-validator';

export class CreatePosConfigDto {
  @ApiProperty({ description: 'ID de la caja' })
  @IsUUID()
  caja_id: string;

  @ApiProperty({
    description: 'Tipo de POS: admin (administrativo) o retail (ventas rápidas)',
    default: 'admin',
  })
  @IsOptional()
  @IsString()
  @IsIn(['admin', 'retail'])
  tipo_pos?: string;

  @ApiProperty({ description: 'Modo fullscreen', default: true })
  @IsOptional()
  @IsBoolean()
  fullscreen?: boolean;

  @ApiProperty({
    description: 'Layout: grid, list, categories',
    default: 'grid',
  })
  @IsOptional()
  @IsString()
  layout?: string;

  @ApiProperty({ description: 'Mostrar imagen de producto', default: true })
  @IsOptional()
  @IsBoolean()
  show_product_image?: boolean;

  @ApiProperty({ description: 'Mostrar precio de producto', default: true })
  @IsOptional()
  @IsBoolean()
  show_product_price?: boolean;

  @ApiProperty({ description: 'Mostrar stock de producto', default: true })
  @IsOptional()
  @IsBoolean()
  show_product_stock?: boolean;

  @ApiProperty({
    description: 'Tamaño de tarjeta: small, medium, large',
    default: 'medium',
  })
  @IsOptional()
  @IsString()
  card_size?: string;

  @ApiProperty({
    description: 'Posición de categorías: left, top, hidden',
    default: 'left',
  })
  @IsOptional()
  @IsString()
  categories_position?: string;

  @ApiProperty({
    description: 'Posición de numpad: right, bottom, hidden',
    default: 'right',
  })
  @IsOptional()
  @IsString()
  numpad_position?: string;

  @ApiProperty({ description: 'Habilitar mesas', default: false })
  @IsOptional()
  @IsBoolean()
  enable_tables?: boolean;

  @ApiProperty({ description: 'Habilitar delivery', default: false })
  @IsOptional()
  @IsBoolean()
  enable_delivery?: boolean;

  @ApiProperty({ description: 'Habilitar venta rápida', default: true })
  @IsOptional()
  @IsBoolean()
  enable_quick_sale?: boolean;

  @ApiProperty({
    description: 'Vista por defecto: products, categories, favorites',
    default: 'products',
  })
  @IsOptional()
  @IsString()
  default_view?: string;

  @ApiProperty({
    description: 'Permitir venta sin stock disponible',
    default: true,
  })
  @IsOptional()
  @IsBoolean()
  permitir_venta_sin_stock?: boolean;

  @ApiProperty({
    description: 'ID del cliente por defecto (consumidor final)',
    required: false,
  })
  @IsOptional()
  @IsUUID()
  cliente_default_id?: string;

  @ApiProperty({
    description: 'ID del depósito por defecto para descontar stock',
    required: false,
  })
  @IsOptional()
  @IsUUID()
  deposito_default_id?: string;

  @ApiProperty({
    description: 'Tamaño de tiles en POS Retail: small, medium, large',
    default: 'medium',
  })
  @IsOptional()
  @IsString()
  @IsIn(['small', 'medium', 'large'])
  retail_tile_size?: string;

  @ApiProperty({
    description: 'Columnas fijas en grid POS Retail (0 = auto)',
    default: 0,
  })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(12)
  retail_grid_columns?: number;

  @ApiProperty({
    description: 'ID de la moneda por defecto para POS Retail',
    required: false,
  })
  @IsOptional()
  @IsUUID()
  moneda_default_id?: string;

  @ApiProperty({
    description: 'Nombre de la impresora para QZ Tray (impresión silenciosa)',
    required: false,
  })
  @IsOptional()
  @IsString()
  printer_name?: string;

  @ApiProperty({
    description: 'Ancho de papel de la impresora térmica en mm (58 o 80)',
    default: 80,
  })
  @IsOptional()
  @IsInt()
  @Min(40)
  @Max(120)
  printer_paper_width?: number;

  @ApiProperty({
    description: 'Auto-imprimir ticket después de cada venta',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  auto_print_ticket?: boolean;

  @ApiProperty({ description: 'Habilitar impresión móvil vía Novasis Print (requiere módulo PRINT_MOBILE)', default: false })
  @IsOptional()
  @IsBoolean()
  print_mobile_enabled?: boolean;

  @ApiProperty({ description: 'Requiere autorización de supervisor para apertura de caja', default: false })
  @IsOptional()
  @IsBoolean()
  requiere_autorizacion_apertura?: boolean;

  @ApiProperty({ description: 'Requiere autorización de supervisor para cierre de caja', default: false })
  @IsOptional()
  @IsBoolean()
  requiere_autorizacion_cierre?: boolean;

  @ApiProperty({ description: 'Monto de fondo fijo de caja', required: false })
  @IsOptional()
  @Transform(({ value }) => (value === '' || value === null || value === undefined ? undefined : Number(value)))
  @IsNumber({}, { message: 'fondo_fijo debe ser un número válido' })
  fondo_fijo?: number;

  @ApiProperty({ description: 'Diferencia máxima permitida en arqueo de cierre', default: 0 })
  @IsOptional()
  @Transform(({ value }) => (value === '' || value === null || value === undefined ? 0 : Number(value)))
  @IsNumber({}, { message: 'diferencia_arqueo_permitida debe ser un número válido' })
  diferencia_arqueo_permitida?: number;

  @ApiProperty({ description: 'Requiere arqueo detallado por denominación al cerrar caja', default: true })
  @IsOptional()
  @IsBoolean()
  requiere_arqueo_cierre?: boolean;

  // ── Ventas a crédito ───────────────────────────────────────────────────────

  @ApiProperty({
    description:
      'Permite facturar a crédito desde POS retail. Opt-in por caja: apagado, la caja solo vende al contado.',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  permitir_venta_credito?: boolean;

  // ── Modo estación de servicio ──────────────────────────────────────────────

  @ApiProperty({
    description:
      'Permite cargar el monto del ítem y derivar la cantidad (sólo unidades LT y kg). Opt-in por caja.',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  permitir_editar_monto?: boolean;

  @ApiProperty({
    description:
      'Decimales de la cantidad. Acompaña a permitir_editar_monto: con 2 el total no cierra ' +
      'contra el monto tipeado. Tope 4 = precisión de factura_det.dcantproser.',
    default: 2,
  })
  @IsOptional()
  @Transform(({ value }) => (value === '' || value === null || value === undefined ? undefined : Number(value)))
  @IsInt({ message: 'decimales_cantidad debe ser un entero' })
  @Min(0)
  @Max(4)
  decimales_cantidad?: number;

  @ApiProperty({
    description: 'Montos rápidos del modo estación (ej: [10000, 50000, 100000]).',
    required: false,
    type: [Number],
  })
  @IsOptional()
  @IsArray()
  @IsNumber({}, { each: true, message: 'montos_rapidos debe ser una lista de números' })
  montos_rapidos?: number[];
}
