/* eslint-disable no-await-in-loop */
import os from 'os';
import path from 'path';
import { Readable } from 'stream';
import {
buildContent, Context, extractZip, fs, Handler, PERM,
ProblemConfigFile, ProblemModel, randomstring, ValidationError, yaml, Zip,
} from 'hydrooj';
const tmpdir = path.join(os.tmpdir(), 'hydro', 'import-hoj');
fs.ensureDirSync(tmpdir);
class ImportHojHandler extends Handler {
async fromFile(domainId: string, zipfile: string) {
const zip = new Zip.ZipReader(Readable.toWeb(fs.createReadStream(zipfile)));
const tmp = path.resolve(tmpdir, randomstring(32));
await extractZip(zip, tmp, {
strip: true,
parseError: (e) => new ValidationError('zip', null, e.message),
});
let cnt = 0;
try {
const folders = await fs.readdir(tmp, { withFileTypes: true });
for (const { name: folder } of folders.filter((i) => i.isDirectory())) {
if (!fs.existsSync(path.join(tmp, `${folder}.json`))) continue;
const buf = await fs.readFile(path.join(tmp, `${folder}.json`));
const doc = JSON.parse(buf.toString());
const pdoc = doc.problem;
const content = {
description: pdoc.description,
input: pdoc.input,
output: pdoc.output,
samples: [],
hint: pdoc.hint,
source: pdoc.source,
};
if (pdoc.examples) {
const re = /([\s\S]*?)<\/input>