import { ethers } from "ethers";
import { BaseProvider } from "ethers/providers";
import { InjectedConnector } from "@web3-react/injected-connector";

export async function isContractAddress(address: string, provider?: BaseProvider): Promise<boolean> {
    if (address.length !== 42) return false;

    try {
        const getAddress = ethers.utils.getAddress(address);
        const baseProvider = provider || getProvider();
        const code = await baseProvider.getCode(getAddress);

        if (code !== '0x') {
            return true;
        }
    } catch (ex) {
        console.log("Error: unable to parse address", address);
    }

    return false;
}

export async function getEnsNameOrAddress(address: string, shorten?: boolean, provider?: BaseProvider): Promise<string> { 
    if (!provider) { 
        provider = getProvider();
    }
    
    const name = await provider.lookupAddress(address);
    if (name)
        return name;
    
    if (shorten)
        return parseAddress(address);

    return address;
}

export function getProvider(network?: "homestead" | "rinkeby" | "ropsten" | "kovan" | "goerli" | "xdai"): BaseProvider { 
    if (network === 'xdai') { 
      return new ethers.providers.JsonRpcProvider('https://rpc.xdaichain.com/');
    }
    if (network) {
        return ethers.getDefaultProvider(network);
    }

    return ethers.getDefaultProvider();
}

export const Injected = new InjectedConnector({
    supportedChainIds: [1, 3, 4, 5, 42, 100]
});

export function parseEther(wei: number): string { 
    const ether = ethers.utils.formatEther(wei.toString());
    const formatted = (Math.round(Number(ether) * 100) / 100).toLocaleString();
    
    return formatted;
}

export function parseAddress(address: string): string { 
    const begin = address.substring(0, 7);
    const end = address.substring(address.length - 3, address.length);
    const formatted = `${begin}...${end}`;

    return formatted;
}