import { Chain } from '../entities/Chain';
import { MAP_TEST_NATIVE } from './tokens';

export enum ChainId {
  MAP = '22776',
  MAP_TEST = '212',
  ETH_PRIV = '34434',
  BSC_TEST = '97',
  NEAR_TESTNET = '5566818579631833089',
}

export const MAP_MAINNET_CHAIN = new Chain(
  ChainId.MAP,
  'MAP Mainnet',
  'https://poc3-rpc.maplabs.io/',
  'https://makalu.mapscan.io/',
  'https://files.maplabs.io/bridge/map.png',
  'MAP'
);
export const MAP_TEST_CHAIN = new Chain(
  ChainId.MAP_TEST,
  'MAP Testnet',
  'http://18.142.54.137:7445',
  'http://18.139.224.21:9001/',
  'https://files.maplabs.io/bridge/map.png',
  'MAP'
);
export const BSC_TEST_CHAIN = new Chain(
  ChainId.BSC_TEST,
  'BSC Testnet',
  'https://bsc-testnet.public.blastapi.io',
  'https://testnet.bscscan.com/',
  'https://files.maplabs.io/bridge/bsc.png',
  'BSC'
);

export const ETH_PRIV_CHAIN = new Chain(
  ChainId.ETH_PRIV,
  'Ethereum Private',
  'http://18.138.248.113:8545',
  '',
  'https://files.maplabs.io/bridge/eth.png',
  'ETH'
);

export const NEAR_TEST_CHAIN = new Chain(
  ChainId.NEAR_TESTNET,
  'Near Testnet',
  'https://rpc.testnet.near.org',
  'https://explorer.testnet.near.org/',
  'https://cryptologos.cc/logos/near-protocol-near-logo.png',
  'NEAR'
);
// TODO: return chain info
export const ID_TO_CHAIN_ID = (id: string): ChainId => {
  switch (id) {
    case '22776':
      return ChainId.MAP;
    case '212':
      return ChainId.MAP_TEST;
    case '97':
      return ChainId.BSC_TEST;
    case '34434':
      return ChainId.ETH_PRIV;
    case '5566818579631833089':
      return ChainId.NEAR_TESTNET;
    default:
      throw new Error(`Unknown chain id: ${id}`);
  }
};

export enum ChainName {
  MAP = 'map-mainnet',
  MAP_TEST = 'map-testnet',
  ETH_PRIV = 'eth-priv',
  NEAR_TESTNET = 'near-testnet',
  BSC_TEST = 'bsc-testnet',
}

export enum NativeCurrencyName {
  // Strings match input for CLI
  ETHER = 'ETH',
  MATIC = 'MATIC',
  BSC = 'BNB',
  MAP = 'MAP',
  NEAR = 'NEAR',
}

// export const NATIVE_CURRENCY: { [chainId: number]: NativeCurrencyName } = {
//   [ChainId.MAINNET]: NativeCurrencyName.ETHER,
//   // [ChainId.ROPSTEN]: NativeCurrencyName.ETHER,
//   // [ChainId.RINKEBY]: NativeCurrencyName.ETHER,
//   // [ChainId.GÖRLI]: NativeCurrencyName.ETHER,
//   // [ChainId.KOVAN]: NativeCurrencyName.ETHER,
//   // [ChainId.OPTIMISM]: NativeCurrencyName.ETHER,
//   // [ChainId.OPTIMISTIC_KOVAN]: NativeCurrencyName.ETHER,
//   // [ChainId.ARBITRUM_ONE]: NativeCurrencyName.ETHER,
//   // [ChainId.ARBITRUM_RINKEBY]: NativeCurrencyName.ETHER,
//   // [ChainId.POLYGON]: NativeCurrencyName.MATIC,
//   // [ChainId.POLYGON_MUMBAI]: NativeCurrencyName.MATIC,
//   [ChainId.BSC]: NativeCurrencyName.BSC,
//   [ChainId.MAP]: NativeCurrencyName.MAP,
//   [ChainId.MAP_TEST]: NativeCurrencyName.MAP,
// };

export const ID_TO_NETWORK_NAME = (id: string): ChainName => {
  switch (id) {
    case '22776':
      return ChainName.MAP;
    case '212':
      return ChainName.MAP_TEST;
    case '34434':
      return ChainName.ETH_PRIV;
    case '97':
      return ChainName.BSC_TEST;
    case '5566818579631833089':
      return ChainName.NEAR_TESTNET;
    default:
      throw new Error(`Unknown chain id: ${id}`);
  }
};
export const NETWORK_NAME_TO_ID = (network: string): ChainId => {
  switch (network) {
    case ChainName.MAP:
      return ChainId.MAP;
    case ChainName.MAP_TEST:
      return ChainId.MAP_TEST;
    default:
      throw new Error(`Unsupported network name: ${network}`);
  }
};

export const SUPPORTED_CHAIN_LIST = [
  // MAP_MAINNET_CHAIN,
  MAP_TEST_CHAIN,
  // ETH_PRIV_CHAIN,
  NEAR_TEST_CHAIN,
  BSC_TEST_CHAIN,
];

export const ID_TO_DEFAULT_PROVIDER = (id: string): string => {
  switch (id) {
    case ChainId.MAP:
      return process.env.JSON_RPC_PROVIDER_MAP!;
    case ChainId.MAP_TEST:
      return 'http://18.142.54.137:7445';
    case ChainId.ETH_PRIV:
      return process.env.JSON_RPC_PROVIDER_ETH_PRIV!;
    case ChainId.BSC_TEST:
      return BSC_TEST_CHAIN.rpc!;
    default:
      throw new Error(`Chain id: ${id} not supported`);
  }
};

