import 'dotenv/config';
import { constants, copyFileSync, existsSync, mkdirSync } from 'node:fs';
import { join } from 'node:path';
import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from '../src/generated/prisma/client';
import { getUploadRoot } from '../src/modules/upload/upload-root';
import { validateIssueMatrixSeedTarget } from './seeds/issue-matrix.seed';
import { seedGroupADraftMeetingRequest } from './seeds/group-a-draft-meeting-request.seed';

async function main() {
  const args = process.argv.slice(2);
  const databaseArgs = args.filter((arg) => arg.startsWith('--database='));
  if (
    databaseArgs.length > 1 ||
    new Set(args).size !== args.length ||
    args.some((arg) => arg !== '--apply' && !arg.startsWith('--database='))
  ) {
    throw new Error('Use --apply and optionally --database=NAME.');
  }

  const connectionString = process.env.DATABASE_URL;
  if (!connectionString) throw new Error('DATABASE_URL is missing.');
  const target = validateIssueMatrixSeedTarget(
    connectionString,
    databaseArgs[0]?.slice('--database='.length),
  );
  const apply = args.includes('--apply');
  const filename = 'group-a-draft-sample.pdf';
  if (apply) {
    const source = join(__dirname, 'seeds', 'files', filename);
    const directory = join(process.cwd(), getUploadRoot(), 'meeting-requests');
    const destination = join(directory, filename);
    mkdirSync(directory, { recursive: true });
    if (!existsSync(destination)) {
      copyFileSync(source, destination, constants.COPYFILE_EXCL);
    }
  }

  const prisma = new PrismaClient({
    adapter: new PrismaPg({ connectionString }),
  });
  try {
    const result = await seedGroupADraftMeetingRequest(
      prisma,
      `/uploads/meeting-requests/${filename}`,
      apply,
    );
    console.log(JSON.stringify({ target, ...result }, null, 2));
  } finally {
    await prisma.$disconnect();
  }
}

if (require.main === module) {
  main().catch((error: Error) => {
    console.error(error.message);
    process.exitCode = 1;
  });
}
