import { join } from "node:path";
import { AttioObject } from "../../helpers/fetchAttioSchema";
import { generateAttioClient } from "./attioClient";
import { generateAttributeFetcher } from "./attributeFetcher";
import { generateBaseFetcher } from "./baseFetcher";
import { generateCommentFetcher } from "./commentFetcher";
import { generateListEntryFetcher } from "./listEntryFetcher";
import { generateListFetcher } from "./listFetcher";
import { generateNoteFetcher } from "./noteFetcher";
import { generateObjectFetcher } from "./objectFetcher";
import { generateRecordFetcher } from "./recordFetcher";
import { generateTaskFetcher } from "./taskFetcher";
import { generateWebhookFetcher } from "./webhookFetcher";
import { generateWorkspaceMemberFetcher } from "./workspaceMemberFetcher";
import { ensureDirectoryExists } from "../../helpers/fs";
import { generateIndexFile } from "../indexFile";

const FETCHERS_DIRECTORY = "fetchers";

export function generateClient(outputDir: string, objects: AttioObject[], includeStandardTypes: boolean): void {
  const fetchersOutputDir = join(outputDir, FETCHERS_DIRECTORY);
  ensureDirectoryExists(fetchersOutputDir);

  generateBaseFetcher(fetchersOutputDir);
  generateAttioClient(outputDir, objects, includeStandardTypes);

  // The record fetcher is always included as it is used in the attioClient to fetch the given objects
  generateRecordFetcher(fetchersOutputDir);

  if (includeStandardTypes) {
    generateObjectFetcher(fetchersOutputDir);
    generateAttributeFetcher(fetchersOutputDir);
    generateListFetcher(fetchersOutputDir);
    generateListEntryFetcher(fetchersOutputDir);
    generateNoteFetcher(fetchersOutputDir);
    generateTaskFetcher(fetchersOutputDir);
    generateWebhookFetcher(fetchersOutputDir);
    generateCommentFetcher(fetchersOutputDir);
    generateWorkspaceMemberFetcher(fetchersOutputDir);
  }

  generateIndexFile(fetchersOutputDir);
}
