# Copyright (C) 2016-2023 RhodeCode GmbH
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License, version 3
# (only), as published by the Free Software Foundation.
#
# 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 Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# This program is dual-licensed. If you wish to learn more about the
# RhodeCode Enterprise Edition, including its added features, Support services,
# and proprietary license terms, please see https://rhodecode.com/licenses/


ANY = []
TEXT_EXT = ['txt', 'md', 'rst', 'log']
DOCUMENTS_EXT = ['pdf', 'rtf', 'odf', 'ods', 'gnumeric', 'abw', 'doc', 'docx', 'xls', 'xlsx']
IMAGES_EXT = ['jpg', 'jpe', 'jpeg', 'png', 'gif', 'svg', 'bmp', 'tiff']
AUDIO_EXT = ['wav', 'mp3', 'aac', 'ogg', 'oga', 'flac']
VIDEO_EXT = ['mpeg', '3gp', 'avi', 'divx', 'dvr', 'flv', 'mp4', 'wmv']
DATA_EXT = ['csv', 'ini', 'json', 'plist', 'xml', 'yaml', 'yml']
SCRIPTS_EXT = ['js', 'php', 'pl', 'py', 'rb', 'sh', 'go', 'c', 'h']
ARCHIVES_EXT = ['gz', 'bz2', 'zip', 'tar', 'tgz', 'txz', '7z']
EXECUTABLES_EXT = ['so', 'exe', 'dll']


DEFAULT = DOCUMENTS_EXT + TEXT_EXT + IMAGES_EXT + DATA_EXT

GROUPS = dict((
    ('any', ANY),
    ('text', TEXT_EXT),
    ('documents', DOCUMENTS_EXT),
    ('images', IMAGES_EXT),
    ('audio', AUDIO_EXT),
    ('video', VIDEO_EXT),
    ('data', DATA_EXT),
    ('scripts', SCRIPTS_EXT),
    ('archives', ARCHIVES_EXT),
    ('executables', EXECUTABLES_EXT),
    ('default', DEFAULT),
))


def resolve_extensions(extensions, groups=None):
    """
    Calculate allowed extensions based on a list of extensions provided, and optional
    groups of extensions from the available lists.

    :param extensions: a list of extensions e.g ['py', 'txt']
    :param groups: additionally groups to extend the extensions.
    """
    groups = groups or []
    valid_exts = {x.lower() for x in extensions}

    for group in groups:
        if group in GROUPS:
            valid_exts.update(GROUPS[group])

    return valid_exts
