import "./type-extensions.js";

import type { HardhatPlugin } from "hardhat/types/plugins";
import { overrideTask } from "hardhat/config";

import migrateTask from "./internal/tasks/migrate/index.js";
import migrateVerifyTask from "./internal/tasks/migrate-verify/index.js";

import { MIGRATE_NPM_PACKAGE, PLUGIN_ID } from "./constants.js";
import { DefaultStorage } from "./internal/tools/storage/MigrateStorage.js";

export { Deployer } from "./internal/deployer/Deployer.js";
export { PublicReporter as Reporter } from "./internal/tools/reporters/PublicReporter.js";
export {
  UserStorage,
  TransactionStorage,
  VerificationStorage,
  ArtifactStorage,
} from "./internal/tools/storage/MigrateStorage.js";

const hardhatPlugin: HardhatPlugin = {
  id: PLUGIN_ID,
  hookHandlers: {
    config: () => import("./config.js"),
  },
  dependencies: () => [import("@nomicfoundation/hardhat-ethers"), import("@nomicfoundation/hardhat-verify")],
  tasks: [
    migrateTask,
    migrateVerifyTask,
    overrideTask("clean")
      .setAction(async () => ({
        default: async (args, _hre, runSuper) => {
          DefaultStorage!.deleteStateFile();

          await runSuper(args);
        },
      }))
      .build(),
  ],
  npmPackage: MIGRATE_NPM_PACKAGE,
} satisfies HardhatPlugin;

export default hardhatPlugin;
