import { UnionToTuple } from "./utils";

export const SocialLinks = [
  "TWITTER",
  "LENS",
  "YOUTUBE",
  "SPOTIFY",
  "MIRROR",
  "MEDIUM",
  "SUBSTACK",
  "SNAPSHOT",
  "SOUND",
  "GITHUB",
  "WARPCAST",
  "WEBSITE",
] as const;

export const Visibility = ["PUBLIC", "PRIVATE", "HIDDEN"] as const;

export const ChainIds = {
  ETHEREUM: 1,
  POLYGON: 137,
  BSC: 56,
  FANTOM: 250,
  ARBITRUM: 42161,
  NOVA: 42170,
  CELO: 42220,
  HARMONY: 1666600000,
  GOERLI: 5,
  AVALANCHE: 43114,
  OPTIMISM: 10,
  MOONRIVER: 1285,
  MOONBEAM: 1284,
  GNOSIS: 100,
  METIS: 1088,
  CRONOS: 25,
  BOBA: 288,
  BOBA_AVAX: 43288,
  PALM: 11297108109,
  BASE_GOERLI: 84531,
  BASE_MAINNET: 8453,
  EXOSAMA: 2109,
  EVMOS: 9001,
  POLYGON_MUMBAI: 80001,
  ZETACHAIN_ATHENS: 7001,
  SCROLL_ALPHA: 534353,
  ZORA: 7777777,
  SEPOLIA: 11155111,
  ZKSYNC_ERA: 324,
  POLYGON_ZKEVM: 1101,
  NEON_EVM: 245022934,
  PGN: 424,
  LINEA: 59144,
  LUKSO: 42,
  MANTLE: 5000,
  SCROLL: 534352,
  SCROLL_SEPOLIA: 534351,
  RONIN: 2020,
  SHIMMER: 148,
  KAVA: 2222,
  BITFINITY_TESTNET: 355113,
  X1_TESTNET: 195,
  ONTOLOGY: 58,
  BERA_TESTNET: 2061,
  MANTA: 169,
  TAIKO_KATLA: 167008,
  OASIS_SAPPHIRE: 23294,
  BLAST_SEPOLIA: 168587773,
  BASE_SEPOLIA: 84532,
  BLAST_MAINNET: 81457,
  ASTAR_ZKEVM: 3776,
  ZETACHAIN: 7000,
  CORE_DAO: 1116,
  LISK_SEPOLIA: 4202,
  FORM: 478,
  METIS_SEPOLIA: 59902,
  OP_BNB: 204,
  X1: 196,
  CYBER: 7560,
  TAIKO: 167000,
  KLAYTN: 8217,
  MINT: 185,
  WORLD_CHAIN: 480,
  SEI: 1329,
  FILECOIN: 314,
  ROOTSTOCK: 30,
  MODE: 34443,
  LISK: 1135,
  CRONOS_ZKEVM: 388,
  INK_SEPOLIA: 763373,
  INK: 57073,
  IOTA: 8822,
  SONIC: 146,
  SOPHON: 50104,
  ZERO: 543210,
  XDC: 50,
  SONEIUM: 1868,
} as const;

export const Chain = Object.keys(ChainIds) as (keyof typeof ChainIds)[];

export const PLATFORM_NAMES_IDS = {
  DISCORD: 1,
  TELEGRAM: 2,
  GITHUB: 3,
  GOOGLE: 4,
  TWITTER: 5,
  // "STEAM": 6,
  CONTRACT_CALL: 7,
  TWITTER_V1: 8,
  UNIQUE_TEXT: 9,
  TEXT: 10,
  GUILD_PIN: 11,
  POINTS: 13,
  POAP: 14,
  FORM: 15,
  GATHER_TOWN: 16,
  ERC20: 17,
  WORLD_ID: 18,
  FARCASTER_CHANNEL: 19,
} as const;

export const PlatformName = Object.keys(PLATFORM_NAMES_IDS) as UnionToTuple<
  keyof typeof PLATFORM_NAMES_IDS
>;

