import {IGeneratorOutput, IGenerateOptions, IEnvironment} from './index';

export function perPageManifestsSaver(generateOptions: IGenerateOptions,
                                      environment: IEnvironment,
                                      result: IGeneratorOutput): Promise<void> {
  return Promise.all(result.atlases.map((_, atlasIndex) => {
    return Promise.all(result.atlases[atlasIndex].sheets.map((__, pageIndex) => {
      return PageManifestSaver(atlasIndex, pageIndex, generateOptions, environment, result);
    }));
  })) as Promise<void[][]> as any;
}

export function PageManifestSaver(atlasIndex: number,
                                  sheetIndex: number,
                                  generateOptions: IGenerateOptions,
                                  environment: IEnvironment,
                                  result: IGeneratorOutput): Promise<void> {

  const sheet = result.atlases[atlasIndex].sheets[sheetIndex];

  if (generateOptions.atlasPageMetaPathResolver) {
    const outputFilePath = generateOptions.atlasPageMetaPathResolver(atlasIndex, sheetIndex, result);

    const manifestRaw = generateOptions.pageManifestBuilder ?
      generateOptions.pageManifestBuilder(atlasIndex, sheetIndex, result) :
      sheet;

    const raw = JSON.stringify(manifestRaw, null, 4);
    return environment.writeFile(outputFilePath, raw);
  }
  return Promise.resolve();
}
