/** @param {import('knex').Knex} knex */
export async function up(knex) {
  if (!(await knex.schema.hasTable('rmt_credentials'))) {
    await knex.schema.createTable('rmt_credentials', (table) => {
      table.string('id', 26).notNullable().primary()
      table.string('name', 100).notNullable().unique()
      table.string('type', 50).notNullable()
      table.text('private_key').nullable()
      table.text('public_key').nullable()
      table.text('passphrase').nullable()
      table.text('password').nullable()
      table.text('notes').nullable()
      // timestamps
      table.timestamp('created_at').nullable().defaultTo(knex.fn.now())
      table.timestamp('updated_at').nullable().defaultTo(knex.fn.now())
      // audit
      table.string('created_by', 26).nullable()
      table.string('updated_by', 26).nullable()
    })
  }

  if (!(await knex.schema.hasTable('rmt_hosts'))) {
    await knex.schema.createTable('rmt_hosts', (table) => {
      table.string('id', 26).notNullable().primary()
      table.string('name', 100).notNullable().unique()
      table.string('hostname', 255).notNullable()
      table.integer('port').nullable().defaultTo(22)
      table.string('username', 100).notNullable().defaultTo('root')
      table.string('auth_method', 50).notNullable().defaultTo('default_key')
      table.string('credential_id', 26).nullable().references('rmt_credentials.id').onDelete('SET NULL')
      table.json('tags').nullable()
      table.string('status', 50).nullable().defaultTo('unknown')
      table.timestamp('last_seen').nullable()
      table.string('fingerprint', 500).nullable()
      table.text('notes').nullable()
      // timestamps
      table.timestamp('created_at').nullable().defaultTo(knex.fn.now())
      table.timestamp('updated_at').nullable().defaultTo(knex.fn.now())
      // audit
      table.string('created_by', 26).nullable()
      table.string('updated_by', 26).nullable()
    })
  }

  if (!(await knex.schema.hasTable('rmt_scripts'))) {
    await knex.schema.createTable('rmt_scripts', (table) => {
      table.string('id', 26).notNullable().primary()
      table.string('name', 100).notNullable().unique()
      table.text('description').nullable()
      table.text('content').notNullable()
      table.string('interpreter', 50).notNullable().defaultTo('bash')
      table.json('tags').nullable()
      table.integer('timeout').nullable().defaultTo(30000)
      // timestamps
      table.timestamp('created_at').nullable().defaultTo(knex.fn.now())
      table.timestamp('updated_at').nullable().defaultTo(knex.fn.now())
      // audit
      table.string('created_by', 26).nullable()
      table.string('updated_by', 26).nullable()
    })
  }

  if (!(await knex.schema.hasTable('rmt_executions'))) {
    await knex.schema.createTable('rmt_executions', (table) => {
      table.string('id', 26).notNullable().primary()
      table.string('host_id', 26).nullable().references('rmt_hosts.id').onDelete('SET NULL')
      table.string('host_name', 100).nullable()
      table.string('script_id', 26).nullable()
      table.text('command').nullable()
      table.integer('exit_code').nullable()
      table.text('stdout').nullable()
      table.text('stderr').nullable()
      table.integer('duration_ms').nullable()
      table.string('status', 50).nullable()
      table.string('triggered_by', 50).nullable()
      table.string('triggered_by_id', 50).nullable()
      // timestamps
      table.timestamp('created_at').nullable().defaultTo(knex.fn.now())
      table.timestamp('updated_at').nullable().defaultTo(knex.fn.now())
    })
  }

}

/** @param {import('knex').Knex} knex */
export async function down(knex) {
  await knex.schema.dropTableIfExists('rmt_executions')
  await knex.schema.dropTableIfExists('rmt_scripts')
  await knex.schema.dropTableIfExists('rmt_hosts')
  await knex.schema.dropTableIfExists('rmt_credentials')
}
