// src/utils/faker.utils.ts
import {randomBytes} from 'crypto';
import {Order} from '../entities/order.entity';
import {Placement} from '../entities/placement.entity';
import {Product} from '../entities/product.entity';
import {User} from '../entities/user.entity';

export function randomString(size: number = 8): string {
  return randomBytes(size).toString('hex');
}

export function randomBoolean(): boolean {
  return Math.random() > 0.5;
}

export function randomInteger(min: number = 0, max: number = 100): number {
  return Math.floor(Math.random() * (max - min) + min);
}

export function generateUser(user?: Partial<User>): User {
  const newUser = new User();
  newUser.email = user?.email ?? `${randomString()}@random.io`;
  newUser.password = newUser.email;

  return newUser;
}

export function generateProduct(product?: Partial<Product>): Product {
  const newProduct = new Product();
  newProduct.price = product?.price ?? Math.random() * 100;
  newProduct.published = product?.published ?? randomBoolean();
  newProduct.title = product?.title ?? randomString();
  newProduct.user = product?.user ?? generateUser();
  newProduct.quantity = product?.quantity ?? randomInteger(1);

  return newProduct;
}

export function generateOrder(order?: Partial<Order>): Order {
  const newOrder = new Order();
  newOrder.user = order?.user ?? generateUser();
  newOrder.total = randomInteger(1); // TODO

  return newOrder;
}

export function generatePlacement(placement?: Partial<Placement>): Placement {
  const newPlacement = new Placement();
  newPlacement.product = placement?.product ?? generateProduct();
  newPlacement.order = placement?.order ?? generateOrder();
  newPlacement.quantity = placement?.quantity ?? randomInteger(1, 5);

  return newPlacement;
}