/**
   * Transforms {@link MergeTaskCliArguments} to {@link MergeParameters}
   *
   * @param taskCliArguments
   * @return populated task parameters
   */
  public MergeParameters toTaskParameters(MergeTaskCliArguments taskCliArguments) {
    MergeParameters parameters =
        new MergeParameters(taskCliArguments.isCopyFields(), taskCliArguments.isAddBlanks());
    parameters.setOutlinePolicy(taskCliArguments.getBookmarks().getEnumValue());
    populateAbstractParameters(parameters, taskCliArguments);
    populateOutputTaskParameters(parameters, taskCliArguments);

    MultiplePdfMergeInputAdapter mergeInputsAdapter = extractPdfMergeInputs(taskCliArguments);

    for (PdfMergeInput eachMergeInput : mergeInputsAdapter.getPdfMergeInputs()) {
      parameters.addInput(eachMergeInput);
    }

    return parameters;
  }
  private MultiplePdfMergeInputAdapter extractPdfMergeInputs(
      MergeTaskCliArguments taskCliArguments) {
    // input files can be specified in 3 ways: explicitly, via a folder or via a config file
    List<PdfFileSource> inputFiles = null;
    if (taskCliArguments.isDirectory()) {
      if (taskCliArguments.isMatchingRegEx()) {
        inputFiles =
            taskCliArguments
                .getDirectory()
                .filter(taskCliArguments.getMatchingRegEx())
                .getFileSourceList();
      } else {
        inputFiles = taskCliArguments.getDirectory().getFileSourceList();
      }

    } else if (taskCliArguments.isFiles()) {
      inputFiles = extractFiles(taskCliArguments.getFiles());
    } else if (taskCliArguments.isFilesListConfig()) {
      inputFiles = taskCliArguments.getFilesListConfig().getFileSourceList();
    }

    if (!BooleanUtils.xor(
        new boolean[] {
          taskCliArguments.isDirectory(),
          taskCliArguments.isFiles(),
          taskCliArguments.isFilesListConfig()
        })) {
      throw new SejdaRuntimeException(
          "Too many options given for input. Please use only one of the following options: --directory --filesListConfig --file");
    }

    if (inputFiles == null) {
      throw new SejdaRuntimeException("No input files specified");
    }

    MultiplePdfMergeInputAdapter mergeInputsAdapter =
        new MultiplePdfMergeInputAdapter(inputFiles, taskCliArguments.getPageSelection().ranges());
    return mergeInputsAdapter;
  }