# Copyright 2020 Google LLC
#
# 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.

# Generate config files for Noto-COLRv1

from nanoemoji.util import rel
from pathlib import Path


_NOTO_FAMILY_NAME = "Noto Color Emoji"
_NOTO_SVG_DIR = Path("svg")
_REGIONAL_INDICATORS = {
    Path(_NOTO_SVG_DIR / f"emoji_u{i:x}.svg") for i in range(0x1F1E6, 0x1F1FF + 1)
}
_NOTO_WAVED_FLAG_SVG_DIR = Path("third_party/region-flags/waved-svg")
_NOTO_SUBDIVISION_FLAGS = (
    _NOTO_WAVED_FLAG_SVG_DIR / "emoji_u1f3f4_e0067_e0062_e0065_e006e_e0067_e007f.svg",
    _NOTO_WAVED_FLAG_SVG_DIR / "emoji_u1f3f4_e0067_e0062_e0073_e0063_e0074_e007f.svg",
    _NOTO_WAVED_FLAG_SVG_DIR / "emoji_u1f3f4_e0067_e0062_e0077_e006c_e0073_e007f.svg",
)
_CONFIG_DIR = Path("colrv1")


def _write_config(config_name, output_file, svg_files):
    svg_files = [rel(_CONFIG_DIR, Path(f)) for f in svg_files]
    config_file = f"{config_name}.toml"
    for svg_file in svg_files:
        assert _CONFIG_DIR.joinpath(
            svg_file
        ).is_file(), f"{svg_file} not found relative to {_CONFIG_DIR}"
    svg_list = ",\n    ".join(f'"{f}"' for f in sorted(svg_files)).rstrip()
    with open(_CONFIG_DIR / config_file, "w") as f:
        f.write(
            f"""
family = "{_NOTO_FAMILY_NAME}"
output_file = "{output_file}"
color_format = "glyf_colr_1"
clipbox_quantization = 32

[axis.wght]
name = "Weight"
default = 400

[master.regular]
style_name = "Regular"
srcs = [
    {svg_list},
]

[master.regular.position]
wght = 400
"""
        )


def _write_all_noto_configs():
    # includes all of noto-emoji svgs plus all the waved region flags
    svgs = tuple(_NOTO_SVG_DIR.glob("*.svg")) + tuple(
        _NOTO_WAVED_FLAG_SVG_DIR.glob("*.svg")
    )
    _write_config("all", "NotoColorEmoji.ttf", svgs)


def _write_noto_noflag_configs():
    # Does not contain regional indicators and the region flags that are
    # composed with them. It still includes the England, Scotland and Wales
    # 'subdivision' flags, as those are not composed with Unicode regional
    # indicators, but use sequences of Unicode Tag letters prefixed with
    # the Black Flag and ending with a Cancel Tag.
    svgs = (
        tuple(p for p in _NOTO_SVG_DIR.glob("*.svg") if p not in _REGIONAL_INDICATORS)
        + _NOTO_SUBDIVISION_FLAGS
    )
    _write_config("noflags", "NotoColorEmoji-noflags.ttf", svgs)


def main():
    _write_all_noto_configs()
    _write_noto_noflag_configs()


if __name__ == "__main__":
    main()
