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

# Copyright (C) 2010-2016  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
import sys
from paste.script.appinstall import AbstractInstallCommand
from paste.script.command import BadCommand
from paste.deploy import appconfig

# fix rhodecode import
from os.path import dirname as dn
rc_path = dn(dn(dn(os.path.realpath(__file__))))
sys.path.append(rc_path)


class Command(AbstractInstallCommand):

    default_verbosity = 1
    max_args = 1
    min_args = 1
    summary = "Setup an application, given a config file"
    usage = "CONFIG_FILE"
    group_name = "RhodeCode"

    description = """\

    Setup RhodeCode according to its configuration file.  This is
    the second part of a two-phase web application installation
    process (the first phase is prepare-app).  The setup process
    consist of things like setting up databases, creating super user
    """

    parser = AbstractInstallCommand.standard_parser(
        simulate=True, quiet=True, interactive=True)
    parser.add_option(
        '--user',
        action='store',
        dest='username',
        default=None,
        help='Admin Username')
    parser.add_option(
        '--email',
        action='store',
        dest='email',
        default=None,
        help='Admin Email')
    parser.add_option(
        '--password',
        action='store',
        dest='password',
        default=None,
        help='Admin password min 6 chars')
    parser.add_option(
        '--api-key',
        action='store',
        dest='api_key',
        help='Initial API key for the admin user')
    parser.add_option(
        '--repos',
        action='store',
        dest='repos_location',
        default=None,
        help='Absolute path to repositories location')
    parser.add_option(
        '--name',
        action='store',
        dest='section_name',
        default=None,
        help='The name of the section to set up (default: app:main)')
    parser.add_option(
        '--force-yes',
        action='store_true',
        dest='force_ask',
        default=None,
        help='Force yes to every question')
    parser.add_option(
        '--force-no',
        action='store_false',
        dest='force_ask',
        default=None,
        help='Force no to every question')
    parser.add_option(
        '--public-access',
        action='store_true',
        dest='public_access',
        default=None,
        help='Enable public access on this installation (default)')
    parser.add_option(
        '--no-public-access',
        action='store_false',
        dest='public_access',
        default=None,
        help='Disable public access on this installation ')

    def command(self):
        config_spec = self.args[0]
        section = self.options.section_name
        if section is None:
            if '#' in config_spec:
                config_spec, section = config_spec.split('#', 1)
            else:
                section = 'main'
        if ':' not in section:
            plain_section = section
            section = 'app:' + section
        else:
            plain_section = section.split(':', 1)[0]
        if not config_spec.startswith('config:'):
            config_spec = 'config:' + config_spec
        if plain_section != 'main':
            config_spec += '#' + plain_section
        config_file = config_spec[len('config:'):].split('#', 1)[0]
        config_file = os.path.join(os.getcwd(), config_file)
        self.logging_file_config(config_file)
        conf = appconfig(config_spec, relative_to=os.getcwd())
        ep_name = conf.context.entry_point_name
        ep_group = conf.context.protocol
        dist = conf.context.distribution
        if dist is None:
            raise BadCommand(
                "The section %r is not the application (probably a filter).  "
                "You should add #section_name, where section_name is the "
                "section that configures your application" % plain_section)
        installer = self.get_installer(dist, ep_group, ep_name)
        installer.setup_config(
            self, config_file, section, self.sysconfig_install_vars(installer))
        self.call_sysconfig_functions(
            'post_setup_hook', installer, config_file)