#    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.

"""remove is_public from images

Revision ID: ocata_contract01
Revises: mitaka02
Create Date: 2017-01-27 12:58:16.647499

"""

from alembic import op
from sqlalchemy import Enum

from glance.cmd import manage
from glance.db import migration

# revision identifiers, used by Alembic.
revision = 'ocata_contract01'
down_revision = 'mitaka02'
branch_labels = ('ocata01', migration.CONTRACT_BRANCH)
depends_on = 'ocata_expand01'


MYSQL_DROP_INSERT_TRIGGER = """
DROP TRIGGER insert_visibility;
"""

MYSQL_DROP_UPDATE_TRIGGER = """
DROP TRIGGER update_visibility;
"""


def _drop_column():
    with op.batch_alter_table('images') as batch_op:
        batch_op.drop_index('ix_images_is_public')
        batch_op.drop_column('is_public')


def _drop_triggers(connection):
    engine_name = connection.engine.name
    if engine_name == "mysql":
        op.execute(MYSQL_DROP_INSERT_TRIGGER)
        op.execute(MYSQL_DROP_UPDATE_TRIGGER)


def _set_nullability_and_default_on_visibility():
    # NOTE(hemanthm): setting the default on 'visibility' column
    # to 'shared'. Also, marking it as non-nullable.
    existing_type = Enum('private', 'public', 'shared', 'community',
                         name='image_visibility')
    with op.batch_alter_table('images') as batch_op:
        batch_op.alter_column('visibility',
                              nullable=False,
                              server_default='shared',
                              existing_type=existing_type)


def upgrade():
    bind = op.get_bind()

    _drop_column()
    if manage.USE_TRIGGERS:
        _drop_triggers(bind)
    _set_nullability_and_default_on_visibility()
