import {NativeModules, TurboModuleRegistry} from 'react-native'
declare global {
  var __xxhash128: (input: string) => string;
  var __xxhash64: (input: string) => string;
}


let xxhashModule = (globalThis as any).__xxhash128 as typeof globalThis.__xxhash128 | undefined;

if(!xxhashModule){
  const XxhashModule: any = TurboModuleRegistry.get('xxhash') ?? NativeModules.xxhash;
  if(XxhashModule){
    XxhashModule.install?.();
    xxhashModule = (globalThis as any).__xxhash128;
    if(xxhashModule){
      console.log('✅ xxhash initialized successfully')
    }
  }
}


/**
 * Hashes the input string using the xxhash128 algorithm.
 * This function provides a fast and deterministic 128-bit hash for a given string input.
 * 
 * @param {string} input - The string to hash.
 * @returns {string} The hashed string as a hexadecimal representation of the 128-bit hash.
 * @throws {Error} If the input is not provided.
 * @throws {Error} If the input is not of type string.
 * 
 * @example
 * const result = hash128("hello world");
 * console.log(result); // Example output: "3a2b9e6a2b5e7e5a9e6a2b5e7e5a2a2"
 * 
 * @description
 * This function uses the xxhash128 algorithm, which provides a larger hash size (128-bit) compared to xxhash64.
 * It is ideal for scenarios where a reduced collision risk is critical, such as in distributed systems or when hashing larger datasets.
 */
 export const hash128 = (input: string): string => {
  if(!input){
    throw new Error('Input is required');
  }

  if(typeof input !== 'string'){
    throw new Error('Input must be a string');
  }

  return globalThis.__xxhash128(input);
 }

/**
 * Hashes the input string using the xxhash64 algorithm.
 * This function provides a fast and deterministic 64-bit hash for a given string input.
 * 
 * @param {string} input - The string to hash.
 * @returns {string} The hashed string as a hexadecimal representation of the 64-bit hash.
 * @throws {Error} If the input is not provided.
 * @throws {Error} If the input is not of type string.
 * 
 * @example
 * const result = hash64("hello world");
 * console.log(result); // Example output: "9e6a2b5e7e5a2a2e"
 * 
 * @description
 * This function uses the xxhash64 algorithm, known for its high performance and low collision rate.
 * It is ideal for hashing small to medium-sized strings.
 */

 export const hash64 = (input: string): string => {
  if(!input){
    throw new Error('Input is required');
  }

  if(typeof input !== 'string'){
    throw new Error('Input must be a string');
  }

  return globalThis.__xxhash64(input);
 }
