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

export class CreateProductoDto {
  @ApiProperty({ required: false, example: 'cd88ac6a-2b0e-41bc-afd9-24b594cb8daf' })
  @IsOptional()
  @IsUUID()
  categoria_id?: string | null;

  @ApiProperty({ required: false, example: 'cd88ac6a-2b0e-41bc-afd9-24b594cb8daf' })
  @IsOptional()
  @IsUUID()
  marca_id?: string | null;

  @ApiProperty({ example: 'cd88ac6a-2b0e-41bc-afd9-24b594cb8daf' })
  @IsNotEmpty({ message: 'Afectación es obligatoria' })
  @IsUUID()
  afectacion_id: string;

  @ApiProperty({ example: 'cd88ac6a-2b0e-41bc-afd9-24b594cb8daf' })
  @IsNotEmpty({ message: 'Unidad de medida es obligatoria' })
  @IsUUID()
  unidad_medida_id: string;

  @ApiProperty({ example: 'Descripcion del producto' })
  @IsNotEmpty({ message: 'Descripción es obligatoria' })
  @Length(1, 2000, { message: 'Descripción debe tener entre 1 y 2000 caracteres' })
  descripcion: string;

  @ApiProperty({ required: false, description: 'Descripción larga para la ficha de tienda online' })
  @IsOptional()
  @IsString()
  descripcion_larga?: string | null;

  @ApiProperty({ example: '1000' })
  @IsOptional()
  @IsNumber()
  precio?: number;

  @ApiProperty({ example: '900', required: false })
  @IsOptional()
  @IsNumber()
  precio_costo?: number;

  @ApiProperty({ example: '0001' })
  @IsOptional()
  @Length(1, 20, { message: 'Código del producto debe tener entre 1 y 20 caracteres' })
  cod_producto?: string;

  @ApiProperty({ example: '10' })
  @IsNotEmpty({ message: 'Porcentaje de IVA es obligatorio' })
  @IsNumber()
  @IsIn([10, 5, 0], { message: 'Porcentaje de IVA debe ser 10, 5 o 0' })
  porcentaje_iva: number;

  @ApiProperty({ example: '100' })
  @IsNotEmpty({ message: 'Proporción de IVA es obligatorio' })
  @IsNumber()
  @Min(0, { message: 'Proporción de IVA debe ser un número entre 0 y 100' })
  @Max(100, { message: 'Proporción de IVA debe ser un número entre 0 y 100' })
  proporcion_iva: number;

  @ApiProperty({ example: '' })
  @IsOptional()
  @Length(8, 14, { message: 'Código de barra debe tener entre 8 y 14 caracteres' })
  codigo_barra?: string;

  @IsOptional()
  tipo?: string;

  @ApiProperty({ example: '' })
  @IsOptional()
  @Length(8, 8, { message: 'DDNCPG debe tener exactamente 8 caracteres' })
  ddncpg?: string;

  @ApiProperty({ example: '' })
  @IsOptional()
  @Length(3, 4, { message: 'DDNCPG debe tener exactamente 3 o 4 caracteres' })
  ddncpe?: string;

  @ApiProperty({ example: '' })
  @IsOptional()
  @Length(8, 14, { message: 'Código de barra debe tener entre 8 y 14 caracteres' })
  codigo_barra_paquete?: string;

  @ApiProperty({ example: false, description: 'Marcar producto como destacado para POS' })
  @IsOptional()
  @IsBoolean()
  destacado?: boolean;

  @ApiProperty({ example: false, description: 'Publicar producto en el canal ecommerce' })
  @IsOptional()
  @IsBoolean()
  mostrar_en_ecommerce?: boolean;

  @ApiProperty({ example: true, description: 'Indica si el producto maneja inventario (descuenta stock en ventas)' })
  @IsOptional()
  @IsBoolean()
  maneja_inventario?: boolean;

  @ApiProperty({ example: false, description: 'Indica si el producto maneja control de lotes' })
  @IsOptional()
  @IsBoolean()
  maneja_lote?: boolean;

  @ApiProperty({ example: false, description: 'Indica si es producto padre con variantes' })
  @IsOptional()
  @IsBoolean()
  es_padre?: boolean;

  @ApiProperty({ example: null, description: 'ID del producto padre (para variantes hijas)' })
  @IsOptional()
  @IsUUID()
  producto_padre_id?: string | null;

  @ApiProperty({
    example: ['uuid-valor-1', 'uuid-valor-2'],
    description: 'IDs de valores de atributo para esta variante',
    required: false,
  })
  @IsOptional()
  @IsArray()
  @IsUUID('4', { each: true })
  variante_valores?: string[];
}
