# Using CrossRef API to breakdown types of articles in database

from habanero import Crossref

# The types of article in the CrossRef API
articleTypes = sorted({
    "book-section",
    "monograph",
    "report-component",
    "report",
    "peer-review",
    "book-track",
    "journal-article",
    "book-part",
    "other",
    "book",
    "journal-volume",
    "book-set",
    "reference-entry",
    "proceedings-article",
    "journal",
    "component",
    "book-chapter",
    "proceedings-series",
    "report-series",
    "proceedings",
    "database",
    "standard",
    "reference-book",
    "posted-content",
    "journal-issue",
    "dissertation",
    "grant",
    "dataset",
    "book-series",
    "edited-book"
})

def get_number_results_year_and_type(fromYear, typeArticle):
    # Set email address so that I can be put into "polite" pool
    cr = Crossref(mailto = "jc550@students.waikato.ac.nz")

    # Generate and send query to CrossRef (Limited Query = 20)
    filterToUse = {'from-pub-date': str(fromYear), 'type': str(typeArticle)}
    query = cr.works(cursor = '*', cursor_max = 0, filter = filterToUse)
    return query["message"]["total-results"]

def sort_dict_by_frequency(dict):
    keys = dict.keys()
    sortedKeys = sorted(keys, key=dict.get, reverse=True)
    sortedDict = {}
    for key in sortedKeys:
        sortedDict.update({key: dict[key]})
    return sortedDict

# Breakdown by type (only in 2023)

recentArticlesSortedByFreq = {}

for articleType in articleTypes:
    queryResult = get_number_results_year_and_type(2023, articleType)
    recentArticlesSortedByFreq.update({articleType: queryResult})
    print("*", end='')
print("")

# Breakdown by type (all years)

allArticlesSortedByFreq = {}


for articleType in articleTypes:
    print("*", end='')
    queryResult = get_number_results_year_and_type("0000", articleType)
    allArticlesSortedByFreq.update({articleType: queryResult})
print("")

recentArticlesSortedByFreq = sort_dict_by_frequency(recentArticlesSortedByFreq)
allArticlesSortedByFreq = sort_dict_by_frequency(allArticlesSortedByFreq)


print("--- Article Type Breakdown in 2023 ---")

for key in recentArticlesSortedByFreq:
    print(key + ": " + str(recentArticlesSortedByFreq[key]))

print("--- Article Type Breakdown in All Years ---")

for key in allArticlesSortedByFreq:
    print(key + ": " + str(allArticlesSortedByFreq[key]))

