# Copyright (C) 2016-2024 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/
import os


from rhodecode.config.settings_maker import SettingsMaker


def _sanitize_settings_and_apply_defaults(settings):
    """
    Set defaults, convert to python types and validate settings.
    """
    from rhodecode.apps.file_store import config_keys

    # translate "legacy" params into new config
    settings.pop(config_keys.deprecated_enabled, True)
    if config_keys.deprecated_backend in settings:
        # if legacy backend key is detected we use "legacy" backward compat setting
        settings.pop(config_keys.deprecated_backend)
        settings[config_keys.backend_type] = config_keys.backend_legacy_filesystem

    if config_keys.deprecated_store_path in settings:
        store_path = settings.pop(config_keys.deprecated_store_path)
        settings[config_keys.legacy_filesystem_storage_path] = store_path

    settings_maker = SettingsMaker(settings)

    default_cache_dir = settings["cache_dir"]
    default_store_dir = os.path.join(default_cache_dir, "artifacts_filestore")

    # set default backend
    settings_maker.make_setting(config_keys.backend_type, config_keys.backend_legacy_filesystem)

    # legacy filesystem defaults
    settings_maker.make_setting(
        config_keys.legacy_filesystem_storage_path,
        default_store_dir,
        default_when_empty=True,
    )

    # filesystem defaults
    settings_maker.make_setting(
        config_keys.filesystem_storage_path,
        default_store_dir,
        default_when_empty=True,
    )
    settings_maker.make_setting(config_keys.filesystem_shards, 8, parser="int")

    # objectstore defaults
    settings_maker.make_setting(config_keys.objectstore_url, "http://s3-minio:9000")
    settings_maker.make_setting(config_keys.objectstore_bucket, "rhodecode-artifacts-filestore")
    settings_maker.make_setting(config_keys.objectstore_bucket_shards, 8, parser="int")

    settings_maker.make_setting(config_keys.objectstore_region, "")
    settings_maker.make_setting(config_keys.objectstore_key, "")
    settings_maker.make_setting(config_keys.objectstore_secret, "")

    settings_maker.env_expand()


def includeme(config):
    from rhodecode.apps.file_store.views import FileStoreView

    settings = config.registry.settings
    _sanitize_settings_and_apply_defaults(settings)

    config.add_route(name="upload_file", pattern="/_file_store/upload")
    config.add_view(
        FileStoreView, attr="upload_file", route_name="upload_file", request_method="POST", renderer="json_ext"
    )

    config.add_route(name="download_file", pattern="/_file_store/download/{fid:.*}")
    config.add_view(FileStoreView, attr="download_file", route_name="download_file")

    config.add_route(name="download_file_by_token", pattern="/_file_store/token-download/{_auth_token}/{fid:.*}")
    config.add_view(FileStoreView, attr="download_file_by_token", route_name="download_file_by_token")
