"""all files only on disk.

Revision ID: f3852e1349c4
Revises: 913efdf409e5
Create Date: 2017-07-24 17:15:54.278141

"""

from alembic import context
from alembic import op

from depot.fields.sqlalchemy import UploadedFileField
from depot.manager import DepotManager

import sqlalchemy as sa

# revision identifiers, used by Alembic.
revision = 'f3852e1349c4'
down_revision = '913efdf409e5'


def configure_depot():
    """Configure Depot."""
    depot_storage_name = context.config.get_main_option('depot_storage_name')
    depot_storage_path = context.config.get_main_option('depot_storage_dir')
    depot_storage_settings = {'depot.storage_path': depot_storage_path}
    DepotManager.configure(
        depot_storage_name,
        depot_storage_settings,
    )


revision_helper = sa.Table(
    'content_revisions',
    sa.MetaData(),
    sa.Column('revision_id', sa.Integer, primary_key=True),
    sa.Column('file_content', sa.LargeBinary),
    sa.Column('depot_file', UploadedFileField, nullable=True),
    sa.Column('type', sa.String(32), nullable=False),
)


def upgrade():
    """Drop the file content from revision."""
    with op.batch_alter_table('content_revisions') as batch_op:
        batch_op.drop_column('file_content')


def downgrade():
    """Add the file content in revision."""
    with op.batch_alter_table('content_revisions') as batch_op:
        batch_op.add_column(sa.Column('file_content', sa.LargeBinary))

    configure_depot()
    depot = DepotManager.get()
    connection = op.get_bind()
    select_query = revision_helper.select() \
        .where(revision_helper.c.type == 'file') \
        .where(revision_helper.c.depot_file.isnot(None))
    files = connection.execute(select_query).fetchall()
    for file in files:
        depot_file_content = depot.get(file.depot_file).read()
        update_query = revision_helper.update() \
            .where(revision_helper.c.revision_id == file.revision_id) \
            .values(file_content=depot_file_content)
        connection.execute(update_query)
