import { JsonRpcProvider } from 'ethers';

const API_BASE_URL = "https://hyperapp.in";

/**
 * Checks if a string is a valid ENS name
 * @param value The string to check
 * @returns boolean indicating if the string is a valid ENS name
 */
export const isENS = (value: string): boolean => {
  return value.toLowerCase().endsWith(".eth");
};

/**
 * Checks if a string is a valid Ethereum address
 * @param value The string to check
 * @returns boolean indicating if the string is a valid Ethereum address
 */
export const isEthereumAddress = (value: string): boolean => {
  return /^0x[a-fA-F0-9]{40}$/.test(value);
};

/**
 * Resolves an ENS name to an Ethereum address
 * @param ensName The ENS name to resolve
 * @returns The resolved Ethereum address or null if resolution fails
 */
export const resolveENS = async (ensName: string): Promise<string | null> => {
  try {
    const provider = new JsonRpcProvider(
      "https://mainnet.infura.io/v3/e2d74a526a8b4f7abfc930b414329b2e"
    );
    const address = await provider.resolveName(ensName);
    return address;
  } catch (error) {
    console.error("ENS resolution error:", error);
    return null;
  }
};

/**
 * Gets the username associated with a wallet address
 * @param walletAddress The wallet address to look up
 * @param walletSdkKey The wallet SDK key for authorization
 * @returns Object containing username information
 */
export const getUsernameForWalletAddress = async (walletAddress: string, walletSdkKey: string) => {
  try {
    const response = await fetch(
      `${API_BASE_URL}/api/user/get-username-for-address/?wallet_address=${walletAddress}`,
      {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
          Authorization: `${walletSdkKey}`,
        },
      }
    );
    return await response.json();
  } catch (error) {
    console.error("Error fetching username for wallet address:", error);
    return { value: false };
  }
};

/**
 * Gets the wallet address associated with a username
 * @param username The username to look up
 * @param walletSdkKey The wallet SDK key for authorization
 * @returns Object containing wallet address information
 */
export const getWalletAddressForUsername = async (username: string, walletSdkKey: string) => {
  try {
    const response = await fetch(
      `${API_BASE_URL}/api/user/get-address-for-username/?username=${username}`,
      {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
          Authorization: `${walletSdkKey}`,
        },
      }
    );
    return await response.json();
  } catch (error) {
    console.error("Error fetching wallet address for username:", error);
    return { value: false };
  }
};

/**
 * Resolves a wallet address to an ENS name
 * @param address The wallet address to resolve
 * @returns The resolved ENS name or null if resolution fails
 */
export const reverseResolveENS = async (address: string): Promise<string | null> => {
  try {
    const provider = new JsonRpcProvider(
      "https://mainnet.infura.io/v3/" + process.env.REACT_APP_INFURA_KEY
    );
    const ensName = await provider.lookupAddress(address);
    return ensName;
  } catch (error) {
    console.error("Reverse ENS resolution error:", error);
    return null;
  }
};

/**
 * Looks up user information for any input (address, username, ENS, etc.)
 * @param input The input string to look up
 * @param walletSdkKey The wallet SDK key for authorization
 * @returns Object containing user information
 */
export const lookupUser = async (input: string, walletSdkKey: string) => {
  try {
    const response = await fetch(
      `${API_BASE_URL}/api/user/lookup?input=${encodeURIComponent(input)}`,
      {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
          Authorization: `${walletSdkKey}`,
        },
      }
    );
    return await response.json();
  } catch (error) {
    console.error("Error looking up user:", error);
    return { value: false };
  }
}; 