#!/usr/bin/env python

# Copyright (c) 2015 Mirantis, Inc.
# All Rights Reserved.
#
#    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
#
#         http://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.
"""
Command-line utility for database manage
"""

import sys

from oslo_config import cfg
from oslo_log import log

from refstack.db import migration

LOG = log.getLogger(__name__)
CONF = cfg.CONF

log.register_options(CONF)


class DatabaseManager(object):

    def version(self):
        print(migration.version())

    def upgrade(self):
        migration.upgrade(CONF.command.revision)

    def downgrade(self):
        migration.downgrade(CONF.command.revision)

    def stamp(self):
        migration.stamp(CONF.command.revision)

    def revision(self):
        migration.revision(CONF.command.message, CONF.command.autogenerate)


def add_command_parsers(subparsers):
    db_manager = DatabaseManager()

    parser = subparsers.add_parser('version',
                                   help='show current database version')
    parser.set_defaults(func=db_manager.version)

    parser = subparsers.add_parser('upgrade',
                                   help='upgrade database to '
                                        'the specified version')
    parser.set_defaults(func=db_manager.upgrade)
    parser.add_argument('--revision', nargs='?',
                        help='desired database version')

    parser = subparsers.add_parser('downgrade',
                                   help='downgrade database '
                                        'to the specified version')
    parser.set_defaults(func=db_manager.downgrade)
    parser.add_argument('--revision', nargs='?',
                        help='desired database version')

    parser = subparsers.add_parser('stamp',
                                   help='stamp database with provided '
                                        'revision. Don\'t run any migrations')
    parser.add_argument('--revision', nargs='?',
                        help='should match one from repository or head - '
                             'to stamp database with most recent revision')
    parser.set_defaults(func=db_manager.stamp)

    parser = subparsers.add_parser('revision',
                                   help='create template for migration')
    parser.add_argument('-m', '--message',
                        help='text that will be used for migration title')
    parser.add_argument('--autogenerate', action='store_true',
                        help='if True - generates diff based '
                             'on current database state (True by default)')
    parser.set_defaults(func=db_manager.revision)

command_opt = cfg.SubCommandOpt('command',
                                title='Available commands',
                                handler=add_command_parsers)

CONF.register_cli_opt(command_opt)

if __name__ == '__main__':
    CONF(sys.argv[1:], project='refstack')
    log.setup(CONF, 'refstack')
    CONF.command.func()
