#!/usr/bin/env python
# vim:fileencoding=utf-8
from datetime import date
from pprint import pformat

from calibre.web.feeds.news import BasicNewsRecipe, classes


class NatGeo(BasicNewsRecipe):
    title = 'National Geographic Magazine'
    description = 'The National Geographic, an American monthly magazine. Inspiring people to care about the planet since 1888'
    language = 'en'
    encoding = 'utf8'
    publisher = 'nationalgeographic.com'
    category = 'science, nat geo'
    __author__ = 'Kovid Goyal, unkn0wn'
    timefmt = ' [%a, %d %b, %Y]'
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = ['style']
    remove_javascript = False
    masthead_url = 'https://i.natgeofe.com/n/e76f5368-6797-4794-b7f6-8d757c79ea5c/ng-logo-2fl.png?w=600&h=600'
    remove_empty_feeds = True
    resolve_internal_links = True

    recipe_specific_options = {
        'date': {
            'short': 'The date of the edition to download (Month-YYYY format)',
            'long': 'For example, March-2023',
        },
        'res': {
            'short': 'For hi-res images, select a resolution from the\nfollowing options: 800, 1000, 1200 or 1500',
            'long': 'This is useful for non e-ink devices, and for a lower file size\nthan the default, use 400 or 300.',
            'default': '600',
        },
    }

    @property
    def natgeo_parser(self):
        ans = getattr(self, '_natgeo_parser', None)
        if ans is None:
            from calibre.live import load_module

            self._natgeo_parser = ans = load_module('calibre.web.site_parsers.natgeo')
        return ans

    def preprocess_raw_html(self, raw_html, url):
        return self.natgeo_parser.extract_html(raw_html)

    extra_css = '''
        blockquote { color:#404040; }
        .byline, i { font-style:italic; color:#202020; }
        .cap { font-size:small; }
        img {display:block; margin:0 auto;}
        .cred { font-style:italic; font-size:small; color:#404040; }
        .auth, .time, .sub { font-size:small; color:#5c5c5c; }
    '''

    def parse_index(self):
        edition = date.today().strftime('%B-%Y')
        d = self.recipe_specific_options.get('date')
        if d and isinstance(d, str):
            edition = d
        url = 'https://www.nationalgeographic.com/magazine/issue/' + edition.lower()
        self.log('Downloading ', url)
        self.timefmt = ' [' + edition + ']'
        soup = self.index_to_soup(url)
        # png = re.findall('https://i\.natgeofe\.com\S+?national-geographic-\S+?\.jpg', soup.decode('utf-8'))
        # self.cover_url = png[0] + '?w=1000&h=1000'
        self.cover_url = soup.find('meta', attrs={'property': 'og:image'})['content'].split('?')[0] + '?w=1000'

        # self.title = 'National Geographic ' + self.tag_to_string(name)
        ans = {}
        if photoart := soup.find(attrs={'class': lambda x: x and 'BgImagePromo__Container__Text__Link' in x.split()}):
            section = 'Photo Essay'
            title = self.tag_to_string(photoart)
            url = photoart['href']
            if url.startswith('/'):
                url = 'https://www.nationalgeographic.com' + url
            articles = ans.setdefault(section, [])
            articles.append({'title': title, 'url': url})
        for promo in soup.findAll(**classes('OneUpPromoCard__Content')):
            if promo.find('a', attrs={'href': True}) and promo.a.get('href'):
                url = promo.a['href']
                section = self.tag_to_string(promo.find(**classes('SectionLabel')))
                title = self.tag_to_string(promo.find(**classes('Card__Content__Heading')))
                articles = ans.setdefault(section, [])
                articles.append({'title': title, 'url': url})
        for gird in soup.findAll(attrs={'class': 'GridPromoTile'}):
            for article in soup.findAll('article'):
                a = article.find('a')
                url = a['href']
                if url.startswith('/'):
                    url = 'https://www.nationalgeographic.com' + url
                if '/graphics/' in url:
                    continue
                section = self.tag_to_string(article.find(**classes('SectionLabel')))
                title = self.tag_to_string(article.find(**classes('PromoTile__Title--truncated')))
                articles = ans.setdefault(section, [])
                articles.append({'title': title, 'url': url})
            self.log(pformat(ans))
            return list(ans.items())

    def preprocess_html(self, soup):
        for h2 in soup.findAll('h2'):
            h2.name = 'h4'
        for img in soup.findAll('img', src=True):
            res = '?w=600'
            w = self.recipe_specific_options.get('res')
            if w and isinstance(w, str):
                res = '?w=' + w
            img['src'] = img['src'] + res
        return soup

    def populate_article_metadata(self, article, soup, first):
        summ = soup.find(attrs={'class': 'byline'})
        if summ:
            article.summary = self.tag_to_string(summ)
            article.text_summary = self.tag_to_string(summ)
