export const isLuffa = () => {
  return (
    (window && window?._evmWallet !== undefined) || window?.webkit?.messageHandlers?._evmWallet !== undefined || false
  );
};

export const isLuffaMiniProgramWebview = () => {
  const userAgent = (window && window?.navigator?.userAgent) || '';
  return userAgent.includes('miniProgram');
};

export const isLuffaMiniProgram = () => {
  return Boolean(window?.wx && window?.wx?.getSystemInfoSync);
};

export const networkMap: Partial<Record<string, string>> = {
  ['mainnet']: 'endless',
  ['testnet']: 'eds',
};

export const getChain = (chainId: string) => {
  const chainIdNumber = parseInt(chainId, 16);
  let chain = '';
  switch (chainIdNumber) {
    case 728126428:
      chain = 'tron';
      break;
    case 3448148188:
      chain = 'tron_nile';
      break;
    case 1:
      chain = 'eth';
      break;
    case 11155111:
      chain = 'eth_sepolia';
      break;
    case 56:
      chain = 'bsc';
      break;
    case 97:
      chain = 'bsc_test';
      break;
    case 220:
      chain = 'endless';
      break;
    case 221:
      chain = 'eds';
      break;
  }
  return chain;
};

export const getChainIdByName = (chainName: string) => {
  let chainId;
  switch (chainName) {
    case 'eth':
      chainId = 1;
      break;
    case 'eth_sepolia':
      chainId = 11155111;
      break;
    case 'bsc':
      chainId = 56;
      break;
    case 'bsc_test':
      chainId = 97;
      break;
    case 'tron':
      chainId = 728126428;
      break;
    case 'tron_nile':
      chainId = 3448148188;
      break;
    case 'endless':
      chainId = 220;
      break;
    case 'eds':
      chainId = 221;
      break;
  }
  return chainId;
};

export const isApproveTx = (data: string) => {
  console.log('data: ', data);
  if (!data || !data.startsWith('0x095ea7b3'))
    return {
      isApprove: false,
      spender: null,
      amount: null,
    };

  try {
    const methodData = data.slice(10);
    const spenderHex = methodData.slice(0, 64);
    const amountHex = methodData.slice(64, 128);

    const spender = '0x' + spenderHex.slice(24);
    const amount = BigInt('0x' + amountHex);

    return {
      isApprove: true,
      spender,
      amount,
    };
  } catch (e) {
    return {
      isApprove: false,
      spender: null,
      amount: null,
    };
  }
};
export const isHexString = (value: string): boolean => {
  return (
    typeof value === 'string' &&
    value.startsWith('0x') &&
    value.length % 2 === 0 &&
    /^[0-9a-fA-F]+$/.test(value.slice(2))
  );
}

export const hexToUtf8 = (hex: string): string => {
  const clean = hex.slice(2);
  const bytes = new Uint8Array(clean.length / 2);

  for (let i = 0; i < clean.length; i += 2) {
    bytes[i / 2] = parseInt(clean.slice(i, i + 2), 16);
  }

  const decoder = new TextDecoder('utf-8');
  return decoder.decode(bytes);
}
export const normalizeMessageForDisplay = (message: string): string => {
  if (isHexString(message)) {
    return hexToUtf8(message);
  }
  return message;
}
