#!/usr/bin/env python3
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Generates API docs for Flutter embedders and libraries.
import os
import shutil
import tempfile
import zipfile
import sys
import subprocess
from collections import namedtuple

Section = namedtuple('Section', ['title', 'inputs'])

SECTIONS = {
    'ios':
        Section(
            'iOS Embedder', [
                'shell/platform/darwin/ios',
                'shell/platform/darwin/common',
                'shell/platform/common',
            ]
        ),
    'macos':
        Section(
            'macOS Embedder', [
                'shell/platform/darwin/macos',
                'shell/platform/darwin/common',
                'shell/platform/common',
            ]
        ),
    'linux':
        Section(
            'Linux Embedder', [
                'shell/platform/linux',
                'shell/platform/common',
            ]
        ),
    'windows':
        Section(
            'Windows Embedder', [
                'shell/platform/windows',
                'shell/platform/common',
            ]
        ),
    'impeller':
        Section('Impeller', [
            'impeller',
        ]),
}


def generate_doxyfile(section, output_dir, log_file, doxy_file):
  doxyfile = open('docs/Doxyfile.template', 'r').read()
  doxyfile = doxyfile.replace('@@OUTPUT_DIRECTORY@@', output_dir)
  doxyfile = doxyfile.replace('@@LOG_FILE@@', log_file)
  doxyfile = doxyfile.replace(
      '@@INPUT_DIRECTORIES@@', '"{}"'.format('" "'.join(section.inputs))
  )
  doxyfile = doxyfile.replace(
      '@@PROJECT_NAME@@', 'Flutter {}'.format(section.title)
  )
  doxyfile = doxyfile.replace(
      '@@DOCSET_FEEDNAME@@', 'Flutter {} Documentation'.format(section.title)
  )
  with open(doxy_file, 'w') as f:
    f.write(doxyfile)


def process_section(name, section, destination):
  output_dir = tempfile.mkdtemp(prefix="doxygen")
  log_file = os.path.join(destination, '{}-doxygen.log'.format(name))
  zip_file = os.path.join(destination, '{}-docs.zip'.format(name))
  doxy_file = os.path.join(output_dir, 'Doxyfile')
  generate_doxyfile(section, output_dir, log_file, doxy_file)
  # Update the Doxyfile format to the latest format.
  subprocess.call(['doxygen', '-u'], cwd=output_dir)
  subprocess.call(['doxygen', doxy_file])
  html_dir = os.path.join(output_dir, 'html')
  with zipfile.ZipFile(zip_file, 'w') as zip:
    for root, _, files in os.walk(html_dir):
      for file in files:
        filename = os.path.join(root, file)
        zip.write(filename, os.path.relpath(filename, html_dir))
  print('Wrote ZIP file for {} to {}'.format(section, zip_file))
  print('Preserving log file in {}'.format(log_file))
  shutil.rmtree(output_dir, ignore_errors=True)


def generate_docs(argv):
  if len(argv) != 2:
    print(
        'Error: Argument specifying output directory required. '
        'Directory may be an absolute path, or a relative path from the "src" directory.'
    )
    exit(1)

  destination = argv[1]
  script_path = os.path.realpath(__file__)
  src_path = os.path.dirname(os.path.dirname(os.path.dirname(script_path)))
  # Run commands from the Flutter root dir.
  os.chdir(os.path.join(src_path, 'flutter'))
  # If the argument isn't an absolute path, assume that it is relative to the src dir.
  if not os.path.isabs(destination):
    destination = os.path.join(src_path, destination)
  os.makedirs(destination, exist_ok=True)
  for name, section in SECTIONS.items():
    process_section(name, section, destination)


if __name__ == '__main__':
  generate_docs(sys.argv)
