#!/usr/bin/env python
#
# Copyright (C) 2017 Carlos Garcia Campos <carlosgc@gnome.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')],
    '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)
