import type { ConfigHooks } from 'hardhat/types/hooks';

export default async (): Promise<Partial<ConfigHooks>> => {
  return {
    async resolveUserConfig(userConfig, resolveConfigurationVariable, next) {
      // First, let other plugins resolve the config
      const config = await next(userConfig, resolveConfigurationVariable);

      // Iterate through all profiles
      for (const profile of Object.values(config.solidity.profiles)) {
        // Accumulate references to all the compiler settings, including overrides
        const settings = [];

        for (const compiler of profile.compilers) {
          compiler.settings ??= {};
          settings.push(compiler.settings);
        }

        for (const compilerOverride of Object.values(profile.overrides)) {
          compilerOverride.settings ??= {};
          settings.push(compilerOverride.settings);
        }

        // Enable storage layout output for upgrade safety validations.
        // Also enable metadata, which downstream consumers (Defender license detection,
        // Foundry-bridge artifact injection) read from the build-info.
        for (const setting of settings) {
          setting.outputSelection ??= {};
          setting.outputSelection['*'] ??= {};
          setting.outputSelection['*']['*'] ??= [];

          if (!setting.outputSelection['*']['*'].includes('storageLayout')) {
            setting.outputSelection['*']['*'].push('storageLayout');
          }
          if (!setting.outputSelection['*']['*'].includes('metadata')) {
            setting.outputSelection['*']['*'].push('metadata');
          }
        }
      }

      return config;
    },
  };
};
