# -*- coding: utf-8 -*-

# Copyright (C) 2010-2014 Avencall
#
# 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 3 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, see <http://www.gnu.org/licenses/>

from typing import Any


PROV_MIME_TYPE = 'application/vnd.proformatique.provd+json'

def decode_bytes(value: Any, encoding: str = 'utf-8') -> str:
    """Take a value and if it is bytes it is a bytestring it decodes it.
    It is helpful for ensuring values are decoded in situations
    where it might be a string or bytes.
    """
    if isinstance(value, bytes):
        return value.decode(encoding)
    return value

def uri_append_path(base: bytes | str, *path: bytes | str) -> str:
    """Append path to base URI.

    >>> uri_append_path('http://localhost/', 'foo')
    'http://localhost/foo
    >>> uri_append_path('http://localhost/bar', 'foo')
    'http://localhost/bar/foo'
    >>> uri_append_path('http://localhost/bar', 'foo', 'bar')
    'http://localhost/bar/foo/bar'

    """
    if not path:
        return decode_bytes(base)
    base_decoded: str = decode_bytes(base)
    path_to_append = '/'.join(decode_bytes(p) for p in path)
    if base_decoded.endswith('/'):
        fmt = '%s%s'
    else:
        fmt = '%s/%s'
    return fmt % (base_decoded, path_to_append)

