import { QueryInterface, Sequelize } from 'sequelize';
import Database from './database';

export interface MigrationContext {
  db: Database;
  queryInterface: QueryInterface;
  sequelize: Sequelize;
}

export class Migration {
  public name: string;

  public context: { db: Database; [key: string]: any };

  constructor(context: MigrationContext) {
    this.context = context;
  }

  get db() {
    return this.context.db;
  }

  get sequelize() {
    return this.context.db.sequelize;
  }

  get queryInterface() {
    return this.context.db.sequelize.getQueryInterface();
  }

  async up() {
    // todo
  }

  async down() {
    // todo
  }
}

export interface MigrationItem {
  name: string;
  migration?: typeof Migration;
  context?: any;
  up?: any;
  down?: any;
}

export class Migrations {
  items = [];
  context: any;

  constructor(context: any) {
    this.context = context;
  }

  clear() {
    this.items = [];
  }

  add(item: MigrationItem) {
    const Migration = item.migration;
    if (Migration) {
      const migration = new Migration({ ...this.context, ...item.context });
      migration.name = item.name;
      this.items.push(migration);
    } else {
      this.items.push(item);
    }
  }

  callback() {
    return async (ctx) => {
      return this.items;
    };
  }
}