# Lazygal, a lazy static web gallery generator.
# Copyright (C) 2007-2023 Alexandre Rossi <alexandre.rossi@gmail.com>
#
# 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.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.


import gettext
import locale
import logging
import os
import sys
from optparse import OptionParser


# i18n
from . import INSTALL_MODE, INSTALL_PREFIX
if INSTALL_MODE == 'source':
    LOCALES_PATH = os.path.normpath(os.path.join(os.path.dirname(__file__),
                                                 '..', 'build', 'mo'))
elif INSTALL_MODE == 'installed':
    LOCALES_PATH = os.path.join(INSTALL_PREFIX, 'share', 'locale')
gettext.install('lazygal', LOCALES_PATH)

locale.setlocale(locale.LC_ALL, '')


from . import __version__
from . import config
from . import generators
from . import config
from . import eyecandy
from . import log


def main():
    usage = _("usage: %prog [options] albumdir")
    parser = OptionParser(usage=usage)

    # The help option must be changed to comply with i18n.
    parser.get_option('-h').help = _("Show this help message and exit.")

    parser.add_option("", "--quiet",
                    action="store_true",
                    dest="quiet",
                    help=_("Don't output anything except for errors."))
    parser.add_option("", "--debug",
                    action="store_true",
                    dest="debug",
                    help=_("Output everything that lazygal is doing."))
    parser.add_option("-o", "--output-directory",
                    action="store", type="string",
                    dest="dest_dir",
                    help=_("Directory where web pages, slides and thumbs will be written (default is current directory)."))
    parser.add_option("-t", "--theme",
                    action="store", type="string",
                    dest="theme",
                    help=_("Theme name (looked up in theme directory) or theme full path."))
    parser.add_option("", "--default-style",
                    action="store", type="string",
                    dest="default_style",
                    help=_("Default style to apply to the theme."))
    parser.add_option("", "--template-vars",
                    action="store", type="string",
                    dest="tpl_vars",
                    help=_("Common variables to load all templates with."))
    parser.add_option("-f", "--force-gen-pages",
                    action="store_true",
                    dest="force_gen_pages",
                    help=_("Force rebuild of all pages."))
    parser.add_option("", "--clean-destination",
                    action="store_true",
                    dest="clean_destination",
                    help=_("Clean destination directory of files that should not be there."))
    parser.add_option("", "--preserve", type="string",
                    action="append", metavar=_('PATTERN'),
                    dest="preserve", help=_("Specifies pathname(s) which will be ignored during final cleanup"))
    parser.add_option("-v", "--version",
                    action="store_true",
                    dest="show_version",
                    help=_("Display program version."))
    parser.add_option("", "--check-all-dirs",
                    action="store_true",
                    dest="check_all_dirs",
                    help=_("Exhaustively go through all directories regardless of source modification time."))
    parser.add_option("", "--dir-flattening-depth",
                    action="store", type="int",
                    dest="dir_flattening_depth",
                    help=_("Level below which the directory tree is flattened. Default is 'No' which disables this feature."))
    parser.add_option("-s", "--image-size",
                    action="store", type="string",
                    dest="image_size",
                    help=_("Size of images, define as <name>=SIZE,..., eg. small=800x600,medium=1024x768. The special value 0x0 uses original size. See manual page for SIZE syntax."))
    parser.add_option("-T", "--thumbnail-size",
                    action="store", type="string",
                    dest="thumbnail_size",
                    help=_("Size of thumbnails, define as SIZE, eg. 150x113. See manual page for SIZE syntax."))
    parser.add_option("-q", "--quality",
                    action="store", type="int",
                    dest="quality",
                    help=_("Quality of generated JPEG images (default is 85)."))
    parser.add_option("-O", "--original",
                    action="store_true",
                    dest="original",
                    help=_("Include original photos in output."))
    parser.add_option("", "--orig-base",
                    action="store", type="string",
                    dest="orig_base",
                    help=_("Do not copy original photos in output directory, instead link them using submitted relative path as base."))
    parser.add_option("", "--orig-symlink",
                    action="store_true",
                    dest="orig_symlink",
                    help=_("Do not copy original photos in output directory, instead create symlinks to their original locations."))
    parser.add_option("", "--puburl",
                    action="store", type="string",
                    dest="puburl",
                    help=_("Publication URL (only useful for feed generation)."))
    parser.add_option("-m", "--generate-metadata",
                    action="store_true",
                    dest="metadata",
                    help=_("Generate metadata description files where they don't exist instead of generating the web gallery."))
    parser.add_option("-n", "--thumbs-per-page",
                    action="store", type="int",
                    dest="thumbs_per_page",
                    help=_("Maximum number of thumbs per index page. This enables index pagination (0 is unlimited)."))
    parser.add_option("-z", "--make-dir-zip",
                    action="store_true",
                    dest="dirzip",
                    help=_("Make a zip archive of original pictures for each directory."))
    parser.add_option("", "--webalbum-pic-bg",
                    action="store", type="string",
                    dest="webalbumpic_bg",
                    help=_("Webalbum picture background color. Default is transparent, and implies the PNG format. Any other value, e.g. red, white, blue, uses JPEG."))
    parser.add_option("", "--webalbum-pic-type",
                    action="store", type="choice",
                    choices=list(eyecandy.WEBALBUMPIC_TYPES.keys()),
                    dest="webalbumpic_type",
                    help=_("Webalbum picture type. Default is messy."))
    parser.add_option("", "--pic-sort-by",
                    action="store", metavar=_('ORDER'),
                    dest="pic_sort_by", help=_("Sort order for images in a folder: filename, numeric, mtime, or exif. Add ':reverse' to reverse the chosen order."))
    parser.add_option("", "--subgal-sort-by",
                    action="store", metavar=_('ORDER'),
                    dest="subgal_sort_by", help=_("Sort order for sub galleries in a folder: dirname, numeric, exif or mtime. Add ':reverse' to reverse the chosen order."))
    parser.add_option("", "--filter-by-tag", type="string",
                    action="append", metavar=_('TAG'),
                    dest="filter_by_tag", help=_("Only include in the gallery pics whose IPTC keywords match the supplied filter(s)."))
    parser.add_option("", "--exclude", type="string",
                    action="append", metavar=_('PATTERN'),
                    dest="exclude", help=_("Regular expression pattern(s) describing directories or filenames to exclude from consideration."))
    parser.add_option("", "--keep-gps-data",
                    action="store_true",
                    dest="keep_gps",
                    help=_("Do not remove GPS location tags from EXIF metadata. Mostly useful with holiday photos."))
    parser.add_option("", "--no-video",
                    action="store_true",
                    dest="novideo",
                    help=_("Do not process videos nor include them in indexes."))
    (options, args) = parser.parse_args()

    if options.show_version:
        print(_('lazygal version %s') % __version__)
        sys.exit(0)

    if len(args) != 1:
        parser.print_help()
        sys.exit(_("Bad command line: wrong number of arguments."))

    source_dir = args[0]
    if not os.path.isdir(source_dir):
        print(_("Directory %s does not exist.") % source_dir)
        sys.exit(1)


    cmdline_config = config.LazygalConfig()
    for section in cmdline_config.valid_sections:
        cmdline_config.add_section(section)


    if options.quiet: cmdline_config.set('runtime', 'quiet', True)
    if options.debug: cmdline_config.set('runtime', 'debug', True)
    if options.check_all_dirs:
        cmdline_config.set('runtime', 'check-all-dirs', True)

    if options.dest_dir is not None:
        cmdline_config.set('global', 'output-directory', options.dest_dir)
    if options.force_gen_pages:
        cmdline_config.set('global', 'force-gen-pages', True)
    if options.clean_destination:
        cmdline_config.set('global', 'clean-destination', True)
    if options.preserve is not None:
        cmdline_config.set('global', 'preserve_args', options.preserve)
    if options.dir_flattening_depth is not None:
        cmdline_config.set('global', 'dir-flattening-depth',
                        options.dir_flattening_depth)
    if options.puburl is not None:
        cmdline_config.set('global', 'puburl', options.puburl)
    if options.theme is not None:
        cmdline_config.set('global', 'theme', options.theme)
    if options.exclude is not None:
        cmdline_config.set('global', 'exclude_args', options.exclude)

    if options.default_style is not None:
        cmdline_config.set('webgal', 'default-style', options.default_style)
    if options.webalbumpic_bg is not None:
        cmdline_config.set('webgal', 'webalbumpic-bg', options.webalbumpic_bg)
    if options.webalbumpic_type is not None:
        cmdline_config.set('webgal', 'webalbumpic-type', options.webalbumpic_type)
    if options.image_size is not None:
        cmdline_config.set('webgal', 'image-size', options.image_size)
    if options.thumbnail_size is not None:
        cmdline_config.set('webgal', 'thumbnail-size', options.thumbnail_size)
    if options.thumbs_per_page is not None:
        cmdline_config.set('webgal', 'thumbs-per-page', options.thumbs_per_page)
    if options.pic_sort_by is not None:
        cmdline_config.set('webgal', 'sort-medias', options.pic_sort_by)
    if options.subgal_sort_by is not None:
        cmdline_config.set('webgal', 'sort-subgals', options.subgal_sort_by)
    if options.filter_by_tag is not None:
        cmdline_config.set('webgal', 'filter-by-tag', options.filter_by_tag)
    if options.original:
        cmdline_config.set('webgal', 'original', 'Yes')
    if options.orig_base is not None:
        cmdline_config.set('webgal', 'original-baseurl', options.orig_base)
    if options.orig_symlink:
        try:
            os.symlink
        except AttributeError:
            print(_("Option --orig-symlink is not available on this platform."))
            sys.exit(1)
        else:
            cmdline_config.set('webgal', 'original-symlink', True)
    if options.dirzip:
        cmdline_config.set('webgal', 'dirzip', True)
    if options.quality is not None:
        cmdline_config.set('webgal', 'jpeg-quality', options.quality)
    if options.keep_gps:
        cmdline_config.set('webgal', 'keep-gps', True)
    if options.novideo:
        cmdline_config.set('webgal', 'novideo', True)

    if options.tpl_vars is not None:
        cmdline_config.add_section('template-vars')
        tpl_vars_defs = options.tpl_vars.split(',')
        for single_def in tpl_vars_defs:
            name, value = single_def.split('=')
            cmdline_config.set('template-vars', name, value)

    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    if sys.stdout.isatty():
        logging_handler = log.ProgressConsoleHandler
    else:
        logging_handler = logging.StreamHandler
    output_log = logging_handler(sys.stdout)
    output_log.setFormatter(logging.Formatter('%(message)s'))
    logger.addHandler(output_log)

    try:
        album = generators.Album(source_dir, cmdline_config)
    except ValueError as e:
        print(e)
        sys.exit(1)
    else:
        if sys.stdout.isatty():
            progress = generators.AlbumGenProgress(\
                len(album.stats()['bydir'].keys()), album.stats()['total'])

            def update_progress():
                output_log.update_progress(str(progress))
            progress.updated = update_progress
            progress.updated()
        else:
            progress = None


    if options.metadata:
        album.generate_default_metadata()
    else:
        try:
            album.generate(progress=progress)
        except KeyboardInterrupt:
            print(_("Interrupted."), file=sys.stderr)
            sys.exit(1)


# vim: ts=4 sw=4 expandtab
