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

export class SaleItemDto {
  @ApiProperty({
    description: 'ID del producto',
    required: true,
  })
  @IsUUID()
  @IsNotEmpty()
  productId: string;

  @ApiProperty({
    description: 'Cantidad vendida',
    example: 2,
    minimum: 0.001,
  })
  @IsNumber()
  @Min(0.001)
  quantity: number;

  @ApiProperty({
    description: 'Descuento en porcentaje (opcional)',
    example: 10,
    required: false,
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  discountPercent?: number;
}

export class CreateSaleDto {
  @ApiProperty({
    description: 'Lista de productos vendidos',
    type: [SaleItemDto],
  })
  @IsArray()
  @ArrayMinSize(1, { message: 'Debe incluir al menos un producto' })
  @ValidateNested({ each: true })
  @Type(() => SaleItemDto)
  items: SaleItemDto[];

  @ApiProperty({
    description: 'ID del método de pago',
    required: false,
  })
  @IsOptional()
  @IsUUID()
  paymentMethodId?: string;

  @ApiProperty({
    description: 'Monto recibido del cliente',
    example: 100,
  })
  @IsNumber()
  @Min(0)
  amountReceived: number;

  @ApiProperty({
    description: 'Nombre del cliente (opcional)',
    required: false,
  })
  @IsOptional()
  @IsString()
  @MaxLength(200)
  customerName?: string;

  @ApiProperty({
    description: 'Teléfono del cliente (opcional)',
    required: false,
  })
  @IsOptional()
  @IsString()
  @Matches(/^[0-9]{10}$/, {
    message: 'El teléfono debe tener exactamente 10 dígitos',
  })
  customerPhone?: string;

  @ApiProperty({
    description: 'Notas adicionales',
    required: false,
  })
  @IsOptional()
  @IsString()
  @MaxLength(500)
  notes?: string;

  @ApiProperty({
    description: 'Información del dispositivo (auto-llenado)',
    required: false,
  })
  @IsOptional()
  deviceInfo?: Record<string, unknown>;
}

export class CancelSaleDto {
  @ApiProperty({
    description: 'Razón de la cancelación',
    example: 'Cliente cambió de opinión',
  })
  @IsString()
  @IsNotEmpty()
  @MaxLength(255)
  reason: string;
}

export class SalesFilterDto {
  @ApiProperty({
    description: 'Fecha de inicio (YYYY-MM-DD)',
    required: false,
  })
  @IsOptional()
  @IsString()
  startDate?: string;

  @ApiProperty({
    description: 'Fecha de fin (YYYY-MM-DD)',
    required: false,
  })
  @IsOptional()
  @IsString()
  endDate?: string;

  @ApiProperty({
    description: 'Estado de la venta',
    required: false,
  })
  @IsOptional()
  @IsString()
  status?: string;

  @ApiProperty({
    description: 'Número de ticket',
    required: false,
  })
  @IsOptional()
  @IsString()
  ticketNumber?: string;

  @ApiProperty({
    description: 'Límite de resultados',
    required: false,
  })
  @IsOptional()
  @IsNumber()
  limit?: number;
}
