from .session import Session
from .settings import DEFAULT_ROOT
import datetime as dt
import re
import time
import sys, os
import logging
logger = logging.getLogger(__name__)

ARCHIVE_TEMPLATE = "https://web.archive.org/web/{timestamp}{flag}/{url}"

REMOVAL_PATTERNS = [
    re.compile(b"<!-- BEGIN WAYBACK TOOLBAR INSERT -->.*?<!-- END WAYBACK TOOLBAR INSERT -->", re.DOTALL),
    re.compile(b'<script type="text/javascript" src="/static/js/analytics.js"></script>'),
    re.compile(b'<script type="text/javascript">archive_analytics.values.server_name=[^<]+</script>'),
    re.compile(b'<link type="text/css" rel="stylesheet" href="/static/css/banner-styles.css"/>'),
]

REDIRECT_PATTERNS = [
    re.compile(br'<p [^>]+>Got an HTTP (30\d) response at crawl time</p>'),
    re.compile(br'<title>\s*Internet Archive Wayback Machine\s*</title>'),
    re.compile(br'<a href="([^"]+)">Impatient\?</a>')
]

class Asset(object):
    def __init__(self, original_url, timestamp):
        self.timestamp = timestamp
        self.original_url = original_url

    def get_archive_url(self, raw=False):
        flag = "id_" if raw else ""
        return ARCHIVE_TEMPLATE.format(
            timestamp=self.timestamp,
            url=self.original_url,
            flag=flag,
        )

    def fetch(self,
            session=None,
            raw=False,
            root=DEFAULT_ROOT):

        session = session or Session()
        url = self.get_archive_url(raw)
        res = session.get(url)
        content = res.content
        if content == None: return

        if raw:
            return content
        else:
            rdp = REDIRECT_PATTERNS

            is_js_redirect = sum(re.search(pat, content) != None
                for pat in rdp) == len(rdp)

            if is_js_redirect:
                code = re.search(rdp[0], content).group(1).decode("utf-8")
                loc = DEFAULT_ROOT + re.search(rdp[2], content).group(1).decode("utf-8")
                log_msg = "Encountered {0} redirect to {1}."
                logger.info(log_msg.format(code, loc))
                if session.follow_redirects:
                    content = session.get(loc).content
                else:
                    pass

            if re.search(REMOVAL_PATTERNS[0], content) != None:
                for pat in REMOVAL_PATTERNS:
                    content = re.sub(pat, b"", content)
                if root != "":
                    root_pat = re.compile(('([\'"])(/web/' + self.timestamp + ')').encode("utf-8"))
                    content = re.sub(root_pat, (r"\1" + root + r"\2").encode("utf-8"), content)
            return content
