#  -*- coding: utf-8 -*-

# Copyright 2019 FanFicFare team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

from __future__ import absolute_import
import re
import datetime
import logging
logger = logging.getLogger(__name__)

from .. import exceptions
# py2 vs py3 transition
from ..six import text_type as unicode
from ..six.moves.urllib import parse as urlparse
from ..six.moves.urllib.error import HTTPError

from .base_adapter import BaseSiteAdapter
from ..htmlcleanup import stripHTML

SITE_DOMAIN = 'quotev.com'
STORY_URL_TEMPLATE = 'https://www.quotev.com/story/%s'


def getClass():
    return QuotevComAdapter

class QuotevComAdapter(BaseSiteAdapter):

    def __init__(self, config, url):
        BaseSiteAdapter.__init__(self, config, url)

        story_id = url.split('/')[4]
        self._setURL(STORY_URL_TEMPLATE % story_id)
        self.story.setMetadata('storyId', story_id)
        self.story.setMetadata('siteabbrev', SITE_DOMAIN)

    @staticmethod
    def getSiteDomain():
        return SITE_DOMAIN

    @classmethod
    def getSiteExampleURLs(cls):
        return STORY_URL_TEMPLATE % '1234'

    def getSiteURLPattern(self):
        pattern = re.escape(STORY_URL_TEMPLATE.rsplit('%', 1)[0]) + r'(.+?)($|&|/)'
        pattern = pattern.replace(r'https', r'https?')
        pattern = pattern.replace(r'www\.', r'(www\.)?')
        return pattern

    def use_pagecache(self):
        return True

    def extractChapterUrlsAndMetadata(self):
        try:
            data = self._fetchUrl(self.url)
        except HTTPError as e:
            if e.code == 404:
                raise exceptions.StoryDoesNotExist("Code: %s: %s"%(e.code,self.url))
            else:
                raise #exceptions.FailedToDownload(self.url)

        soup = self.make_soup(data)

        element = soup.find('div', {'class': 'result'})
        if not element:
            raise exceptions.StoryDoesNotExist(self.url)

        title = element.find('h1')
        self.story.setMetadata('title', title.get_text())

        authdiv = soup.find('div', {'class':"quizAuthorList"})
        if authdiv:
            for a in authdiv.find_all('a'):
                self.story.addToList('author', a.get_text())
                self.story.addToList('authorId', a['href'].split('/')[-1])
                self.story.addToList('authorUrl', urlparse.urljoin(self.url, a['href']))
        if not self.story.getList('author'):
            self.story.addToList('author','Anonymous')
            self.story.addToList('authorUrl','https://www.quotev.com')
            self.story.addToList('authorId','0')

        self.setDescription(self.url, soup.find('div', id='qdesct'))
        imgmeta = soup.find('meta',{'property':"og:image" })
        if imgmeta:
            self.coverurl = self.setCoverImage(self.url, urlparse.urljoin(self.url, imgmeta['content']))[1]

        for a in soup.find_all('a', {'href': re.compile('/fiction(/c)?/')}):
            self.story.addToList('category', a.get_text())

        for a in soup.find_all('a', {'href': re.compile('/search/')}):
            self.story.addToList('searchtags', a.get_text())

        elements = soup.find_all('time', {'class': 'q_time'})
        self.story.setMetadata('datePublished', datetime.datetime.fromtimestamp(float(elements[0]['ts'])))
        if len(elements) > 1:
            self.story.setMetadata('dateUpdated', datetime.datetime.fromtimestamp(float(elements[1]['ts'])))

        metadiv = elements[0].parent.parent
        if u'· completed' in stripHTML(metadiv):
            self.story.setMetadata('status', 'Completed')
        else:
            self.story.setMetadata('status', 'In-Progress')

        # pages,readers,reads
        metahtml = unicode(metadiv).replace(u'\n',' ')
        # logger.debug(metahtml)
        for entry in self.getConfigList('extra_valid_entries'):
            # if entry in metahtml:
            #     logger.debug("should find")
            # logger.debug(r".*?([0-9,]+) +%s.*?"%entry)
            m = re.match((r".*?([0-9,]+) +%s.*?"%entry),metahtml)
            if m:
                val = m.group(1)
                # logger.debug(val)
                self.story.setMetadata(entry, val.replace(',', '').replace('.', ''))

        favspans = soup.find('a',{'id':'fav_btn'}).find_all('span')
        if len(favspans) > 1:
            self.story.setMetadata('favorites', stripHTML(favspans[-1]).replace(',', ''))

        commentspans = soup.find('a',{'id':'comment_btn'}).find_all('span')
        #print("commentspans:%s"%commentspans)
        if len(commentspans) > 0:
            self.story.setMetadata('comments', stripHTML(commentspans[0]).replace(',', ''))

        for a in soup.find('div', id='rselect')('a'):
            if 'javascript' not in a['href']:
                self.add_chapter(a.get_text(), urlparse.urljoin(self.url, a['href']))


    def getChapterText(self, url):
        data = self._fetchUrl(url)
        soup = self.make_soup(data)

        rescontent = soup.find('div', id='rescontent')

        # attempt to find and include chapter specific images.
        img = soup.find('div',{'id':'quizHeader'}).find('img')
        #print("img['src'](%s) != self.coverurl(%s)"%(img['src'],self.coverurl))
        if img['src'] != self.coverurl:
            rescontent.insert(0,img)

        for a in rescontent('a'):
            a.unwrap()

        return self.utf8FromSoup(url, rescontent)
