import { agents, subAgents } from "../../db/manage/manage-schema.js";
import { agentScopedWhere, projectScopedWhere } from "./scope-helpers.js";
import { and, count, desc, eq, inArray } from "drizzle-orm";

//#region src/data-access/manage/subAgents.ts
const getSubAgentById = (db) => async (params) => {
	return await db.query.subAgents.findFirst({ where: and(agentScopedWhere(subAgents, params.scopes), eq(subAgents.id, params.subAgentId)) });
};
const listSubAgents = (db) => async (params) => {
	return await db.query.subAgents.findMany({ where: agentScopedWhere(subAgents, params.scopes) });
};
const listSubAgentsPaginated = (db) => async (params) => {
	const page = params.pagination?.page || 1;
	const limit = Math.min(params.pagination?.limit || 10, 100);
	const offset = (page - 1) * limit;
	const whereClause = agentScopedWhere(subAgents, params.scopes);
	const [data, totalResult] = await Promise.all([db.select().from(subAgents).where(whereClause).limit(limit).offset(offset).orderBy(desc(subAgents.createdAt)), db.select({ count: count() }).from(subAgents).where(whereClause)]);
	const total = totalResult[0]?.count || 0;
	return {
		data,
		pagination: {
			page,
			limit,
			total,
			pages: Math.ceil(total / limit)
		}
	};
};
const createSubAgent = (db) => async (params) => {
	return (await db.insert(subAgents).values(params).returning())[0];
};
const updateSubAgent = (db) => async (params) => {
	const data = params.data;
	if (data.models !== void 0) {
		if (!data.models || !data.models.base?.model && !data.models.structuredOutput?.model && !data.models.summarizer?.model && !data.models.base?.providerOptions && !data.models.structuredOutput?.providerOptions && !data.models.summarizer?.providerOptions) data.models = null;
	}
	const updateData = {
		...data,
		updatedAt: (/* @__PURE__ */ new Date()).toISOString()
	};
	return (await db.update(subAgents).set(updateData).where(and(agentScopedWhere(subAgents, params.scopes), inArray(subAgents.id, [params.subAgentId]))).returning())[0] ?? null;
};
/**
* Upsert agent (create if it doesn't exist, update if it does)
*/
const upsertSubAgent = (db) => async (params) => {
	const scopes = {
		tenantId: params.data.tenantId,
		projectId: params.data.projectId,
		agentId: params.data.agentId
	};
	if (await getSubAgentById(db)({
		scopes,
		subAgentId: params.data.id
	})) {
		const updated = await updateSubAgent(db)({
			scopes,
			subAgentId: params.data.id,
			data: {
				name: params.data.name,
				description: params.data.description,
				prompt: params.data.prompt,
				conversationHistoryConfig: params.data.conversationHistoryConfig,
				models: params.data.models,
				stopWhen: params.data.stopWhen,
				outputContract: params.data.outputContract
			}
		});
		if (!updated) throw new Error("Failed to update agent - no rows affected");
		return updated;
	}
	return await createSubAgent(db)(params.data);
};
var SubAgentIsDefaultError = class extends Error {
	constructor(subAgentId, agentId) {
		super(`Cannot delete sub-agent "${subAgentId}" because it is set as the default sub-agent for agent "${agentId}". Please change the default sub-agent before deleting.`);
		this.subAgentId = subAgentId;
		this.agentId = agentId;
		this.name = "SubAgentIsDefaultError";
	}
};
const deleteSubAgent = (db) => async (params) => {
	if ((await db.select().from(agents).where(and(projectScopedWhere(agents, params.scopes), eq(agents.id, params.scopes.agentId), eq(agents.defaultSubAgentId, params.subAgentId))).limit(1)).length > 0) throw new SubAgentIsDefaultError(params.subAgentId, params.scopes.agentId);
	await db.delete(subAgents).where(and(agentScopedWhere(subAgents, params.scopes), inArray(subAgents.id, [params.subAgentId])));
	return await getSubAgentById(db)({
		scopes: params.scopes,
		subAgentId: params.subAgentId
	}) === void 0;
};
const getSubAgentsByIds = (db) => async (params) => {
	if (params.subAgentIds.length === 0) return [];
	return await db.select().from(subAgents).where(and(agentScopedWhere(subAgents, params.scopes), inArray(subAgents.id, params.subAgentIds)));
};

//#endregion
export { SubAgentIsDefaultError, createSubAgent, deleteSubAgent, getSubAgentById, getSubAgentsByIds, listSubAgents, listSubAgentsPaginated, updateSubAgent, upsertSubAgent };