const validator = require('validator');
const { v4: uuidv4 } = require('uuid');
const Sequelize = require('./models').Sequelize;

module.exports = class Utils {
  /**
   * Check if value is a valid UUID
   * @param {*} value - The value to check
   * @returns {boolean} - True if valid UUID, false otherwise
   */
  static isValidUuid(value) {
    return Boolean(value && validator.isUUID(String(value)));
  }

  /**
   * Generate a new UUID v4
   * @returns {string} - A new UUID v4 string
   */
  static generateUuid() {
    return uuidv4();
  }

  /**
   * Filter array to only valid UUIDs
   * @param {Array} values - Array of values to filter
   * @returns {string[]} - Array containing only valid UUIDs
   */
  static filterValidUuids(values) {
    return values.filter((v) => this.isValidUuid(v));
  }

  /**
   * Case-insensitive LIKE query
   * @param {string} model - The model/table name
   * @param {string} column - The column name
   * @param {string} value - The value to search for
   * @returns {Object} - Sequelize where clause
   */
  static ilike(model, column, value) {
    return Sequelize.where(
      Sequelize.fn('lower', Sequelize.col(`${model}.${column}`)),
      { [Sequelize.Op.like]: `%${value}%`.toLowerCase() },
    );
  }
};
