import * as dotenv from "dotenv";

import { HardhatUserConfig, subtask } from "hardhat/config";
import * as toml from "toml";
import "@nomicfoundation/hardhat-verify";
import "@nomicfoundation/hardhat-ethers";
import "@nomicfoundation/hardhat-chai-matchers";
import "@typechain/hardhat";
import "@primitivefi/hardhat-dodoc";
import "hardhat-gas-reporter";
import "solidity-coverage";
import { readFileSync } from "fs";
import { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } from "hardhat/builtin-tasks/task-names";

dotenv.config();

const L1_DEPLOYER_PRIVATE_KEY = process.env.L1_DEPLOYER_PRIVATE_KEY || "1".repeat(64);
const L2_DEPLOYER_PRIVATE_KEY = process.env.L2_DEPLOYER_PRIVATE_KEY || "1".repeat(64);

const SOLC_DEFAULT = "0.8.24";

// try use forge config
let foundry: any;
try {
  foundry = toml.parse(readFileSync("./foundry.toml").toString());
  foundry.default.solc = foundry.default["solc-version"] ? foundry.default["solc-version"] : SOLC_DEFAULT;
} catch (error) {
  foundry = {
    default: {
      solc: SOLC_DEFAULT,
    },
  };
}

// prune forge style tests from hardhat paths
subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction(async (_, __, runSuper) => {
  const paths = await runSuper();
  return paths.filter((p: string) => !p.endsWith(".t.sol")).filter((p: string) => !p.includes("test/mocks"));
});

const config: HardhatUserConfig = {
  solidity: {
    version: foundry.default?.solc_version || SOLC_DEFAULT,
    settings: {
      optimizer: {
        enabled: foundry.default?.optimizer || true,
        runs: foundry.default?.optimizer_runs || 200,
      },
      evmVersion: "cancun",
    },
  },
  networks: {
    ethereum: {
      url: "https://1rpc.io/eth",
      accounts: [L1_DEPLOYER_PRIVATE_KEY],
    },
    sepolia: {
      url: "https://1rpc.io/sepolia",
      accounts: [L1_DEPLOYER_PRIVATE_KEY],
    },
    scroll: {
      url: "https://rpc.scroll.io",
      accounts: [L2_DEPLOYER_PRIVATE_KEY],
    },
    scroll_sepolia: {
      url: "https://sepolia-rpc.scroll.io",
      accounts: [L2_DEPLOYER_PRIVATE_KEY],
    },
  },
  paths: {
    cache: "./cache-hardhat",
    sources: "./src",
    tests: "./integration-test",
  },
  typechain: {
    outDir: "./typechain",
    target: "ethers-v6",
  },
  gasReporter: {
    enabled: process.env.REPORT_GAS !== undefined,
    excludeContracts: ["src/test"],
    currency: "USD",
  },
  etherscan: {
    apiKey: {
      ethereum: process.env.ETHERSCAN_API_KEY || "",
      sepolia: process.env.ETHERSCAN_API_KEY || "",
      scroll: process.env.SCROLLSCAN_API_KEY || "",
      scroll_sepolia: process.env.SCROLLSCAN_API_KEY || "",
    },
    customChains: [
      {
        network: "scroll",
        chainId: 534352,
        urls: {
          apiURL: "https://api.scrollscan.com/api",
          browserURL: "https://www.scrollscan.com/",
        },
      },
      {
        network: "scroll_sepolia",
        chainId: 534351,
        urls: {
          apiURL: "https://api-sepolia.scrollscan.com/api",
          browserURL: "https://sepolia.scrollscan.com/",
        },
      },
    ],
  },
  mocha: {
    timeout: 10000000,
  },
  dodoc: {
    runOnCompile: true,
    keepFileStructure: false,
    include: [
      "ScrollChain",
      "L1ScrollMessenger",
      "L2ScrollMessenger",
      "L1GatewayRouter",
      "L2GatewayRouter",
      "L1StandardERC20Gateway",
      "L2StandardERC20Gateway",
      "L1ERC721Gateway",
      "L2ERC721Gateway",
      "L1ERC1155Gateway",
      "L2ERC1155Gateway",
      "L1WETHGateway",
      "L2WETHGateway",
      "ScrollStandardERC20Factory",
    ],
    outputDir: "docs/apis",
    exclude: [
      "IERC677Receiver",
      "IL1ScrollMessenger",
      "IL2ScrollMessenger",
      "IL1GatewayRouter",
      "IL2GatewayRouter",
      "IL1ERC721Gateway",
      "IL2ERC721Gateway",
      "IL1ERC1155Gateway",
      "IL2ERC1155Gateway",
      "IScrollStandardERC20Factory",
      "IScrollChain",
      "ScrollChainCommitmentVerifier",
      "WETH9",
    ],
  },
};

export default config;
