#!/usr/bin/env python
#
# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Like subset.py, but with command-line options."""

import argparse
from os import path

from fontTools import subset

from nototools import font_data
from nototools import swat_license
from nototools import tool_utils


def _get_default_options():
    opt = subset.Options()
    opt.name_IDs = ["*"]
    opt.name_legacy = True
    opt.name_languages = ["*"]
    opt.layout_features = ["*"]
    opt.notdef_outline = True
    opt.recalc_bounds = True
    opt.recalc_timestamp = True
    opt.canonical_order = True
    return opt


_DEFAULT_OPTIONS = _get_default_options()

_VERSION_ID = 5  # name table version string ID


def subset_font_cmap(srcname, dstname, exclude=None, include=None, bump_version=True):

    opt = _DEFAULT_OPTIONS

    font = subset.load_font(srcname, opt)
    target_charset = set(font_data.get_cmap(font).keys())

    if include is not None:
        target_charset &= include
    if exclude is not None:
        target_charset -= exclude

    subsetter = subset.Subsetter(options=opt)
    subsetter.populate(unicodes=target_charset)
    subsetter.subset(font)

    if bump_version:
        # assume version string has 'uh' if unhinted, else hinted.
        revision, version_string = swat_license.get_bumped_version(font)
        font["head"].fontRevision = revision
        font_data.set_name_record(font, _VERSION_ID, version_string)

    subset.save_font(font, dstname, opt)


def subset_fonts_cmap(fonts, dstdir, exclude=None, include=None, bump_version=True):
    dstdir = tool_utils.ensure_dir_exists(dstdir)
    for srcname in fonts:
        dstname = path.join(dstdir, path.basename(srcname))
        subset_font_cmap(srcname, dstname, exclude, include, bump_version)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-i",
        "--include",
        help="ranges of characters to include",
        metavar="range",
        nargs="+",
    )
    parser.add_argument(
        "-e",
        "--exclude",
        help="ranges of characters to exclude " "(applied after include)",
        metavar="range",
        nargs="+",
    )
    parser.add_argument(
        "-d", "--dstdir", help="directory to write new files to", metavar="dir"
    )
    parser.add_argument(
        "-b",
        "--bump_version",
        help="bump version (default true)",
        metavar="bool",
        type=bool,
        default=True,
    )
    parser.add_argument("fonts", help="fonts to subset", metavar="font", nargs="+")
    args = parser.parse_args()

    if args.exclude:
        args.exclude = tool_utils.parse_int_ranges(" ".join(args.exclude))
    if args.include:
        args.include = tool_utils.parse_int_ranges(" ".join(args.include))
    subset_fonts_cmap(
        args.fonts,
        args.dstdir,
        exclude=args.exclude,
        include=args.include,
        bump_version=args.bump_version,
    )


if __name__ == "__main__":
    main()
