import json

from elasticsearch import Elasticsearch
from elasticsearch_dsl import *

stats = {}


def create_source_type_filter(value):
    args = {'source.objectType': value}
    return Q('nested', path='source', query=Q('bool', must=[Q('match', **args)]))


def create_target_type_filter(value):
    args = {'target.objectType': value}
    return Q('nested', path='target', query=Q('bool', must=[Q('match', **args)]))


def create_object_type_filter(value):
    args = {'target.objectType': value}
    return Q('nested', path='target', query=Q('bool', must=[Q('match', **args)]))


def create_search( to_type=None):
    if not to_type or not to_type:
        search_object = Search(using=client).doc_type('scholix').query()
    else:
        search_object = Search(using=client).doc_type('scholix').query(
            Q('bool', must=[create_target_type_filter(to_type)]))
    search_object.aggs.bucket('all_datasources', 'nested', path='linkprovider').bucket('all_names', 'terms',
                                                                                       field='linkprovider.name',
                                                                                       size=100)
    return search_object


client = Elasticsearch(hosts=['ip-90-147-167-27.ct1.garrservices.it'])

s = create_search()
response = s.execute()
for item in response.aggs.all_datasources.all_names.buckets:
    current = stats.get(item.key, {})
    current['numberOfRelations'] = item.doc_count
    stats[item.key] = current



s = create_search('dataset')
response = s.execute()
for item in response.aggs.all_datasources.all_names.buckets:
    current = stats.get(item.key, {})
    current['referredDataset'] = item.doc_count
    stats[item.key] = current

s = create_search('publication')
response = s.execute()
for item in response.aggs.all_datasources.all_names.buckets:
    current = stats.get(item.key, {})
    current['referredPublication'] = item.doc_count
    stats[item.key] = current

s = create_search('unknown')
response = s.execute()
for item in response.aggs.all_datasources.all_names.buckets:
    current = stats.get(item.key, {})
    current['referredUnknown'] = item.doc_count
    stats[item.key] = current

s = Search(using=client).doc_type('object').query("match", typology='dataset')
s.aggs.bucket('all_datasources', 'nested', path='datasources').bucket('all_names', 'terms',
                                                                      field='datasources.datasourceName', size=100)
response = s.execute()

for item in response.aggs.all_datasources.all_names.buckets:
    current = stats.get(item.key, {})
    current['numberOfDatasets'] = item.doc_count
    stats[item.key] = current

s = Search(using=client).doc_type('object').query("match", typology='publication')
s.aggs.bucket('all_datasources', 'nested', path='datasources').bucket('all_names', 'terms',
                                                                      field='datasources.datasourceName', size=100)
response = s.execute()

for item in response.aggs.all_datasources.all_names.buckets:
    current = stats.get(item.key, {})
    current['numberOfPublication'] = item.doc_count
    stats[item.key] = current

s = Search(using=client).doc_type('object').query("match", typology='unknown')
s.aggs.bucket('all_datasources', 'nested', path='datasources').bucket('all_names', 'terms',
                                                                      field='datasources.datasourceName', size=100)
response = s.execute()

for item in response.aggs.all_datasources.all_names.buckets:
    current = stats.get(item.key, {})
    current['numberOfUnknown'] = item.doc_count
    stats[item.key] = current

s = Search(using=client).doc_type('object').query()
s.aggs.bucket('all_datasources', 'nested', path='datasources').bucket('all_names', 'terms',
                                                                      field='datasources.datasourceName', size=100)
response = s.execute()

for item in response.aggs.all_datasources.all_names.buckets:
    current = stats.get(item.key, {})
    current['numberOfObjects'] = item.doc_count
    stats[item.key] = current

print json.dumps(stats, indent=1)
#
# s = create_search('dataset', 'publication')
# response = s.execute()
# for item in response.aggs.all_datasources.all_names.buckets:
#     current = stats.get(item.key, {})
#     current['datasetToPublication'] = item.doc_count
#     stats[item.key] = current
#
# s = create_search('publication', 'publication')
# response = s.execute()
# for item in response.aggs.all_datasources.all_names.buckets:
#     current = stats.get(item.key, {})
#     current['publicationToPublication'] = item.doc_count
#     stats[item.key] = current
#
# # s = create_search('dataset', 'unknown')
# # response = s.execute()
# # for item in response.aggs.all_datasources.all_names.buckets:
# #     current = stats.get(item.key, {})
# #     current['dataset-unknown'] = item.doc_count
# #     stats[item.key] = current
# #
# # s = create_search('publication', 'unknown')
# # response = s.execute()
# # for item in response.aggs.all_datasources.all_names.buckets:
# #     current = stats.get(item.key, {})
# #     current['publication-unknown'] = item.doc_count
# #     stats[item.key] = current
# #
# # s = create_search('unknown', 'unknown')
# # response = s.execute()
# # for item in response.aggs.all_datasources.all_names.buckets:
# #     current = stats.get(item.key, {})
# #     current['unknown-unknown'] = item.doc_count
# #     stats[item.key] = current
#
#
#
#
#

#
# s = Search(using=client).doc_type('object').query()
# s.aggs.bucket('all_datasources', 'nested', path='datasources').bucket('all_names', 'terms',
#                                                                       field='datasources.datasourceName', size=100)
# response = s.execute()
#
# for item in response.aggs.all_datasources.all_names.buckets:
#     current = stats.get(item.key, {})
#     current['numberOfObjects'] = item.doc_count
#     stats[item.key] = current


ck =["referredPublication","referredDataset","numberOfRelations","numberOfDatasets","numberOfPublication","referredUnknown","numberOfUnknown","numberOfObjects"]


fstats = []
for item in stats:
    d = stats[item]
    d['datasource'] = item
    for e in ck:
        if e not in d:
            d[e] = 0
    fstats.append(d)

k = {"2017-04-02": fstats}
print json.dumps(k, indent=1)