export const Logic = ["AND", "OR", "ANY_OF"] as const;

export const ErrorMessages = {
  INVALID_GUILDPLATFORM_INDEX:
    "Invalid guildPlatformIndex. Make sure all guildPlatformIndex values reference an existing item from guildPlatforms",
  EMPTY_OBJECT: "At least one of the fields must be defined",
  INVALID_ADDRESS: "Invalid address",
  REQUIRED_PLATFORM_GUILD_DATA: "platformGuildData is required",
  ADMIN_UPDATE_IS_OWNER_FALSE:
    "It is only possible to update an admin to be an owner. But doing so the previous owner will lose ownership",
};

export const GuildPinAction = ["JOINED_GUILD", "IS_OWNER", "IS_ADMIN"] as const;

export const XPEventType = [
  "USER_REFERRAL",
  "JOIN_GUILD",
  "GET_ROLE",
  "SUBMIT_FORM",
  "COLLECT_PIN",
  "COLLECT_NFT",
  "OWN_GUILD_VERIFIED",
] as const;

export const PinSupportedChains: {
  [key: number]: (typeof Chain)[number] | "FUEL";
} = {
  10: "OPTIMISM",
  25: "CRONOS",
  56: "BSC",
  58: "ONTOLOGY",
  137: "POLYGON",
  146: "SONIC",
  185: "MINT",
  324: "ZKSYNC_ERA",
  478: "FORM",
  1135: "LISK",
  5000: "MANTLE",
  7560: "CYBER",
  8453: "BASE_MAINNET",
  8822: "IOTA",
  34443: "MODE",
  42161: "ARBITRUM",
  50104: "SOPHON",
  57073: "INK",
  59144: "LINEA",
  543210: "ZERO",
  50: "XDC",
  1868: "SONEIUM",
  11155111: "SEPOLIA",
  // Use a fake chainId for Fuel
  123456789: "FUEL",
} as const;

export const PinContractAddresses = {
  POLYGON: "0xff04820c36759c9f5203021fe051239ad2dcca8a",
  BASE_MAINNET: "0x326f14942f8899406e3224bd63e9f250d275a52e",
  ZKSYNC_ERA: "0xd1e4254fe7e56f58777ba624e7eeb3644f872b0d",
  BSC: "0x807f16eba4a2c51b86cb8ec8be8eab34305c2bfd",
  ARBITRUM: "0x0e6a14106497a7de36fba446628860c062e9e302",
  CRONOS: "0x4205e56a69a0130a9e0828d45d0c84e45340a196",
  OPTIMISM: "0x6c2c223b84724c4b8fd41ae0142c2369dfa7e319",
  MANTLE: "0x4205e56a69a0130a9e0828d45d0c84e45340a196",
  ONTOLOGY: "0x4205e56a69a0130a9e0828d45d0c84e45340a196",
  LINEA: "0x4205e56a69a0130a9e0828d45d0c84e45340a196",
  CYBER: "0x13ec6b98362e43add08f7cc4f6befd02fa52ee01",
  MINT: "0x13ec6b98362e43add08f7cc4f6befd02fa52ee01",
  MODE: "0x13ec6b98362e43add08f7cc4f6befd02fa52ee01",
  LISK: "0x73d1a63bce3083be47597E2Ef0646BbFd1907f1C",
  FORM: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  INK: "0x73d1a63bce3083be47597E2Ef0646BbFd1907f1C",
  IOTA: "0x13ec6b98362e43add08f7cc4f6befd02fa52ee01",
  SONIC: "0x13ec6b98362e43add08f7cc4f6befd02fa52ee01",
  // SOPHON: "0xTODO",
  ZERO: "0x792c4f33cABa7B0631c2B6a3355fEad6D9DCaCC9",
  XDC: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  SONEIUM: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  SEPOLIA: "0xac49ee0c3bda5f851eac9a3184a21041e9afe379",
} as const satisfies Partial<
  Record<(typeof PinSupportedChains)[number], `0x${string}`>
>;

