#!/usr/bin/env python3
#
# Copyright (C) 2017 Carlos Garcia Campos <carlosgc@gnome.org>
# Copyright (C) 2019 Albert Astals Cid <aacid@kde.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

import argparse
import logging
import os
from gtkdoc import PkgConfigGTKDoc

def configure_logging(verbose):
    level = logging.DEBUG if verbose else logging.INFO
    logger = logging.getLogger('gtkdoc')
    logger.setLevel(level)
    handler = logging.StreamHandler()
    handler.setLevel(level)
    logger.addHandler(handler)
    if level == logging.DEBUG:
        handler.setFormatter(logging.Formatter('[%(asctime)s]  %(message)s'))
    else:
        handler.setFormatter(logging.Formatter('%(message)s'))


parser = argparse.ArgumentParser(description='Make poppler GLib API documentation.')
parser.add_argument('-v', '--verbose', action='store_true', default = False,
                    help='Whether or not to run in verbose mode.')
parser.add_argument('--skip-html', action='store_true',
                    help='Whether or not to skip HTML generation, which can be slow.')
parser.add_argument('-s', '--src-dir', action='store', default='.', dest='src_dir',
                    help='The source directory')
parser.add_argument('-b', '--build-dir', action='store', default='build', dest='build_dir',
                    help='The build directory')
args = parser.parse_args()
configure_logging(args.verbose)

pkgconfig_file = os.path.join(args.build_dir, 'poppler-glib.pc')
pkgconfig_path = os.environ.get("PKG_CONFIG_PATH")
os.environ['PKG_CONFIG_PATH'] = args.build_dir
if pkgconfig_path:
    os.environ['PKG_CONFIG_PATH'] += ':' + pkgconfig_path

gtkdoc = PkgConfigGTKDoc(pkgconfig_file, {
    'library_path': os.path.join(args.build_dir, 'glib'),
    'module_name': 'poppler',
    'doc_dir': os.path.join(args.src_dir, 'glib', 'reference'),
    'output_dir': os.path.join(args.build_dir, 'glib', 'reference'),
    'main_sgml_file': 'poppler-docs.sgml',
    'source_dirs': [os.path.join(args.src_dir, 'glib'), os.path.join(args.build_dir, 'glib')],
    'cflags': '-I%s' % os.path.join(args.src_dir, 'glib'),
    'ignored_files': ['poppler-private.h', 'poppler-input-stream.h', 'poppler-cached-file-loader.h', 'demo']
})

gtkdoc.generate(not args.skip_html)
