import { EntraClientSecretTokenProvider, SalesforceJwtTokenProvider } from "./auth.js";
import { loadConfig } from "./config.js";
import { FailureStore } from "./failure-store.js";
import { GraphClient } from "./graph.js";
import { SalesforceClient } from "./salesforce.js";
import { ArchiveWorker } from "./worker.js";
import "dotenv/config";

const config = await loadConfig();
const salesforceTokens = new SalesforceJwtTokenProvider(
  config.salesforceLoginUrl,
  config.salesforceClientId,
  config.salesforceUsername,
  config.salesforcePrivateKey,
);
const graphTokens = new EntraClientSecretTokenProvider(
  config.azureTenantId,
  config.azureClientId,
  config.azureClientSecret,
);
const salesforce = new SalesforceClient(
  salesforceTokens,
  config.tempDir,
  {
    apiVersion: config.salesforceApiVersion,
    allowedObjects: config.allowedObjects,
    contentVersionRetentionMonths: config.contentVersionRetentionMonths,
    attachmentRetentionMonths: config.attachmentRetentionMonths,
  },
);
const worker = new ArchiveWorker(
  salesforce,
  new GraphClient(graphTokens, config.graphSiteId),
  new FailureStore(config.failureStateFile),
  {
    workerId: config.workerId,
    concurrency: config.concurrency,
    scanIntervalMs: config.scanIntervalMs,
    deleteAfterArchive: config.deleteAfterArchive,
  },
);

process.on("SIGTERM", () => worker.stop());
process.on("SIGINT", () => worker.stop());

await worker.run();