export const NFTRewardSupportedChains = [
  "ETHEREUM",
  "BASE_MAINNET",
  "OPTIMISM",
  "BSC",
  "CRONOS",
  "POLYGON",
  "MANTLE",
  "ZKSYNC_ERA",
  "LINEA",
  "CYBER",
  "ARBITRUM",
  "SCROLL",
  "TAIKO",
  "BLAST_MAINNET",
  "X1",
  "CORE_DAO",
  "METIS",
  "NEON_EVM",
  "POLYGON_ZKEVM",
  "ZETACHAIN",
  "MINT",
  "MODE",
  "AVALANCHE",
  "LISK",
  "INK",
  "IOTA",
  "SONIC",
  // "SOPHON",
  "ZERO",
  "XDC",
  "SONEIUM",
  "SEPOLIA",
] as const;

export const NFTRewardFactoryAddresses = {
  ETHEREUM: "0x6ee2dd02fbfb71f518827042b6adca242f1ba0b2",
  BASE_MAINNET: "0x4205e56a69a0130a9e0828d45d0c84e45340a196",
  OPTIMISM: "0xe6e6b676f94a6207882ac92b6014a391766fa96e",
  BSC: "0xa445e7d3af54867d14467b44d5487352403d1e59",
  CRONOS: "0x6c2c223b84724c4b8fd41ae0142c2369dfa7e319",
  POLYGON: "0xc1c23618110277ffe6d529816eb23de42b24cc33",
  MANTLE: "0x326f14942f8899406e3224bd63E9f250D275a52e",
  ZKSYNC_ERA: "0x2a1eaf11a9753a871b15e2865d8a47cf17dd9450",
  LINEA: "0x326f14942f8899406e3224bd63E9f250D275a52e",
  CYBER: "0x097E05f7a194a30A482CC9616460498980bE79d3",
  ARBITRUM: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  SCROLL: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  TAIKO: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  BLAST_MAINNET: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  X1: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  CORE_DAO: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  METIS: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  NEON_EVM: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  POLYGON_ZKEVM: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  ZETACHAIN: "0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01",
  MINT: "0x097E05f7a194a30A482CC9616460498980bE79d3",
  MODE: "0x097E05f7a194a30A482CC9616460498980bE79d3",
  AVALANCHE: "0x13ec6b98362e43add08f7cc4f6befd02fa52ee01",
  LISK: "0x13ec6b98362e43add08f7cc4f6befd02fa52ee01",
  INK: "0x13ec6b98362e43add08f7cc4f6befd02fa52ee01",
  SEPOLIA: "0xa9e8e62266d449b766d305075248790bdd46facb",
  IOTA: "0x097E05f7a194a30A482CC9616460498980bE79d3",
  SONIC: "0x070cD1FD4de1ed0259871B7d0b85C0e237702691",
  // SOPHON: "0xTODO",
  ZERO: "0x334f5BBDdCD9eAF0ad6B151e8D222f4fA54Fbc95",
  XDC: "0x097E05f7a194a30A482CC9616460498980bE79d3",
  SONEIUM: "0x097E05f7a194a30A482CC9616460498980bE79d3",
} as const satisfies Record<
  (typeof NFTRewardSupportedChains)[number],
  `0x${string}`
>;

export const GuildSortType = ["NEWEST", "VERIFIED", "FEATURED"] as const;

export const ContactType = ["EMAIL", "TELEGRAM"] as const;

export const AuthMethod = {
  EOA: "1",
  KeyPair: "2",
  EIP1271: "3",
} as const;

export const PARAMS_HEADER_NAME = "x-guild-params";
export const SIG_HEADER_NAME = "x-guild-sig";
export const AUTH_HEADER_NAME = "x-guild-auth";
export const SERVICE_HEADER_NAME = "x-guild-service";
export const PRIVILEGED_USER_ID_HEADER = "x-guild-privileged-user-id";
export const CORRELATION_ID_HEADER_NAME = "x-correlation-id";

export const SDK_VERSION_HEADER_NAME = "x-guild-sdk-version";
export const SDK_PROJECT_NAME_HEADER_NAME = "x-guild-sdk-project-name";

