import { ApiProperty, PartialType } from '@nestjs/swagger';
import {
  IsString,
  IsNotEmpty,
  IsOptional,
  IsNumber,
  IsBoolean,
  IsUUID,
  Min,
  MaxLength,
  IsUrl,
  Matches,
} from 'class-validator';

export class CreateProductDto {
  @ApiProperty({
    description: 'Nombre del producto',
    example: 'Taco de Pastor',
  })
  @IsString()
  @IsNotEmpty()
  @MaxLength(200)
  name: string;

  @ApiProperty({
    description: 'Precio de venta',
    example: 25.0,
    minimum: 0,
  })
  @IsNumber()
  @Min(0)
  price: number;

  @ApiProperty({
    description: 'SKU único (opcional)',
    example: 'TACO-001',
    required: false,
  })
  @IsOptional()
  @IsString()
  @MaxLength(50)
  sku?: string;

  @ApiProperty({
    description: 'Código de barras (opcional)',
    example: '7501234567890',
    required: false,
  })
  @IsOptional()
  @IsString()
  @MaxLength(50)
  barcode?: string;

  @ApiProperty({
    description: 'ID de la categoría',
    required: false,
  })
  @IsOptional()
  @IsUUID()
  categoryId?: string;

  @ApiProperty({
    description: 'Costo de compra',
    example: 15.0,
    required: false,
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  cost?: number;

  @ApiProperty({
    description: 'El precio ya incluye IVA',
    default: true,
  })
  @IsOptional()
  @IsBoolean()
  taxIncluded?: boolean;

  @ApiProperty({
    description: 'Controlar inventario',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  trackStock?: boolean;

  @ApiProperty({
    description: 'Cantidad en stock inicial',
    example: 100,
    required: false,
  })
  @IsOptional()
  @IsNumber()
  stockQuantity?: number;

  @ApiProperty({
    description: 'Alerta de stock bajo',
    example: 10,
    required: false,
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  lowStockAlert?: number;

  @ApiProperty({
    description: 'URL de imagen',
    required: false,
  })
  @IsOptional()
  @IsUrl()
  @MaxLength(500)
  imageUrl?: string;

  @ApiProperty({
    description: 'Color identificador (hex)',
    example: '#FF5733',
    required: false,
  })
  @IsOptional()
  @IsString()
  @Matches(/^#[0-9A-Fa-f]{6}$/, {
    message: 'El color debe ser un código hex válido (#RRGGBB)',
  })
  color?: string;

  @ApiProperty({
    description: 'Marcar como favorito',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  isFavorite?: boolean;
}

export class UpdateProductDto extends PartialType(CreateProductDto) {}

export class ProductFilterDto {
  @ApiProperty({
    description: 'Filtrar por categoría',
    required: false,
  })
  @IsOptional()
  @IsUUID()
  categoryId?: string;

  @ApiProperty({
    description: 'Buscar por nombre o SKU',
    required: false,
  })
  @IsOptional()
  @IsString()
  search?: string;

  @ApiProperty({
    description: 'Solo favoritos',
    required: false,
  })
  @IsOptional()
  @IsBoolean()
  favorites?: boolean;

  @ApiProperty({
    description: 'Solo activos',
    default: true,
  })
  @IsOptional()
  @IsBoolean()
  active?: boolean;

  @ApiProperty({
    description: 'Solo con stock bajo',
    required: false,
  })
  @IsOptional()
  @IsBoolean()
  lowStock?: boolean;
}
