import { desc, eq, inArray } from "drizzle-orm";
import { getDb } from "../../db";
import {
  applicationActivities,
  applicationDocuments,
  applications,
} from "../../db/schema";
import { requireChatGPTUser } from "../chatgpt-auth";
import { SiteFrame } from "../components/SiteFrame";
import { CandidatePortal } from "./CandidatePortal";

export const dynamic = "force-dynamic";

export type CandidateApplication = typeof applications.$inferSelect & {
  documents: (typeof applicationDocuments.$inferSelect)[];
  activities: (typeof applicationActivities.$inferSelect)[];
};

async function CandidateWorkspace() {
  const user = await requireChatGPTUser("/candidate");
  let records: CandidateApplication[] = [];
  let databaseReady = true;
  try {
    const db = getDb();
    const applicationsRows = await db
      .select()
      .from(applications)
      .where(eq(applications.email, user.email.toLowerCase()))
      .orderBy(desc(applications.createdAt), desc(applications.id));
    const ids = applicationsRows.map((item) => item.id);
    const [documents, activities] = ids.length
      ? await Promise.all([
          db
            .select()
            .from(applicationDocuments)
            .where(inArray(applicationDocuments.applicationId, ids)),
          db
            .select()
            .from(applicationActivities)
            .where(inArray(applicationActivities.applicationId, ids))
            .orderBy(desc(applicationActivities.createdAt)),
        ])
      : [[], []];
    records = applicationsRows.map((application) => ({
      ...application,
      documents: documents.filter((item) => item.applicationId === application.id),
      activities: activities.filter((item) => item.applicationId === application.id),
    }));
  } catch {
    databaseReady = false;
  }

  return (
    <SiteFrame>
      <CandidatePortal
        applications={records}
        userName={user.fullName || user.email.split("@")[0]}
        userEmail={user.email}
        databaseReady={databaseReady}
      />
    </SiteFrame>
  );
}

export default function CandidatePage() {
  return <CandidateWorkspace />;
}
