iDevBuddy
feat: Phase 1 — AI Client Acquisition System
bd28470
import { getSupabaseClient } from "../../shared/supabase/client";
import { logger } from "../../shared/utils/logger";
// Week number → region mapping
const ROTATION_MAP: Record<number, string> = {
1: "US",
2: "UK",
3: "AU",
4: "UAE",
};
export interface RotationInfo {
weekNumber: number;
region: string;
rotationId: string;
}
/**
* Gets the current rotation region and advances the week counter.
* Rotation cycles: US → UK → AU → UAE → US → ...
*/
export async function getCurrentRotation(): Promise<RotationInfo> {
const db = getSupabaseClient();
// Get the latest rotation record
const { data: latest } = await db
.from("rotation_state")
.select("*")
.order("started_at", { ascending: false })
.limit(1)
.single();
const currentWeek = latest?.week_number ?? 1;
const region = ROTATION_MAP[currentWeek] ?? "US";
logger.info({ currentWeek, region }, "Rotation: current region");
return {
weekNumber: currentWeek,
region,
rotationId: latest?.id ?? "unknown",
};
}
/**
* Creates a new rotation record for the next week.
* Call this at the END of a successful run.
*/
export async function advanceRotation(currentWeek: number): Promise<void> {
const db = getSupabaseClient();
const nextWeek = currentWeek >= 4 ? 1 : currentWeek + 1;
const nextRegion = ROTATION_MAP[nextWeek];
const { error } = await db.from("rotation_state").insert({
week_number: nextWeek,
region: nextRegion,
});
if (error) {
logger.error({ error }, "Failed to advance rotation");
} else {
logger.info({ nextWeek, nextRegion }, "Rotation: advanced to next region");
}
}
/**
* Marks the current rotation run as completed with stats.
*/
export async function completeRotation(
rotationId: string,
companiesFound: number,
leadsQualified: number
): Promise<void> {
const db = getSupabaseClient();
await db
.from("rotation_state")
.update({ completed_at: new Date().toISOString(), companies_found: companiesFound, leads_qualified: leadsQualified })
.eq("id", rotationId);
logger.info({ rotationId, companiesFound, leadsQualified }, "Rotation: completed");
}
/**
* Converts a region code to ICP geography + search labels.
*/
export function getRegionConfig(region: string): {
countryCode: string;
searchLabel: string;
industries: string[];
} {
const configs: Record<string, { countryCode: string; searchLabel: string; industries: string[] }> = {
US: {
countryCode: "US",
searchLabel: "United States",
industries: ["technology", "manufacturing", "logistics", "healthcare", "finance", "retail_tech"],
},
UK: {
countryCode: "GB",
searchLabel: "United Kingdom",
industries: ["technology", "finance", "logistics", "professional_services", "manufacturing"],
},
AU: {
countryCode: "AU",
searchLabel: "Australia",
industries: ["technology", "mining_tech", "agri_tech", "finance", "healthcare"],
},
UAE: {
countryCode: "AE",
searchLabel: "Dubai UAE",
industries: ["technology", "logistics", "real_estate_tech", "finance", "retail"],
},
};
return configs[region] ?? configs["US"];
}