import { MigrationInterface, QueryRunner } from "typeorm";
import {
  invite_table,
  refresh_table,
  reset_table,
  role_permission_table,
  role_table,
  user_permission_table,
  user_roles_table,
  user_table,
  webapi_permission_table,
  webapi_table,
} from "./baseSchemaTables/admin";
import { templateUsage } from "../entity/settings/templateUsage";
import {
  award_table,
  communication_type_table,
  executive_position_table,
  member_awards_table,
  member_communication_table,
  member_executive_positions_table,
  member_executive_positions_view,
  member_executive_positions_view_postgres,
  member_qualifications_table,
  member_qualifications_view,
  member_qualifications_view_postgres,
  member_table,
  member_view,
  member_view_postgres,
  membership_status_table,
  membership_table,
  membership_view,
  membership_view_postgres,
  qualification_table,
  salutation_table,
} from "./baseSchemaTables/member";
import { query_table, template_table, template_usage_table } from "./baseSchemaTables/query_template";
import {
  protocol_agenda_table,
  protocol_decision_table,
  protocol_presence_table,
  protocol_printout_table,
  protocol_table,
  protocol_voting_table,
} from "./baseSchemaTables/protocol";
import { calendar_table, calendar_type_table } from "./baseSchemaTables/calendar";
import {
  newsletter_config_table,
  newsletter_dates_table,
  newsletter_recipients_table,
  newsletter_table,
} from "./baseSchemaTables/newsletter";
import { DB_TYPE } from "../env.defaults";

export class CreateSchema1738166167472 implements MigrationInterface {
  name = "CreateSchema1738166167472";

  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.createTable(reset_table, true, true, true);
    await queryRunner.createTable(invite_table, true, true, true);
    await queryRunner.createTable(role_table, true, true, true);
    await queryRunner.createTable(role_permission_table, true, true, true);
    await queryRunner.createTable(user_table, true, true, true);
    await queryRunner.createTable(user_roles_table, true, true, true);
    await queryRunner.createTable(user_permission_table, true, true, true);
    await queryRunner.createTable(refresh_table, true, true, true);
    await queryRunner.createTable(webapi_table, true, true, true);
    await queryRunner.createTable(webapi_permission_table, true, true, true);

    await queryRunner.createTable(salutation_table, true, true, true);
    await queryRunner.createTable(award_table, true, true, true);
    await queryRunner.createTable(communication_type_table, true, true, true);
    await queryRunner.createTable(membership_status_table, true, true, true);
    await queryRunner.createTable(executive_position_table, true, true, true);
    await queryRunner.createTable(qualification_table, true, true, true);
    await queryRunner.createTable(member_table, true, true, true);
    await queryRunner.createTable(member_awards_table, true, true, true);
    await queryRunner.createTable(member_communication_table, true, true, true);
    await queryRunner.createTable(membership_table, true, true, true);
    await queryRunner.createTable(member_executive_positions_table, true, true, true);
    await queryRunner.createTable(member_qualifications_table, true, true, true);

    if (DB_TYPE == "postgres") await queryRunner.createView(member_view_postgres, true);
    else await queryRunner.createView(member_view, true);
    if (DB_TYPE == "postgres") await queryRunner.createView(membership_view_postgres, true);
    else await queryRunner.createView(membership_view, true);
    if (DB_TYPE == "postgres") await queryRunner.createView(member_qualifications_view_postgres, true);
    else await queryRunner.createView(member_qualifications_view, true);
    if (DB_TYPE == "postgres") await queryRunner.createView(member_executive_positions_view_postgres, true);
    else await queryRunner.createView(member_executive_positions_view, true);

    await queryRunner.createTable(query_table, true, true, true);
    await queryRunner.createTable(template_table, true, true, true);
    await queryRunner.createTable(template_usage_table, true, true, true);

    await queryRunner.manager
      .createQueryBuilder()
      .insert()
      .into(templateUsage)
      .values([{ scope: "newsletter" }, { scope: "protocol" }, { scope: "member.list" }])
      .orUpdate(["headerId", "bodyId", "footerId", "headerHeight", "footerHeight"], ["scope"])
      .execute();

    await queryRunner.createTable(protocol_table, true, true, true);
    await queryRunner.createTable(protocol_agenda_table, true, true, true);
    await queryRunner.createTable(protocol_decision_table, true, true, true);
    await queryRunner.createTable(protocol_presence_table, true, true, true);
    await queryRunner.createTable(protocol_voting_table, true, true, true);
    await queryRunner.createTable(protocol_printout_table, true, true, true);

    await queryRunner.createTable(calendar_type_table, true, true, true);
    await queryRunner.createTable(calendar_table, true, true, true);

    await queryRunner.createTable(newsletter_config_table, true, true, true);
    await queryRunner.createTable(newsletter_table, true, true, true);
    await queryRunner.createTable(newsletter_dates_table, true, true, true);
    await queryRunner.createTable(newsletter_recipients_table, true, true, true);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.dropTable("newsletter_dates", true, true, true);
    await queryRunner.dropTable("newsletter_recipients", true, true, true);
    await queryRunner.dropTable("newsletter", true, true, true);
    await queryRunner.dropTable("newsletter_config", true, true, true);

    await queryRunner.dropTable("calendar", true, true, true);
    await queryRunner.dropTable("calendar_type", true, true, true);

    await queryRunner.dropTable("protocol_agenda", true, true, true);
    await queryRunner.dropTable("protocol_decision", true, true, true);
    await queryRunner.dropTable("protocol_presence", true, true, true);
    await queryRunner.dropTable("protocol_voting", true, true, true);
    await queryRunner.dropTable("protocol_printout", true, true, true);
    await queryRunner.dropTable("protocol", true, true, true);

    await queryRunner.dropTable("template_usage", true, true, true);
    await queryRunner.dropTable("template", true, true, true);
    await queryRunner.dropTable("query", true, true, true);

    await queryRunner.dropView("member_view");
    await queryRunner.dropView("membership_view");
    await queryRunner.dropView("member_qualifications_view");
    await queryRunner.dropView("member_executive_positions_view");

    await queryRunner.dropTable("member_awards", true, true, true);
    await queryRunner.dropTable("communication", true, true, true);
    await queryRunner.dropTable("membership", true, true, true);
    await queryRunner.dropTable("member_executive_positions", true, true, true);
    await queryRunner.dropTable("member_qualifications", true, true, true);
    await queryRunner.dropTable("member", true, true, true);
    await queryRunner.dropTable("salutation", true, true, true);
    await queryRunner.dropTable("award", true, true, true);
    await queryRunner.dropTable("communication_type", true, true, true);
    await queryRunner.dropTable("membership_status", true, true, true);
    await queryRunner.dropTable("executive_position", true, true, true);
    await queryRunner.dropTable("qualification", true, true, true);

    await queryRunner.dropTable("webapi_permission", true, true, true);
    await queryRunner.dropTable("webapi", true, true, true);
    await queryRunner.dropTable("refresh", true, true, true);
    await queryRunner.dropTable("user_permission", true, true, true);
    await queryRunner.dropTable("user_roles", true, true, true);
    await queryRunner.dropTable("user", true, true, true);
    await queryRunner.dropTable("role_permission", true, true, true);
    await queryRunner.dropTable("role", true, true, true);
    await queryRunner.dropTable("invite", true, true, true);
    await queryRunner.dropTable("reset", true, true, true);
  }
}