const { time } = require('@openzeppelin/test-helpers');
const { MAX_UINT64 } = require('./constants');
const { artifacts } = require('hardhat');

function buildBaseRoles() {
  const roles = {
    ADMIN: {
      id: web3.utils.toBN(0),
    },
    SOME_ADMIN: {
      id: web3.utils.toBN(17),
    },
    SOME_GUARDIAN: {
      id: web3.utils.toBN(35),
    },
    SOME: {
      id: web3.utils.toBN(42),
    },
    PUBLIC: {
      id: MAX_UINT64,
    },
  };

  // Names
  Object.entries(roles).forEach(([name, role]) => (role.name = name));

  // Defaults
  for (const role of Object.keys(roles)) {
    roles[role].admin = roles.ADMIN;
    roles[role].guardian = roles.ADMIN;
  }

  // Admins
  roles.SOME.admin = roles.SOME_ADMIN;

  // Guardians
  roles.SOME.guardian = roles.SOME_GUARDIAN;

  return roles;
}

const formatAccess = access => [access[0], access[1].toString()];

const MINSETBACK = time.duration.days(5);
const EXPIRATION = time.duration.weeks(1);

let EXECUTION_ID_STORAGE_SLOT = 3n;
let CONSUMING_SCHEDULE_STORAGE_SLOT = 0n;
try {
  // Try to get the artifact paths, will throw if it doesn't exist
  artifacts._getArtifactPathSync('AccessManagerUpgradeable');
  artifacts._getArtifactPathSync('AccessManagedUpgradeable');

  // ERC-7201 namespace location for AccessManager
  EXECUTION_ID_STORAGE_SLOT += 0x40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad00n;
  // ERC-7201 namespace location for AccessManaged
  CONSUMING_SCHEDULE_STORAGE_SLOT += 0xf3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a00n;
} catch (_) {
  // eslint-disable-next-line no-empty
}

module.exports = {
  buildBaseRoles,
  formatAccess,
  MINSETBACK,
  EXPIRATION,
  EXECUTION_ID_STORAGE_SLOT,
  CONSUMING_SCHEDULE_STORAGE_SLOT,
};