import type { Kysely } from "kysely";
import { sql } from "kysely";

export async function up(db: Kysely<any>): Promise<void> {
    await db.schema
        .createTable("campaign_groups")
        .ifNotExists()
        .addColumn("id", "uuid", (col) => col.primaryKey().defaultTo(sql`gen_random_uuid()`))
        .addColumn("name", "text", (col) => col.notNull())
        .addColumn("description", "text")
        // ACTIVE | PAUSED | DELETED. Lifecycle (draft/scheduled/sending/completed) is derived from subcampaigns.
        .addColumn("status", "text", (col) => col.notNull().defaultTo("ACTIVE"))
        .addColumn("created_by", "text")
        .addColumn("created_at", "timestamptz", (col) => col.notNull().defaultTo(sql`now()`))
        .addColumn("updated_at", "timestamptz", (col) => col.notNull().defaultTo(sql`now()`))
        .execute();

    await db.schema
        .alterTable("campaigns")
        .addColumn("parent_id", "uuid", (col) => col.references("campaign_groups.id").onDelete("set null"))
        .execute();

    // Marks subcampaigns stopped by a parent-level pause, so parent resume only restarts those.
    await db.schema
        .alterTable("campaigns")
        .addColumn("paused_by_parent", "boolean", (col) => col.notNull().defaultTo(false))
        .execute();

    await db.schema
        .createIndex("campaigns_parent_id_index")
        .ifNotExists()
        .on("campaigns")
        .column("parent_id")
        .execute();
}

export async function down(db: Kysely<any>): Promise<void> {
    await db.schema.dropIndex("campaigns_parent_id_index").ifExists().execute();
    await db.schema.alterTable("campaigns").dropColumn("paused_by_parent").execute();
    await db.schema.alterTable("campaigns").dropColumn("parent_id").execute();
    await db.schema.dropTable("campaign_groups").ifExists().execute();
}
