import { json } from "@remix-run/server-runtime";
import { z } from "zod";
import { prisma } from "~/db.server";
import { PromptPresenter } from "~/presenters/v3/PromptPresenter.server";
import { clickhouseFactory } from "~/services/clickhouse/clickhouseFactoryInstance.server";
import { createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";

const ParamsSchema = z.object({
  slug: z.string(),
});

export const loader = createLoaderApiRoute(
  {
    params: ParamsSchema,
    allowJWT: true,
    corsStrategy: "all",
    findResource: async (params, authentication) => {
      return prisma.prompt.findUnique({
        where: {
          projectId_runtimeEnvironmentId_slug: {
            projectId: authentication.environment.projectId,
            runtimeEnvironmentId: authentication.environment.id,
            slug: params.slug,
          },
        },
        include: {
          project: {
            select: {
              organizationId: true,
            },
          },
        },
      });
    },
    authorization: {
      action: "read",
      resource: (_resource, params) => ({ type: "prompts", id: params.slug }),
    },
  },
  async ({ resource: prompt }) => {
    if (!prompt) {
      return json({ error: "Prompt not found" }, { status: 404 });
    }

    const clickhouse = await clickhouseFactory.getClickhouseForOrganization(
      prompt.project.organizationId,
      "standard"
    );
    const presenter = new PromptPresenter(clickhouse);
    const versions = await presenter.listVersions(prompt.id);

    return json({
      data: versions.map((v) => ({
        id: v.id,
        version: v.version,
        labels: v.labels,
        source: v.source,
        model: v.model,
        textContent: v.textContent,
        commitMessage: v.commitMessage,
        contentHash: v.contentHash,
        createdAt: v.createdAt.toISOString(),
      })),
    });
  }
);
