import { CreateTableBuilder, sql } from "kysely";
import { db } from "./db";
import { log } from "../util";

// =====================
// PRODUCT SYNCS
// =====================
{
    log.info({ name: "product_syncs" }, "Creating table");
    await db.schema.dropTable("product_syncs").ifExists().execute()
    await db.schema.createTable("product_syncs")
        .$call(addDefaultColumns)
        .addColumn("printful_product_id_filter", sql`integer[]`)
        .addColumn("syncing_printful_product_ids", sql`integer[]`, (cb) => cb
            .notNull()
            .defaultTo(sql`'{}'::integer[]`)
        )
        .addColumn("started_at", "timestamptz")
        .addColumn("ended_at", "timestamptz")
        .addColumn("has_failed", "boolean", (cb) => cb.notNull().defaultTo(false))
        .execute()

    await db.schema.dropIndex("idx_one_active_product_sync").ifExists().execute();
    await db.schema.createIndex("idx_one_active_product_sync")
        .on("product_syncs")
        .unique()
        .column("ended_at")
        .where(sql.ref("started_at"), "is not", null)
        .where("ended_at", "is", null)
        .nullsNotDistinct()
        .execute();
}

function addDefaultColumns(ctb: CreateTableBuilder<any, any>) {
    return ctb
        .addColumn("id", "bigint", (cb) => cb
            .generatedAlwaysAsIdentity()
            .primaryKey()
        )
        .addColumn("created_at", "timestamptz", (cb) => cb
            .notNull()
            .defaultTo(sql`now()`)
        )
};
