# Copyright 2020 The Pigweed Authors
#
# 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
#
#     https://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.
"""Facilities for accessing the current Pigweed branding"""

from typing import Optional
from pathlib import Path

import pw_cli.env
import pw_cli.color

_memoized_banner: Optional[str] = None

# This is the default banner for Pigweed.
_PIGWEED_BANNER = '''
 ▒█████▄   █▓  ▄███▒  ▒█    ▒█ ░▓████▒ ░▓████▒ ▒▓████▄
  ▒█░  █░ ░█▒ ██▒ ▀█▒ ▒█░ █ ▒█  ▒█   ▀  ▒█   ▀  ▒█  ▀█▌
  ▒█▄▄▄█░ ░█▒ █▓░ ▄▄░ ▒█░ █ ▒█  ▒███    ▒███    ░█   █▌
  ▒█▀     ░█░ ▓█   █▓ ░█░ █ ▒█  ▒█   ▄  ▒█   ▄  ░█  ▄█▌
  ▒█      ░█░ ░▓███▀   ▒█▓▀▓█░ ░▓████▒ ░▓████▒ ▒▓████▀
'''


def banner():
    global _memoized_banner  # pylint: disable=global-statement
    if _memoized_banner is not None:
        return _memoized_banner

    parsed_env = pw_cli.env.pigweed_environment()

    # Take the banner from the file PW_BRANDING_BANNER; or use the default.
    banner_filename = parsed_env.PW_BRANDING_BANNER
    _memoized_banner = (Path(banner_filename).read_text()
                        if banner_filename else _PIGWEED_BANNER)

    # Color the banner if requested.
    banner_color = parsed_env.PW_BRANDING_BANNER_COLOR
    if banner_color != '':
        _memoized_banner = getattr(
            pw_cli.color.colors(),
            banner_color,
            str,
        )(_memoized_banner)

    return _memoized_banner
