import { Wallet } from "ethers"
import { CommandHandler } from "../.."
import { assertExists, assertIsNonEmptyString } from "../../utils"
import { AppendToFile } from "../../utils/append.to.file"
import { GetCredentials } from "../../utils/get.credentials"
import AgentRegistry from "../../contracts/agent.registry"

export default function provideDisable(
  appendToFile: AppendToFile,
  getCredentials: GetCredentials,
  agentRegistry: AgentRegistry,
  agentId: string,
): CommandHandler {
  assertExists(appendToFile, 'appendToFile')
  assertExists(getCredentials, 'getCredentials')
  assertExists(agentRegistry, 'agentRegistry')
  assertIsNonEmptyString(agentId, 'agentId')

  return async function disable() {
    const agentExists = await agentRegistry.agentExists(agentId)
    if (!agentExists) {
      throw new Error(`agent id ${agentId} does not exist`)
    }

    const isAgentEnabled = await agentRegistry.isEnabled(agentId)
    if (!isAgentEnabled) {
      console.log(`agent id ${agentId} is already disabled`)
      return
    }

    const { privateKey } = await getCredentials()

    console.log('disabling agent...')
    const fromWallet = new Wallet(privateKey)
    await agentRegistry.disableAgent(fromWallet, agentId)

    const logMessage = `successfully disabled agent id ${agentId}`
    console.log(logMessage)
    appendToFile(`${new Date().toUTCString()}: ${logMessage}`, 'publish.log')
  }
}