# implements checker for TÜV certificates for marked plentymarkets items

import csv
import random
import time
import urllib

from logging import info

from bs4 import BeautifulSoup

# own imports
from .mailer import Mailer
from ..lib.plentygmz import ElasticExport

REQUESTHEADERS ={
    "Accept": "*/*",
    "User-Agent": "curl/7.88.1"
}

class TUVCertTP:

    def __init__(self, certno):
        self.certno = certno

    def check(self):
        url = (f"https://www.certipedia.com/certificates/"
               f"{self.certno}?locale=de")
        req = urllib.request.Request(url)
        req.headers = REQUESTHEADERS
        info(f"fetching url {url}")
        fp = urllib.request.urlopen(req)
        soup = BeautifulSoup(fp.read().decode('utf-8'), "html.parser")
        certstatus = soup.find_all(class_="certificate-status")
        if certstatus:
            return "Gültiges Zertifikat" in certstatus[0].text
        return False    

    @classmethod
    def from_number(cls, certno):
        if certno.isdecimal() and certno.startswith('5'):
            return cls(certno)


class TUVCertPZ(TUVCertTP):

    def check(self):
        try:
            url = (f"https://www.certipedia.com/quality_marks/{self.certno}"
                   f"?locale=de")
            req = urllib.request.Request(url)
            req.headers = REQUESTHEADERS
            info(f"fetching url {url}")
            fp = urllib.request.urlopen(req)
            soup = BeautifulSoup(fp.read().decode('utf-8'), "html.parser")
            linklist = soup.find("ul", class_="certificate-list")
            certlink = linklist.find("a", class_="tuv-link").attrs['href']
            url = (f"https://www.certipedia.com{certlink}")
            req = urllib.request.Request(url)
            req.headers = REQUESTHEADERS
            info(f"fetching url {url}")
            fp = urllib.request.urlopen(req)
            soup = BeautifulSoup(fp.read().decode('utf-8'), "html.parser")
            certstatus = soup.find_all(class_="certificate-status")
            if certstatus:
                return "Gültiges Zertifikat" in certstatus[0].text
        except Exception as e:
            info(e)
        return False    

    @classmethod
    def from_number(cls, certno):
        if certno.isdecimal() and certno.startswith('1'):
            return cls(certno)


class TUVChecker:
    
    def __init__(self, vidcertno):
        self.certs = {}
        for vid, certno in vidcertno:
            cert = TUVCertTP.from_number(certno)
            if cert:
                self.certs[vid] = cert
                continue
            cert = TUVCertPZ.from_number(certno)
            if cert:
                self.certs[vid] = cert
                continue

    def check(self, vid):
        return self.certs[vid].check()


def cmd_tuvcheck(args):
    ee = ElasticExport.fetch(201)
    vidcertno = ((r['VariationId'] , r['CertNo'].strip()) for r in ee
                 if r['CertNo'])
    tuvchecker = TUVChecker(vidcertno)
    variationids = args.variationids
    if not variationids:
        variationids = tuvchecker.certs.keys()
    for vid in variationids:
        info(f"Checking certificate for {vid} ..")
        certstatus = tuvchecker.check(vid)
        info(f"Certificate check complete for {vid}. Result: {certstatus}")
        # don't hammer server
        if certstatus != True:
            info("Sendung Email .. ")
            Mailer().send_email(
                f"TÜV Zertifikatfehler für VariationId{vid}",
                f"Bitte TÜV Zertifikat für {vid} manuell prüfen!"
            )
        if len(variationids) > 1:
            time.sleep(random.randint(30, 90))

