"""
script for news fetching (by keywords)
"""
__author__ = "Florian Kellermann, Linus Eickhoff"
__date__ = "26.04.2022"
__version__ = "1.0.0"
__license__ = "None"

import os
import sys

import helper_functions as hf
import requests
from dotenv import load_dotenv
from newsapi import NewsApiClient

load_dotenv()  # loads environment vars

# Init
api_key = os.getenv('NEWS_API_KEY')  # get API Key from .env file
newsapi = NewsApiClient(api_key=api_key)  # news api from https://newsapi.org/

try:
    # get all available news sources (e.g BBC, New York Times, etc.)
    source_json = requests.get(f"https://newsapi.org/v2/top-headlines/sources?apiKey={api_key}&language=en").json()
    sources = source_json["sources"]
    str_sources = ",".join([source["id"] for source in sources])

except KeyError:
    print("Error: Could not get sources, may be blocked because of too many requests (free newsapi is limited to 100 reqs per day)")
    str_sources = str(
        "Reuters, bbc, cnn, fox-news, google-news, hacker-news, nytimes, the-huffington-post, the-new-york-times, business-insider, bbc-news, cbc-news, ESPN, fox-sports, google-news-uk, independent, the-wall-street-journal, the-washington-times, time, usa-today")


def get_all_news_by_keyword(keyword, from_date="2000-01-01"):
    """get all news to keyword
    Args:
        keyword (String): keyword for search
        from_date (String): min date for search

    Returns:
        JSON/dict: dict containing articles
    """
    top_headlines = newsapi.get_everything(q=keyword, sources=str_sources, language='en', from_param=from_date)  # keywords can be combined with OR (e.g. keyword = "bitcoin OR ethereum")
    if (top_headlines["status"] == "ok"):
        return top_headlines
    else:
        return None


def get_top_news_by_keyword(keyword):
    """get top news to keyword
    Args:
        keyword (String): keyword for search

    Returns:
        JSON/dict: dict containing articles
    """
    top_headlines = newsapi.get_top_headlines(q=keyword, sources=str_sources, language='en')  # get top headlines, measured by popularity from NewsApi
    if (top_headlines["status"] == "ok"):
        return top_headlines
    else:
        return None


def format_article(article):
    """format article for messaging (using markdown syntax)

    Args:
        article (dict): article to format for messaging

    Returns:
        String: formatted article
    """
    sourcename = hf.make_markdown_proof(article["source"]["name"])  # make attributes markdownv2 proof
    headline = hf.make_markdown_proof(article["title"])
    url = hf.make_markdown_proof(article["url"])
    formatted_article = f"_{sourcename}_\n*{headline}*\n\n{url}"  # formatting in Markdown syntax

    return formatted_article


if __name__ == '__main__':  # only execute if script is called directly -> for simple testing

    print("this is a module and should not be run directly")
    print("fetching top news by keyword bitcoin...")

    articles = get_all_news_by_keyword("bitcoin")
    formatted_article = format_article(articles["articles"][0])
    print(formatted_article)
    articles = get_top_news_by_keyword("bitcoin")
    formatted_article = format_article(articles["articles"][0])
    print(formatted_article)
    sys.exit(1)
