from elasticsearch.helpers import scan

from distribution import app
from distribution.models.feed import FeedItem
from distribution.models.article import Article
from distribution.models.series import Series
from distribution.models.schedule import Schedule


def update_models(query, model, callback):
    actions = []
    generator = scan(FeedItem.manager.backend.client,
                     query,
                     index=app.config.get('ELASTICSEARCH_FEED_INDEX_NAME', 'distribution_feed'),
                     doc_type=FeedItem.manager.doc_type,
                     raise_on_error=False)

    for key in generator:
        callback(key)
        actions.append({'_op_type': 'index',
                        '_index': app.config.get('ELASTICSEARCH_FEED_INDEX_NAME',
                                                 'distribution_feed'),
                        '_type': model.manager.doc_type,
                        '_id': key['_id'],
                        '_source': key['_source']})
        actions.append({'_op_type': 'delete',
                        '_index': app.config.get('ELASTICSEARCH_FEED_INDEX_NAME',
                                                 'distribution_feed'),
                        '_type': FeedItem.manager.doc_type,
                        '_id': key['_id']})
    if actions:
        print '-- Executing {} actions for {} --'.format(len(actions), model.manager.doc_type)
        model.manager.backend.bulk(actions)


def _update_series(key):
    series = key['_source']['extra_fields']['series']
    if 'episodes' in series:
        key['_source']['episodes'] = series['episodes']
    if 'type' in series:
        key['_source']['type'] = series['type']
    if 'id' in series:
        key['_source']['series_id'] = series['id']


def update_series():
    query = {
        'query': {
            'constant_score': {
                'filter': {
                    'term': {
                        'content_type': 'series'
                    }
                }
            }
        }
    }
    update_models(query, Series, _update_series)


def update_schedule(key):
    key['_source']['episode'] = key['_source']['extra_fields']['schedule']['episode']


def update_schedules():
    query = {
        'query': {
            'constant_score': {
                'filter': {
                    'term': {
                        'content_type': 'schedule'
                    }
                }
            }
        }
    }
    update_models(query, Schedule, update_schedule)


def update_article(key):
    extra_fields = key['_source']['extra_fields']
    if 'article' in extra_fields and extra_fields['article']:
        article_extra = key['_source']['extra_fields']['article']
        if 'kickers' in article_extra:
            key['_source']['kickers'] = article_extra['kickers']
        if 'lead_media' in article_extra:
            key['_source']['lead_media'] = article_extra['lead_media']


def update_articles():
    query = {
        'query': {
            'constant_score': {
                'filter': {
                    'term': {
                        'content_type': 'article'
                    }
                }
            }
        }
    }
    update_models(query, Article, update_article)


if __name__ == "__main__":
    update_series()
    update_schedules()
    update_articles()
