import { task } from 'hardhat/config';
import { ConfigNames, loadPoolConfig } from '../../helpers/configuration';
import {
  getAaveProtocolDataProvider,
  getLendingPoolAddressesProvider,
  getLendingPoolAddressesProviderRegistry,
} from '../../helpers/contracts-getters';
import { getParamPerNetwork } from '../../helpers/contracts-helpers';
import { DRE } from '../../helpers/misc-utils';
import { eEthereumNetwork } from '../../helpers/types';

task('print-config', 'Inits the DRE, to have access to all the plugins')
  .addParam('dataProvider', 'Address of AaveProtocolDataProvider')
  .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`)
  .setAction(async ({ pool, dataProvider }, localBRE) => {
    await localBRE.run('set-DRE');
    const network =
      process.env.MAINNET_FORK === 'true'
        ? eEthereumNetwork.main
        : (localBRE.network.name as eEthereumNetwork);
    const poolConfig = loadPoolConfig(pool);

    const providerRegistryAddress = getParamPerNetwork(poolConfig.ProviderRegistry, network);

    const providerRegistry = await getLendingPoolAddressesProviderRegistry(providerRegistryAddress);

    const providers = await providerRegistry.getAddressesProvidersList();

    const addressesProvider = await getLendingPoolAddressesProvider(providers[0]); // Checks first provider

    console.log('Addresses Providers', providers.join(', '));
    console.log('Market Id: ', await addressesProvider.getMarketId());
    console.log('LendingPool Proxy:', await addressesProvider.getLendingPool());
    console.log(
      'Lending Pool Collateral Manager',
      await addressesProvider.getLendingPoolCollateralManager()
    );
    console.log(
      'Lending Pool Configurator proxy',
      await addressesProvider.getLendingPoolConfigurator()
    );
    console.log('Pool admin', await addressesProvider.getPoolAdmin());
    console.log('Emergency admin', await addressesProvider.getEmergencyAdmin());
    console.log('Price Oracle', await addressesProvider.getPriceOracle());
    console.log('Lending Rate Oracle', await addressesProvider.getLendingRateOracle());
    console.log('Lending Pool Data Provider', dataProvider);
    const protocolDataProvider = await getAaveProtocolDataProvider(dataProvider);

    const fields = [
      'decimals',
      'ltv',
      'liquidationThreshold',
      'liquidationBonus',
      'reserveFactor',
      'usageAsCollateralEnabled',
      'borrowingEnabled',
      'stableBorrowRateEnabled',
      'isActive',
      'isFrozen',
    ];
    const tokensFields = ['aToken', 'stableDebtToken', 'variableDebtToken'];
    for (const [symbol, address] of Object.entries(
      getParamPerNetwork(poolConfig.ReserveAssets, network)
    )) {
      console.log(`- ${symbol} asset config`);
      console.log(`  - reserve address: ${address}`);

      const reserveData = await protocolDataProvider.getReserveConfigurationData(address);
      const tokensAddresses = await protocolDataProvider.getReserveTokensAddresses(address);
      fields.forEach((field, index) => {
        console.log(`  - ${field}:`, reserveData[field].toString());
      });
      tokensFields.forEach((field, index) => {
        console.log(`  - ${field}:`, tokensAddresses[index]);
      });
    }
  });