import { MigrationInterface, QueryRunner } from "typeorm"

export class CreatePartyPaymentHistoriesTable1769591702194 implements MigrationInterface {
  name = "CreatePartyPaymentHistoriesTable1769591702194"

  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`CREATE TABLE "party_payment_histories" (
            "id" SERIAL NOT NULL,
            "party_payment_id" integer NOT NULL,
            "party_id" integer NOT NULL,
            "party_type" character varying(50) NOT NULL,
            "project_id" integer NOT NULL,
            "company_id" integer NOT NULL,
            "amount" numeric(15,2) NOT NULL,
            "billing_month" date NOT NULL,
            "created_by" integer,
            "updated_by" integer,
            "deleted_by" integer,
            "created_at" TIMESTAMP NOT NULL DEFAULT now(),
            "updated_at" TIMESTAMP NOT NULL DEFAULT now(),
            "deleted_at" TIMESTAMP,
            CONSTRAINT "PK_party_payment_histories" PRIMARY KEY ("id")
        )`)

    await queryRunner.query(
      `CREATE INDEX "idx_party_payment_histories_billing_month" ON "party_payment_histories" ("billing_month")`,
    )
    await queryRunner.query(
      `CREATE INDEX "idx_party_payment_histories_company" ON "party_payment_histories" ("company_id")`,
    )
    await queryRunner.query(
      `CREATE INDEX "idx_party_payment_histories_project" ON "party_payment_histories" ("project_id")`,
    )
    await queryRunner.query(
      `CREATE INDEX "idx_party_payment_histories_party" ON "party_payment_histories" ("party_id", "party_type")`,
    )
    await queryRunner.query(
      `CREATE UNIQUE INDEX "idx_party_payment_histories_unique" ON "party_payment_histories" ("billing_month", "party_payment_id")`,
    )

    await queryRunner.query(
      `ALTER TABLE "party_payment_histories" ADD CONSTRAINT "FK_0608debc9ec8847781f44aa507e" FOREIGN KEY ("party_payment_id") REFERENCES "party_payments"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
    )
    await queryRunner.query(
      `ALTER TABLE "party_payment_histories" ADD CONSTRAINT "FK_385784af23dc8d0da3a74ca3474" FOREIGN KEY ("project_id") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
    )
    await queryRunner.query(
      `ALTER TABLE "party_payment_histories" ADD CONSTRAINT "FK_06e8aa1d30fe6679f2310873f93" FOREIGN KEY ("company_id") REFERENCES "companies"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
    )
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`DROP TABLE "party_payment_histories"`)
  }
}