export const VISIBILITY_FILTERED_COUNT_HEADER_NAME =
  "x-guild-visibility-filtered";

export const unimplementedRequirementTypes = [
  "ERC721",
  "ERC1155",
  "NOUNS",
  "ERC20",
  "SOUND_ARTIST_BACKED",
  "SOUND_COLLECTED",
  "SOUND_ARTIST",
  "SOUND_TOP_COLLECTOR",
  "SOUND_NFTS",
  "UNLOCK",
  "NOOX",
  "YUP",
] as const;

export const UniswapV3PositionsChains = [
  "ETHEREUM",
  "ARBITRUM",
  "OPTIMISM",
  "POLYGON",
  "BASE_MAINNET",
  "BSC",
  "AVALANCHE",
  "CELO",
  "BLAST_MAINNET",
  "SEPOLIA",
  "BASE_SEPOLIA",
] as const satisfies (typeof Chain)[number][];

/**
 * "NonfungiblePositionManager" addresses from here:
 * https://docs.uniswap.org/contracts/v3/reference/deployments
 */
export const UniswapV3PositionsAddresses = {
  ETHEREUM: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",
  ARBITRUM: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",
  OPTIMISM: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",
  POLYGON: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",
  CELO: "0x3d79EdAaBC0EaB6F08ED885C05Fc0B014290D95A",
  BSC: "0x7b8A01B39D58278b5DE7e48c8449c9f4F5170613",
  BASE_MAINNET: "0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1",
  SEPOLIA: "0x1238536071E1c677A632429e3655c799b22cDA52",
  BASE_SEPOLIA: "0x1238536071E1c677A632429e3655c799b22cDA52",
  AVALANCHE: "0x655C406EBFa14EE2006250925e54ec43AD184f8B",
  BLAST_MAINNET: "0xB218e4f7cF0533d4696fDfC419A0023D33345F28",
} as const satisfies Record<
  (typeof UniswapV3PositionsChains)[number],
  `0x${string}`
>;

/**
 * "UniswapV3Factory" addresses from here:
 * https://docs.uniswap.org/contracts/v3/reference/deployments
 */
export const UniswapV3FactoryAddresses = {
  ETHEREUM: "0x1F98431c8aD98523631AE4a59f267346ea31F984",
  SEPOLIA: "0x0227628f3F023bb0B980b67D528571c95c6DaC1c",
  ARBITRUM: "0x1F98431c8aD98523631AE4a59f267346ea31F984",
  OPTIMISM: "0x1F98431c8aD98523631AE4a59f267346ea31F984",
  POLYGON: "0x1F98431c8aD98523631AE4a59f267346ea31F984",
  BASE_MAINNET: "0x33128a8fC17869897dcE68Ed026d694621f6FDfD",
  BASE_SEPOLIA: "0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",
  BSC: "0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7",
  AVALANCHE: "0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD",
  CELO: "0xAfE208a311B21f13EF87E33A90049fC17A7acDEc",
  BLAST_MAINNET: "0x792edAdE80af5fC680d96a2eD80A44247D2Cf6Fd",
} as const satisfies Record<
  (typeof UniswapV3PositionsChains)[number],
  `0x${string}`
>;

export const PaymentSupportedChains = [
  "ETHEREUM",
  "POLYGON",
  "OPTIMISM",
  "SEPOLIA",
] as const satisfies (typeof Chain)[number][];

export const FeeCollectorContracts = {
  ETHEREUM: "0xe4b4c6a7c6b6396032096c12adf46b7f14a70f4d",
  POLYGON: "0xe4b4c6a7c6b6396032096c12adf46b7f14a70f4d",
  OPTIMISM: "0xf7c2baa81feb6dd7bda0b3a03afbc1e13f955da5",
  SEPOLIA: "0xc3563655d35397b77228c07a7f5301b0e0fa417d",
} as const satisfies Record<
  (typeof PaymentSupportedChains)[number],
  `0x${string}`
>;

export const walletTypes = ["EVM", "FUEL"] as const;
