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

export enum TipoOferta {
  DESCUENTO_PORCENTAJE = 'descuento_porcentaje',
  DESCUENTO_MONTO = 'descuento_monto',
  PRECIO_ESPECIAL = 'precio_especial',
}

export enum AplicaA {
  PRODUCTO = 'producto',
  CATEGORIA = 'categoria',
  MARCA = 'marca',
  TODOS = 'todos',
}

export class AplicacionDto {
  @ApiProperty({ enum: AplicaA })
  @IsEnum(AplicaA)
  aplica_a: AplicaA;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  referencia_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsBoolean()
  excluir?: boolean;
}

export class CreateOfertaDto {
  @ApiProperty()
  @IsString()
  @IsNotEmpty()
  nombre: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  descripcion?: string;

  @ApiProperty({ enum: TipoOferta })
  @IsEnum(TipoOferta)
  tipo: TipoOferta;

  @ApiProperty({
    description: 'Porcentaje, monto fijo o precio especial según tipo',
  })
  @IsNumber()
  valor: number;

  @ApiProperty()
  @IsDateString()
  fecha_inicio: string;

  @ApiProperty()
  @IsDateString()
  fecha_fin: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsNumber()
  prioridad?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => AplicacionDto)
  aplicaciones?: AplicacionDto[];

  @ApiPropertyOptional({
    description:
      'Si la oferta se acumula con listas de precios del cliente (true) o compite por mayor beneficio (false)',
  })
  @IsOptional()
  @IsBoolean()
  acumulable_lista_precios?: boolean;

  @ApiPropertyOptional({
    description: 'IDs de sucursales donde aplica. Vacío = todas',
  })
  @IsOptional()
  @IsArray()
  @IsUUID('4', { each: true })
  sucursal_ids?: string[];
}
