""" EVAR – Einfach vorlesen auf'm Reader """

from pathlib import Path
from subprocess import check_call
from tempfile import TemporaryDirectory
from urllib.parse import quote, urljoin, urlsplit
from urllib.request import urlretrieve

from requests_html import HTML, Element, HTMLSession

__version__ = '0.1.0'

REGAL_URL = 'https://www.einfachvorlesen.de/geschichtenregal'


def schreibe_geschichte(dateipfad: Path, geschichte: Element):
    with dateipfad.open('w') as datei:
        for element in geschichte.find('h1,.bookmarkable,img.float'):
            if 'headline' in element.attrs['class']:
                datei.write(f'<p><strong>{element.text}</strong></p>')
            else:
                datei.write(element.html)


def main():
    session = HTMLSession()
    regal = session.get(REGAL_URL)
    regal.raise_for_status()

    altersgruppen = {altersgruppe.attrs['data-altersgruppe'] for altersgruppe in regal.html.find('div.alter')}

    geschichtenseiten = {}
    for altersgruppe in altersgruppen:
        regal_fuer_altersgruppe = session.post(REGAL_URL, data={
            'alter': altersgruppe
        }, headers={
            'X-OCTOBER-REQUEST-HANDLER': 'storiesListRegal::onToggleView',
            'X-OCTOBER-REQUEST-PARTIALS': '@story-list-container',
            'X-Requested-With': 'XMLHttpRequest',
        })
        regal_fuer_altersgruppe.raise_for_status()
        base_url = regal_fuer_altersgruppe.url

        regal_fuer_altersgruppe = HTML(html=regal_fuer_altersgruppe.json()['@story-list-container'])
        felder = regal_fuer_altersgruppe.find('div.story-item')

        geschichtenseiten.update({
            feld.find('a.lesen_button')[0].attrs['href']: urljoin(
                base_url, feld.find('.story_cover > img')[0].attrs['src']
            ) for feld in felder
        })

    for geschichten_url, titelbild_url in geschichtenseiten.items():
        slug = urlsplit(geschichten_url).path.split('/')[-1]
        print(f"Slug: {slug} -> {titelbild_url}")
        pdf_file = Path(f'{slug}.pdf')
        epub_file = Path(f'{slug}.epub')

        if not pdf_file.exists() or not epub_file.exists():
            geschichte = session.get(geschichten_url)
            geschichte.raise_for_status()

            if not pdf_file.exists():
                urlretrieve(geschichte.html.find('.piwik_download')[0].attrs['href'], filename=pdf_file)

            if not epub_file.exists():
                with TemporaryDirectory() as temp_dir:
                    temp_dir_path = Path(temp_dir)

                    inhalt = geschichte.html.find('.geschichte')[0]
                    titel = inhalt.find('h1')[0].text

                    titelbild = temp_dir_path / 'titelbild.jpg'
                    urlretrieve(quote(titelbild_url, safe=':/'), titelbild)

                    inhalt_als_datei = temp_dir_path / 'geschichte.html'
                    schreibe_geschichte(inhalt_als_datei, inhalt)

                    check_call([
                        'pandoc', inhalt_als_datei,
                        '--output', epub_file,
                        '--metadata', f'title={titel}',
                        '--epub-cover-image', titelbild,
                        '--to', 'epub2',  # Tolino claims the epub3 generated by default is broken.
                    ])
