#!/usr/bin/env python
from __future__ import print_function

import logging

from dateutil.parser import parse as parse_date
from elasticsearch import Elasticsearch


def print_hits(results, facet_masks={}):
    " Simple utility function to print results of a search query. "
    print('=' * 80)
    print('Total %d found in %dms' % (results['hits']['total'], results['took']))
    if results['hits']['hits']:
        print('-' * 80)
    for hit in results['hits']['hits']:
        # get created date for a repo and fallback to authored_date for a commit
        created_at = parse_date(hit['_source'].get('created_at', hit['_source']['authored_date']))
        print('/%s/%s/%s (%s): %s' % (
            hit['_index'], hit['_type'], hit['_id'],
            created_at.strftime('%Y-%m-%d'),
            hit['_source']['description'].replace('\n', ' ')))

    for facet, mask in facet_masks.items():
        print('-' * 80)
        for d in results['facets'][facet]['terms']:
            print(mask % d)
    print('=' * 80)
    print()


# get trace logger and set level
tracer = logging.getLogger('elasticsearch.trace')
tracer.setLevel(logging.INFO)
tracer.addHandler(logging.FileHandler('/tmp/es_trace.log'))
# instantiate es client, connects to localhost:9200 by default
es = Elasticsearch()

print('Empty search:')
print_hits(es.search(index='git'))

print('Find commits that says "fix" without touching tests:')
result = es.search(
    index='git',
    doc_type='commits',
    body={
        'query': {
            'filtered': {
                'query': {
                    'match': {'description': 'fix'}
                },
                'filter': {
                    'not': {
                        'term': {'files': 'test_elasticsearch'}
                    }
                }
            }
        }
    }
)
print_hits(result)

print('Last 8 Commits for elasticsearch-py:')
result = es.search(
    index='git',
    doc_type='commits',
    body={
        'query': {
            'filtered': {
                'filter': {
                    'term': {
                        # parent ref is stored as type#id
                        '_parent': 'repos#elasticsearch-py'
                    }
                }
            }
        },
        'sort': [
            {'committed_date': {'order': 'desc'}}
        ],
        'size': 8
    }
)
print_hits(result)

print('Stats for top 10 python committers:')
result = es.search(
    index='git',
    doc_type='commits',
    body={
        'size': 0,
        'query': {
            'filtered': {
                'filter': {
                    'has_parent': {
                        'type': 'repos',
                        'query': {
                            'filtered': {
                                'filter': {
                                    'term': {
                                        'tags': 'python'
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        'facets': {
            'committers': {
                'terms_stats': {
                    'key_field': 'committer.name.raw',
                    'value_field': 'stats.lines'
                }
            }
        }
    }
)
print_hits(result, {'committers': '%(term)15s: %(count)3d commits changing %(total)6d lines'})
