def METHOD_NAME(
    analysis_tracker: AnalysisTracker,
    figure_base_path: Text,
    config_params: argparse.ArgumentParser
) -> Text:
  # pylint: disable-msg=too-many-locals
  """Creat report based on all the analysis performed
  Args:
      analysis_tracker: (AnalysisTracker), holder for all the analysis
      figure_base_path: (string), the folder for holding figures
      config_params: runtime configuration from CLI
  Returns:
      Markdown formatted report in text
  """
  def _check_empty_section(
      r_contents: OrderedDict,
      section_meta: SectionMeta
  ) -> bool:
    """Check whether the content of a section is empty. If a section has
    has dependency as specified in its SectionMeta, all its dependencies need
    to be checked to ensure its emptiness.
    Args:
      r_contents: generated report contents holder
      section_meta: section metadata
    Returns:
      Boolean flag
    """
    if section_meta.section_content_generator is not None:
      if section_meta.section_title is None:
        # if there is no title, nonempty content length should be larger than 1
        return len(r_contents[section_meta.section_name]) < 1
      # if there is title, nonempty content length should be larger than 2
      return len(r_contents[section_meta.section_name]) < 2
    if not section_meta.dependency:
      return len(r_contents[section_meta.section_name]) < 2
    check_list = list()
    for item in section_meta.dependency:
      # recursively check dependency
      check_list.append(_check_empty_section(r_contents, item))
    # all dependency need to be empty to claim the parent
    # section to be empty
    if all(check_list):
      return True
    return False
  # Generate contents for each section
  report_content = create_report_contents(
      analysis_tracker=analysis_tracker,
      figure_base_path=figure_base_path)
  contents = []
  # Put contents in correct order and add appropriate section title
  # The `report_structure` define the overall structure
  for section in REPORT_STRUCTURE:
    if section.skip_if_no_content:
      is_empty = _check_empty_section(report_content, section)
      logging.info(
          'Emptiness check for {}: {}'.format(section.section_name, is_empty))
      if not is_empty:
        contents.extend(report_content[section.section_name])
    else:
      contents.extend(report_content[section.section_name])
  if config_params.add_config_to_report:
    config_title = SECTION_TITLE.format(content='Configurations')
    contents.append(config_title)
    with open(config_params.job_config, 'r') as f:
      job_config_title = SUB_SECTION_TITLE.format(content='job_config.ini')
      config_content = JOB_CONFIG_TEMPLATE.format(
          config_content=''.join(f.readlines()))
    contents.extend([job_config_title, config_content])
    cli_list_template = CLI_PARAM_LIST_TEMPLATE
    config_dict = config_params.__dict__
    cli_title = SUB_SECTION_TITLE.format(content='cli params')
    param_content = '\n'.join(
        [cli_list_template.format(param=param, value=config_dict[param])
         for param in config_dict])
    cli_content = CLI_PARAM_TEMPLATE.format(param_content=param_content)
    contents.extend([cli_title, cli_content])
  return ''.join(contents)