import { MigrationInterface, QueryRunner } from 'typeorm';

export class InitialSchema1730000000000 implements MigrationInterface {
  name = 'InitialSchema1730000000000';

  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`
      CREATE TABLE "users" (
        "id" uuid NOT NULL DEFAULT gen_random_uuid(),
        "google_id" character varying NOT NULL,
        "email" character varying NOT NULL,
        "name" character varying NOT NULL,
        "access_token" character varying,
        "refresh_token" character varying,
        "token_expiry" bigint,
        "created_at" TIMESTAMP NOT NULL DEFAULT now(),
        CONSTRAINT "UQ_users_google_id" UNIQUE ("google_id"),
        CONSTRAINT "PK_users" PRIMARY KEY ("id")
      )
    `);
    await queryRunner.query(`
      CREATE TABLE "apps" (
        "id" uuid NOT NULL DEFAULT gen_random_uuid(),
        "user_id" uuid NOT NULL,
        "platform" character varying NOT NULL,
        "app_name" character varying NOT NULL,
        "bundle_or_package" character varying NOT NULL,
        "created_at" TIMESTAMP NOT NULL DEFAULT now(),
        CONSTRAINT "PK_apps" PRIMARY KEY ("id"),
        CONSTRAINT "FK_apps_user" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE
      )
    `);
    await queryRunner.query(`
      CREATE TABLE "builds" (
        "id" uuid NOT NULL,
        "app_id" uuid NOT NULL,
        "version" character varying NOT NULL,
        "build_number" character varying NOT NULL,
        "min_os" character varying,
        "drive_file_id" character varying NOT NULL,
        "plist_file_id" character varying,
        "size" bigint NOT NULL DEFAULT 0,
        "created_at" TIMESTAMP NOT NULL DEFAULT now(),
        CONSTRAINT "PK_builds" PRIMARY KEY ("id"),
        CONSTRAINT "FK_builds_app" FOREIGN KEY ("app_id") REFERENCES "apps"("id") ON DELETE CASCADE
      )
    `);
    await queryRunner.query(`
      CREATE UNIQUE INDEX "IDX_apps_platform_bundle" ON "apps" ("user_id", "platform", "bundle_or_package")
    `);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`DROP INDEX "IDX_apps_platform_bundle"`);
    await queryRunner.query(`DROP TABLE "builds"`);
    await queryRunner.query(`DROP TABLE "apps"`);
    await queryRunner.query(`DROP TABLE "users"`);
  }
}
