/** @param {import('knex').Knex} knex */
export async function up(knex) {
  if (!(await knex.schema.hasTable('sch_schedules'))) {
    await knex.schema.createTable('sch_schedules', (table) => {
      table.string('id', 26).notNullable().primary()
      table.string('name', 100).notNullable()
      table.text('description').nullable()
      table.string('cron_expression', 50).notNullable()
      table.string('timezone', 50).notNullable().defaultTo('UTC')
      table.string('target_type', 20).notNullable()
      table.json('target_config').notNullable()
      table.boolean('enabled').notNullable().defaultTo(true)
      table.string('status', 20).notNullable().defaultTo('idle')
      table.timestamp('last_run_at').nullable()
      table.text('last_error').nullable()
      table.integer('run_count').notNullable().defaultTo(0)
      table.integer('max_retries').nullable().defaultTo(0)
      table.integer('retry_count').nullable().defaultTo(0)
      table.integer('retry_delay_ms').nullable().defaultTo(5000)
      table.string('retry_backoff', 20).nullable().defaultTo('exponential')
      // 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('sch_schedule_logs'))) {
    await knex.schema.createTable('sch_schedule_logs', (table) => {
      table.string('id', 26).notNullable().primary()
      table.string('schedule_id', 26).notNullable()
      table.timestamp('started_at').notNullable()
      table.timestamp('finished_at').nullable()
      table.integer('duration_ms').nullable()
      table.string('status', 20).notNullable()
      table.json('result').nullable()
      table.text('error').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('sch_schedule_logs')
  await knex.schema.dropTableIfExists('sch_schedules')
}