// export const WRAPPED_NATIVE_CURRENCY: { [chainId in ChainId]: Token } = {
//   [ChainId.MAINNET]: new Token(
//     1,
//     '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
//     18,
//     'WETH',
//     'Wrapped EVMNativCoin'
//   ),
//   // [ChainId.ROPSTEN]: new Token(
//   //   3,
//   //   '0xc778417E063141139Fce010982780140Aa0cD5Ab',
//   //   18,
//   //   'WETH',
//   //   'Wrapped EVMNativCoin'
//   // ),
//   // [ChainId.RINKEBY]: new Token(
//   //   4,
//   //   '0xc778417E063141139Fce010982780140Aa0cD5Ab',
//   //   18,
//   //   'WETH',
//   //   'Wrapped EVMNativCoin'
//   // ),
//   // [ChainId.GÖRLI]: new Token(
//   //   5,
//   //   '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6',
//   //   18,
//   //   'WETH',
//   //   'Wrapped EVMNativCoin'
//   // ),
//   // [ChainId.KOVAN]: new Token(
//   //   42,
//   //   '0xd0A1E359811322d97991E03f863a0C30C2cF029C',
//   //   18,
//   //   'WETH',
//   //   'Wrapped EVMNativCoin'
//   // ),
//   // [ChainId.OPTIMISM]: new Token(
//   //   ChainId.OPTIMISM,
//   //   '0x4200000000000000000000000000000000000006',
//   //   18,
//   //   'WETH',
//   //   'Wrapped EVMNativCoin'
//   // ),
//   // [ChainId.OPTIMISTIC_KOVAN]: new Token(
//   //   ChainId.OPTIMISTIC_KOVAN,
//   //   '0x4200000000000000000000000000000000000006',
//   //   18,
//   //   'WETH',
//   //   'Wrapped EVMNativCoin'
//   // ),
//   // [ChainId.ARBITRUM_ONE]: new Token(
//   //   ChainId.ARBITRUM_ONE,
//   //   '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',
//   //   18,
//   //   'WETH',
//   //   'Wrapped EVMNativCoin'
//   // ),
//   // [ChainId.ARBITRUM_RINKEBY]: new Token(
//   //   ChainId.ARBITRUM_RINKEBY,
//   //   '0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681',
//   //   18,
//   //   'WETH',
//   //   'Wrapped EVMNativCoin'
//   // ),
//   // [ChainId.POLYGON]: new Token(
//   //   ChainId.POLYGON,
//   //   '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
//   //   18,
//   //   'WMATIC',
//   //   'Wrapped MATIC'
//   // ),
//   // [ChainId.POLYGON_MUMBAI]: new Token(
//   //   ChainId.POLYGON_MUMBAI,
//   //   '0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889',
//   //   18,
//   //   'WMATIC',
//   //   'Wrapped MATIC'
//   // ),
//   [ChainId.BSC]: new Token(
//     ChainId.BSC,
//     '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
//     18,
//     'WBNB',
//     'Wrapped BNB'
//   ),
//   [ChainId.MAP]: new Token(
//     ChainId.MAP,
//     '0x13CB04d4a5Dfb6398Fc5AB005a6c84337256eE23',
//     18,
//     'WMAP',
//     'Wrapped MAP'
//   ),
//   [ChainId.MAP_TEST]: new Token(
//     ChainId.MAP,
//     '0x13CB04d4a5Dfb6398Fc5AB005a6c84337256eE23',
//     18,
//     'WMAP',
//     'Wrapped MAP'
//   ),
//   [ChainId.ETH_PRIV]: new Token(
//     ChainId.ETH_PRIV,
//     '0xfe745307D9C8A6F9a72F608E87821f3F55090A35',
//     18,
//     'WETH',
//     'Wrapped ETH'
//   ),
//   [ChainId.NEAR_TESTNET]: new Token(
//     ChainId.NEAR_TESTNET,
//     'wrap.testnet',
//     22,
//     'WNEAR',
//     'Wrapped NEAR'
//   ),
// };

export const IS_MAP = (id: string): boolean => {
  switch (id) {
    case ChainId.MAP:
    case ChainId.MAP_TEST:
      return true;
    default:
      return false;
  }
};

export const IS_NEAR = (id: string): boolean => {
  switch (id) {
    case '1':
    case '3':
    case '4':
    case '5':
    case '42':
    case '10':
    case '69':
    case '97':
    case '42161':
    case '421611':
    case '137':
    case '80001':
    case '56':
    case '22776':
    case '212':
    case '34434':
      return false;
    case '5566818579631833089':
      return true;
    default:
      throw new Error(`Unsupported chain id: ${id}`);
  }
};

export const IS_EVM = (id: string): boolean => {
  switch (id) {
    case '1':
    case '3':
    case '4':
    case '5':
    case '42':
    case '10':
    case '69':
    case '42161':
    case '421611':
    case '137':
    case '97':
    case '80001':
    case '56':
    case '22776':
    case '212':
    case '34434':
      return true;
    case '5566818579631833089':
      return false;
    default:
      throw new Error(`Unknown chain id: ${id}`);
  }
};
