import MySQLAsyncAdapter from "mysql-async-adapter";

export default class MySQLModule {
  private mysql: MySQLAsyncAdapter;
  public static db: MySQLAsyncAdapter;
  async onInit() {
    this.mysql = await new MySQLAsyncAdapter({
      host: "127.0.0.1",
      user: "root",
      password: "Saq33rrT",
      database: "sys"
    }).connect();
    const res = await this.mysql.query(
      "CREATE DATABASE IF NOT EXISTS aux_events;"
    );
    const res2 = await this.mysql.query("use aux_events;");

    // Хранилище событий
    const res3 = await this.mysql.query(`create table if not exists events (
                        event_id bigint(255) UNSIGNED NOT NULL,
                        event_type varchar(1000),
                        event_data varchar(1000) NOT NULL,
                        entity_type VARCHAR(1000) NOT NULL,
                        entity_id varchar(1000) NOT NULL,
                        triggering_event VARCHAR(1000),
                        create_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
                );`);
    if (res3["warningCount"] == 0)
      await this.mysql.query(
        "ALTER TABLE `events` ADD PRIMARY KEY (`event_id`)"
      );
    // Хранилище сущностей (1 строка 1 сущность)
    const res4 = await this.mysql.query(`create table if not exists entities (
                        entity_type VARCHAR(1000),
                        entity_id VARCHAR(1000),
                        entity_version VARCHAR(1000) NOT NULL,
                        PRIMARY KEY(entity_type, entity_id)
                );`);

    // хранилище снимков
    const res5 = await this.mysql.query(`create table if not exists snapshots (
                        entity_type VARCHAR(1000),
                        entity_id VARCHAR(1000),
                        entity_version VARCHAR(1000),
                        snapshot_type VARCHAR(1000) NOT NULL,
                        snapshot_json VARCHAR(1000) NOT NULL,
                        triggering_events VARCHAR(1000),
                        PRIMARY KEY (entity_type, entity_id, entity_version)
                );`);
    MySQLModule.db = this.mysql;
  }
}
