import { db } from "@server/db/pg/driver";
import { sql } from "drizzle-orm";
import { __DIRNAME } from "@server/lib/consts";

const version = "1.14.0";

export default async function migration() {
    console.log(`Running setup script ${version}...`);

    try {
        await db.execute(sql`BEGIN`);

        await db.execute(sql`
            CREATE TABLE "loginPageBranding" (
                "loginPageBrandingId" serial PRIMARY KEY NOT NULL,
                "logoUrl" text NOT NULL,
                "logoWidth" integer NOT NULL,
                "logoHeight" integer NOT NULL,
                "primaryColor" text,
                "resourceTitle" text NOT NULL,
                "resourceSubtitle" text,
                "orgTitle" text,
                "orgSubtitle" text
            );
        `);

        await db.execute(sql`
            CREATE TABLE "loginPageBrandingOrg" (
                "loginPageBrandingId" integer NOT NULL,
                "orgId" varchar NOT NULL
            );
        `);

        await db.execute(sql`
            CREATE TABLE "resourceHeaderAuthExtendedCompatibility" (
                "headerAuthExtendedCompatibilityId" serial PRIMARY KEY NOT NULL,
                "resourceId" integer NOT NULL,
                "extendedCompatibilityIsActivated" boolean DEFAULT false NOT NULL
            );
        `);

        await db.execute(
            sql`ALTER TABLE "resources" ADD COLUMN "maintenanceModeEnabled" boolean DEFAULT false NOT NULL;`
        );

        await db.execute(
            sql`ALTER TABLE "resources" ADD COLUMN "maintenanceModeType" text DEFAULT 'forced';`
        );

        await db.execute(
            sql`ALTER TABLE "resources" ADD COLUMN "maintenanceTitle" text;`
        );

        await db.execute(
            sql`ALTER TABLE "resources" ADD COLUMN "maintenanceMessage" text;`
        );

        await db.execute(
            sql`ALTER TABLE "resources" ADD COLUMN "maintenanceEstimatedTime" text;`
        );

        await db.execute(
            sql`ALTER TABLE "siteResources" ADD COLUMN "tcpPortRangeString" varchar NOT NULL DEFAULT '*';`
        );

        await db.execute(
            sql`ALTER TABLE "siteResources" ADD COLUMN "udpPortRangeString" varchar NOT NULL DEFAULT '*';`
        );

        await db.execute(
            sql`ALTER TABLE "siteResources" ADD COLUMN "disableIcmp" boolean DEFAULT false NOT NULL;`
        );

        await db.execute(
            sql`ALTER TABLE "loginPageBrandingOrg" ADD CONSTRAINT "loginPageBrandingOrg_loginPageBrandingId_loginPageBranding_loginPageBrandingId_fk" FOREIGN KEY ("loginPageBrandingId") REFERENCES "public"."loginPageBranding"("loginPageBrandingId") ON DELETE cascade ON UPDATE no action;`
        );

        await db.execute(
            sql`ALTER TABLE "loginPageBrandingOrg" ADD CONSTRAINT "loginPageBrandingOrg_orgId_orgs_orgId_fk" FOREIGN KEY ("orgId") REFERENCES "public"."orgs"("orgId") ON DELETE cascade ON UPDATE no action;`
        );

        await db.execute(
            sql`ALTER TABLE "resourceHeaderAuthExtendedCompatibility" ADD CONSTRAINT "resourceHeaderAuthExtendedCompatibility_resourceId_resources_resourceId_fk" FOREIGN KEY ("resourceId") REFERENCES "public"."resources"("resourceId") ON DELETE cascade ON UPDATE no action;`
        );

        await db.execute(sql`COMMIT`);
        console.log("Migrated database");
    } catch (e) {
        await db.execute(sql`ROLLBACK`);
        console.log("Unable to migrate database");
        console.log(e);
        throw e;
    }

    console.log(`${version} migration complete`);
}
