import json
import requests
from bs4 import BeautifulSoup
from .utils import editionMap, topicMap, langMap
from .userexception import NotFound


class gnfetcher:

    def __init__(self, edition='United States (English)',
                 topic='top stories', location=None,
                 query=None, language='english'):
        '''
        constructor function
        '''
        # list of editions and topics
        self.editions = list(editionMap)
        self.topics = list(topicMap)
        self.languages = list(langMap)

        # default parameter values
        self.edition = edition
        self.topic = topic
        self.location = location
        self.query = query
        self.language = language

        # parameters to be passed in HTTP request
        self.params = {'output': 'atom',
                       'ned': self.edition,
                       'topic': self.topic,
                       'geo': self.location,
                       'q': self.query,
                       'hl': self.language}

    def get_config(self):
        '''
        function to get current configuration
        '''
        config = {
            'edition': self.edition,
            'topic': self.topic,
            'language': self.language,
            'location': self.location,
            'query': self.query
        }
        return config

    def reset(self):
        '''
        function to reset the parameters
        '''
        self.edition = 'United States (English)'
        self.language = 'english'
        self.location = None
        self.query = None
        self.topic = 'top stories'

    def get_news(self):
        '''
        function to fetch news articles
        '''
        status = self.set_params()
        # params not set properly
        if status is False:
            return

        soup = self.load_feed()
        articles = self.scrape_feed(soup)
        return articles

    def set_params(self):
        '''
        function to set params for HTTP request
        '''

        # setting edition
        try:
            self.params['ned'] = editionMap[self.edition]
        except KeyError:
            print(f"{self.edition} edition not found.\n"
                  f"Use editions attribute to get list of editions.")
            return False

        # setting topic
        try:
            self.params['topic'] = topicMap[self.topic]
        except KeyError:
            print(f"{self.topic} topic not found.\n"
                  f"Use topics attribute to get list of topics.")
            return False

        # setting language
        try:
            self.params['hl'] = langMap[self.language]
        except KeyError:
            print(f"{self.language} language not found.\n"
                  f"Use langugaes attribute to get list of languages.")
            return False

        # setting query
        if self.query is not None:
            self.params['q'] = self.query
            # topic overrides query parameter. So, clearing it.
            self.params['topic'] = None

        # setting location
        if self.location is not None:
            self.params['geo'] = self.location
            # topic overrides location parameter. So, overriding it.
            self.params['topic'] = None

        # params setting successful
        return True

    def load_feed(self):
        '''
        function to load atom feed
        '''
        url = "https://news.google.com/news"
        resp = requests.get(url, params=self.params)
        soup = BeautifulSoup(resp.content, 'html5lib')
        return soup

    def scrape_feed(self, soup):
        '''
        function to scrape atom feed
        '''
        entries = soup.findAll('entry')
        articles = []

        for entry in entries:
            article = {}
            article['title'] = entry.title.text
            article['link'] = entry.link['href'].split('&url=')[1]
            article['releasedAt'] = entry.updated.text

            try:
                string = entry.content.text.split('src=\"')[1].split('\"')[0]
                article['img'] = "https:" + string
            except Exception:
                article['img'] = None
                pass
            articles.append(article)
        try:
            if len(articles) == 0:
                raise NotFound
        except NotFound:
                print("The articles for the given response are not found.")
                return
        return articles

import json
import requests
from bs4 import BeautifulSoup
from .utils import editionMap, topicMap, langMap
from .userexception import NotFound


class gnfetcher:

    def __init__(self, edition='United States (English)',
                 topic='top stories', location=None,
                 query=None, language='english'):
        '''
        constructor function
        '''
        # list of editions and topics
        self.editions = list(editionMap)
        self.topics = list(topicMap)
        self.languages = list(langMap)

        # default parameter values
        self.edition = edition
        self.topic = topic
        self.location = location
        self.query = query
        self.language = language

        # parameters to be passed in HTTP request
        self.params = {'output': 'atom',
                       'ned': self.edition,
                       'topic': self.topic,
                       'geo': self.location,
                       'q': self.query,
                       'hl': self.language}

    def get_config(self):
        '''
        function to get current configuration
        '''
        config = {
            'edition': self.edition,
            'topic': self.topic,
            'language': self.language,
            'location': self.location,
            'query': self.query
        }
        return config

    def reset(self):
        '''
        function to reset the parameters
        '''
        self.edition = 'United States (English)'
        self.language = 'english'
        self.location = None
        self.query = None
        self.topic = 'top stories'

    def get_news(self):
        '''
        function to fetch news articles
        '''
        status = self.set_params()
        # params not set properly
        if status is False:
            return

        soup = self.load_feed()
        articles = self.scrape_feed(soup)
        return articles

    def set_params(self):
        '''
        function to set params for HTTP request
        '''

        # setting edition
        try:
            self.params['ned'] = editionMap[self.edition]
        except KeyError:
            print(f"{self.edition} edition not found.\n"
                  f"Use editions attribute to get list of editions.")
            return False

        # setting topic
        try:
            self.params['topic'] = topicMap[self.topic]
        except KeyError:
            print(f"{self.topic} topic not found.\n"
                  f"Use topics attribute to get list of topics.")
            return False

        # setting language
        try:
            self.params['hl'] = langMap[self.language]
        except KeyError:
            print(f"{self.language} language not found.\n"
                  f"Use langugaes attribute to get list of languages.")
            return False

        # setting query
        if self.query is not None:
            self.params['q'] = self.query
            # topic overrides query parameter. So, clearing it.
            self.params['topic'] = None

        # setting location
        if self.location is not None:
            self.params['geo'] = self.location
            # topic overrides location parameter. So, overriding it.
            self.params['topic'] = None

        # params setting successful
        return True

    def load_feed(self):
        '''
        function to load atom feed
        '''
        url = "https://news.google.com/news"
        resp = requests.get(url, params=self.params)
        soup = BeautifulSoup(resp.content, 'html5lib')
        return soup

    def scrape_feed(self, soup):
        '''
        function to scrape atom feed
        '''
        entries = soup.findAll('entry')
        articles = []

        for entry in entries:
            article = {}
            article['title'] = entry.title.text
            article['link'] = entry.link['href'].split('&url=')[1]
            article['releasedAt'] = entry.updated.text

            try:
                string = entry.content.text.split('src=\"')[1].split('\"')[0]
                article['img'] = "https:" + string
            except Exception:
                article['img'] = None
                pass
            articles.append(article)
        try:
            if len(articles) == 0:
                raise NotFound
        except NotFound:
                print("The articles for the given response are not found.")
                return
        return articles

constructor function # list of editions and topics # default parameter values # parameters to be passed in HTTP request function to get current configuration function to reset the parameters function to fetch news articles # params not set properly function to set params for HTTP request # setting edition # setting topic # setting language # setting query # topic overrides query parameter. So, clearing it. # setting location # topic overrides location parameter. So, overriding it. # params setting successful function to load atom feed function to scrape atom feed