import datetime,os,re,requests
from bs4 import BeautifulSoup
from collections import Counter
import log,variables

values = ["red","orange","yellow","green","blue","purple","brown","gray","special"]
numbers = ["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20"]

print("Getting list of deck colours")

deckkey = {}

request = requests.get("https://colors-tcg.eu/cards.php?view=alpha")
alldecks = open("key.html","w")
alldecks.write(request.text)
alldecks.close()

# need to correct some html issues

with open("key.html","r") as file:
    filedata = file.read()
filedata = filedata.replace("</td></td>","</td>")
with open("key.html","w") as file:
    file.write(filedata)

with open("key.html") as decks:
    decksoup = BeautifulSoup(decks, "html.parser")
soupdecks = decksoup.find("table",{"id":"colors"})
souprows = soupdecks.find_all("tr")
for row in souprows:
    soupcells = row.find_all("td")
    deckname = soupcells[2].text.lower().replace(" ","").replace("'","").replace("ç","c").replace(".","").replace("politetness","politeness")
    decktype = soupcells[3].text.lower()
    if decktype in values:
        deckkey[deckname] = decktype

print("Parsing log")

cardlist = []
portfolios = []
crayred = 0
crayorange = 0
crayyellow = 0
craygreen = 0
crayblue = 0
craypurple = 0
craybrown = 0
craygrey = 0
tradeout = []
tradein = []
redeemedsketch = 0
coupons = []
datelist = []
logitems = []
pends = []

for event in log.log:
    logentry = {}
    logentry["date"] = event["date"]
    logentry["name"] = event["event"]
    logentry["url"] = event["url"]
    logit = False
    if event["event"] == "portfolio":
        portfolio = {}
        thedecks = {}
        for spacedeck in event["decks"]:
            deck = spacedeck.replace(" ","")
            thedecks[spacedeck] = deckkey[deck]
        portcolours = list(thedecks.values())
        portcolours = sorted(list(dict.fromkeys(portcolours)))
        if len(portcolours) < 3:
            portfolio["type"] = "monochrome"
        else:
            portfolio["type"] = "palette"
        portfolio["decks"] = thedecks
        portfolio["url"] = event["url"]
        portfolios.append(portfolio)
    else:
        try:
            if event["received"]:
                logit = True
                receivedcards = []
                for card in event["received"]:
                    thecard = {}
                    if card[0:4] != "sig_":
                        thedeck = card[:-2]
                    thecard["name"] = card
                    thecard["received"] = event["date"]
                    thecard["mass"] = []
                    if card[0:4] != "sig_":
                        for theme in variables.masscollect:
                            try:
                                if thedeck in variables.masscollect[theme]["decks"]:
                                    thecard["mass"].append(theme)
                            except KeyError:
                                pass
                            try:
                                if card in variables.masscollect[theme]["singles"]:
                                    thecard["mass"].append(theme)
                            except KeyError:
                                pass                
                    if card[0:4] == "sig_":
                        thecard["colour"] = "sig"
                    else:
                        try:
                            thecard["colour"] = deckkey[thedeck]
                        except:
                            pass
                    try:
                        if thecard["colour"]:
                            pass
                    except:
                        print("Warning: no colour found for " + thedeck)
                    if thecard["colour"] == "sig":
                        if card[4:] == variables.name.lower():
                            thecard["priority"] = 5
                        else:
                            thecard["priority"] = 1
                    else:
                        if thedeck in variables.highpriority:
                            thecard["priority"] = 1
                        elif len(thecard["mass"]) > 0:
                            thecard["priority"] = 2
                        else:
                            thecard["priority"] = 4
                    cardlist.append(thecard)
                    datelist.append(event["date"])
                    receivedcards.append(thecard)
                logentry["received"] = receivedcards
        except KeyError:
            pass
        try:
            if event["lost"]:
                logit = True
                lostcards = []
                for card in event["lost"]:
                    checkno = len(cardlist) - 1
                    deleted = False
                    while checkno >= 0:
                        if cardlist[checkno]["name"] == card:
                            if deleted == False:
                                colour = cardlist[checkno]["colour"]
                                cardlist.remove(cardlist[checkno])
                                deleted = True
                        checkno -= 1
                    if deleted == False:
                        print("Warning: trying to remove " + card + " but none found")
                    lostcard = {}
                    lostcard["name"] = card
                    lostcard["colour"] = colour
                    lostcards.append(lostcard)
                    datelist.remove(datelist[-1])
                logentry["lost"] = lostcards
        except KeyError:
            pass
        crayons = {}
        try:
            crayred += event["crayons"]["red"]
            logit = True
            crayons["red"] = event["crayons"]["red"]
        except:
            pass
        try:
            crayorange += event["crayons"]["orange"]
            logit = True
            crayons["orange"] = event["crayons"]["orange"]
        except:
            pass
        try:
            crayyellow += event["crayons"]["yellow"]
            logit = True
            crayons["yellow"] = event["crayons"]["yellow"]
        except:
            pass
        try:
            craygreen += event["crayons"]["green"]
            logit = True
            crayons["green"] = event["crayons"]["green"]
        except:
            pass
        try:
            crayblue += event["crayons"]["blue"]
            logit = True
            crayons["blue"] = event["crayons"]["blue"]
        except:
            pass
        try:
            craypurple += event["crayons"]["purple"]
            logit = True
            crayons["purple"] = event["crayons"]["purple"]
        except:
            pass
        try:
            craybrown += event["crayons"]["brown"]
            logit = True
            crayons["brown"] = event["crayons"]["brown"]
        except:
            pass
        try:
            craygrey += event["crayons"]["gray"]
            logit = True
            crayons["grey"] = event["crayons"]["gray"]
        except:
            pass
        if len(crayons) > 0:
            logentry["crayons"] = crayons
        if event["event"][0:11] == "trade with ":
            try:
                for card in event["lost"]:
                    tradeout.append(event["event"])
            except:
                pass
            try:
                for card in event["received"]:
                    tradein.append(event["event"])
            except:
                pass
        if len(crayons) > 0:
            logentry["crayons"] = crayons
        try:
            redeemedsketch -= event["sketch"]
        except:
            pass
        try:
            for newcoupon in event["coupons"]:
                found = False
                for oldcoupon in coupons:
                    if found == False:
                        if newcoupon == list(oldcoupon.keys())[0]:
                            found = True
                            oldcoupon[newcoupon] += event["coupons"][newcoupon]
                if found == False:
                    coupons.append({newcoupon:event["coupons"][newcoupon]})
        except:
            pass
        try:
            for card in event["pend"]:
                pends.append(card)
        except:
            pass
        try:
            for card in event["unpend"]:
                pends.remove(card)
        except:
            pass
        if logit == True:
            logitems.append(logentry)

logitems = logitems[::-1]
coupons = coupons[::-1]

print("Getting list of owned decks")

portdecks = []

for portfolio in portfolios:
    oneportdecks = list(portfolio["decks"].keys())
    for deck in oneportdecks:
        portdecks.append(deck.replace(" ",""))

portdecks = sorted(list(dict.fromkeys(portdecks)))

decks = []

for card in cardlist:
    if card["colour"] != "sig":
        deck = card["name"][:-2]
        decks.append(deck)

decks = sorted(list(dict.fromkeys(decks)))

decklist = []

for deck in decks:
    thedeck = {}
    thedeck["name"] = deck
    thedeck["colour"] = deckkey[deck]
    thedeck["mass"] = []
    thedeck["massmaster"] = []
    for theme in variables.masscollect:
        try:
            if deck in variables.masscollect[theme]["decks"]:
                thedeck["mass"].append(theme)
        except KeyError:
            pass
        try:
            if deck in variables.masscollect[theme]["masters"]:
                thedeck["massmaster"].append(theme)
        except KeyError:
            pass
    count = 0
    for number in numbers:
        thedeck[number] = None
        for card in cardlist:
            if card["name"] == deck + number:
                if thedeck[number] == None:
                    thedeck[number] = card["received"]
                    count += 1
    thedeck["count"] = count
    if count == 20:
        dates = []
        for number in numbers:
            dates.append(thedeck[number])
        dates = sorted(dates)
        thedeck["mastered"] = dates[-1]
    else:
        thedeck["mastered"] = False
    if deck in variables.highpriority or count >= variables.highthreshold or deck in portdecks:
        thedeck["priority"] = 1
    elif len(thedeck["mass"]) > 0 or count >= variables.mediumthreshold:
        thedeck["priority"] = 2
    elif count >= variables.collectthreshold:
        thedeck["priority"] = 3
    else:
        thedeck["priority"] = 4
    decklist.append(thedeck)

print("Checking for new card images")

for card in cardlist:
    if card["colour"] == "sig":
        if not os.path.exists("build/decks/sigs/" + card["name"][4:] + ".gif"):
            print("Downloading " + card["name"])
            r = requests.get("https://colors-tcg.eu/cards/" + card["name"] + ".gif")
            open("build/decks/sigs/" + card["name"][4:] + ".gif","wb").write(r.content)

for deck in decklist:
    if not os.path.isdir("build/decks/" + deck["name"]):
        os.mkdir("build/decks/" + deck["name"])
        print("Downloading " + deck["name"])
        number = 0
        while number < 21:
            if number < 10:
                r = requests.get("https://colors-tcg.eu/cards/" + deck["name"] + "0" + str(number) + ".gif")
                open("build/decks/" + deck["name"] + "/0" + str(number) + ".gif","wb").write(r.content)
            else:
                r = requests.get("https://colors-tcg.eu/cards/" + deck["name"] + str(number) + ".gif")
                open("build/decks/" + deck["name"] + "/" + str(number) + ".gif","wb").write(r.content)
            number += 1
        master = requests.get("https://colors-tcg.eu/cards/" + deck["name"] + "master.gif")
        open("build/decks/" + deck["name"] + "/master.gif","wb").write(master.content)

print("Getting list of wanted cards")

wantedlist = []

for deck in decklist:
    if deck["priority"] < 4:
        for number in numbers:
            if deck[number] == None:
                wantedcard = {}
                wantedcard["name"] = deck["name"] + number
                wantedcard["colour"] = deck["colour"]
                wantedcard["priority"] = deck["priority"]
                wantedlist.append(wantedcard)

decknames = []
for deck in decklist:
    decknames.append(deck["name"])

cardnames = []
for card in cardlist:
    cardnames.append(card["name"])

for theme in variables.masscollect:
    if variables.masscollect[theme]["full"] == True:
        try:
            for deck in variables.masscollect[theme]["decks"]:
                if deck not in decknames:
                    for number in numbers:
                        wantedcard = {}
                        wantedcard["name"] = deck + number
                        wantedcard["colour"] = deckkey[deck]
                        wantedcard["priority"] = 3
                        wantedlist.append(wantedcard)
        except KeyError:
            pass
        try:
            for card in variables.masscollect[theme]["singles"]:
                if card not in cardnames:
                    wantedcard = {}
                    wantedcard["name"] = card
                    wantedcard["colour"] = deckkey[card[:-2]]
                    wantedcard["priority"] = 3
                    wantedlist.append(wantedcard)
        except KeyError:
            pass

wantedlist = sorted(wantedlist, key=lambda d: d["name"])

removelist = []
        
for card in wantedlist:
    if card["name"] in pends:
        removelist.append(card)

for card in removelist:
    wantedlist.remove(card)

print("Adjusting card priorities")

for card in cardlist:
    for deck in decklist:
        if card["name"][:-2] == deck["name"]:
            if card["priority"] > deck["priority"]:
                card["priority"] = deck["priority"]

cardlist = sorted(cardlist, key=lambda d: d["name"])

theindex = 0
for card in cardlist:
    card["dupe"] = False
    if card["name"][0:4] != "sig_":
        if theindex > 0:
            if card["name"] == cardlist[theindex-1]["name"]:
                card["priority"] = 4
                card["dupe"] = True
    theindex += 1

theindex = 0
if variables.keepsig == True:
    for card in cardlist:
        if card["name"] == "sig_" + variables.name.lower():
            card["priority"] = 1
            if theindex > 0:
                if cardlist[theindex-1]["name"] == "sig_" + variables.name.lower():
                    card["priority"] = 5
    theindex += 1

# core functions

def headerwrite(thefile,pagename):
    header = open(thefile,"a")
    header.write("<!DOCTYPE html>\n<html lang=\"en\" style=\"--headbg:" + variables.headerbackground + ";\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <link rel=\"stylesheet\" href=\"/style.css\">\n    <link rel=\"stylesheet\" href=\"/user.css\">\n    <meta name=\"theme-color\" content=\"" + variables.headerbackground + "\">\n    <title>" + variables.name + "’s card collection :: " + pagename + "</title>\n  </head>\n  <body class=\"" + pagename + "\">\n    <aside>\n      \n    </aside>\n    <nav>\n      <ul>\n        <li>")
    if pagename == "index":
        header.write("home")
    else:
        header.write("<a href=\"/\">home</a>")
    header.write("</li>\n        <li>")
    if pagename == "collecting":
        header.write("collecting")
    else:
        header.write("<a href=\"/collecting\">collecting</a>")
    header.write("</li>\n        <li>")
    if pagename == "mass":
        header.write("mass collecting")
    else:
        header.write("<a href=\"/mass\">mass collecting</a>")
    header.write("</li>\n        <li>")
    if pagename == "mastered":
        header.write("mastered")
    else:
        header.write("<a href=\"/mastered\">mastered</a>")
    header.write("</li>\n")
    if variables.ownedpage:
        header.write("        <li>")
        if pagename == "owned":
            header.write("owned")
        else:
            header.write("<a href=\"/owned\">owned</a>")
        header.write("</li>\n")
    header.write("        <li>")
    if pagename == "trade":
        header.write("trading")
    else:
        header.write("<a href=\"/trade\">trading</a>")
    header.write("</li>\n        <li>")
    if pagename == "wanted":
        header.write("wanted")
    else:
        header.write("<a href=\"/wanted\">wanted</a>")
    header.write("</li>\n        <li>")
    if pagename == "search":
        header.write("search")
    else:
        header.write("<a href=\"/search\">search</a>")
    header.write("</li>\n        <li>")
    if pagename == "log":
        header.write("log")
    else:
        header.write("<a href=\"/log\">log</a>")
    header.write("</li>\n        <li><a href=\"" + variables.tradepost + "\" target=\"_blank\">trade post @ dw</a></li>\n      <li><a href=\"https://colors-tcg.eu/services.php\" target=\"_blank\">service links</a></li>\n      </ul>\n    </nav>\n    <main>\n")
    header.close()

def footerwrite(thefile):
    footer = open(thefile,"a")
    footer.write("    </main>\n  </body>\n</html>")
    footer.close()

def printcard(card):
    if type(card) == dict:
        if card["colour"] == "sig":
            return "<img src=\"/decks/sigs/" + card["name"][4:] + ".gif\" title=\"" + card["name"] + "\" loading=\"lazy\">"
        else:
            deck = card["name"][:-2]
            cardid = card["name"][-2:]
            return "<img src=\"/decks/" + deck + "/" + cardid + ".gif\" title=\"" + card["name"] + "\" loading=\"lazy\">"
    elif type(card) == str:
        if card[0:4] == "sig_":
            return "<img src=\"/decks/sigs/" + card[4:] + ".gif\" title=\"" + card + "\" loading=\"lazy\">"
        else:
            deck = card[:-2]
            cardid = card[-2:]
            return "<img src=\"/decks/" + deck + "/" + cardid + ".gif\" title=\"" + card + "\" loading=\"lazy\">"

def cardtext(card):
    cardtext = "<span class=\"cardname\">"
    if card["colour"] == "sig":
        cardtext += "<span title=\"signature\">✍</span>" + card["name"] + "</span>"
    else:
        if card["colour"] == "red":
            cardtext += "<span title=\"red\">🔴</span>"
        elif card["colour"] == "orange":
            cardtext += "<span title=\"orange\">🟠</span>"
        elif card["colour"] == "yellow":
            cardtext += "<span title=\"yellow\">🟡</span>"
        elif card["colour"] == "green":
            cardtext += "<span title=\"green\">🟢</span>"
        elif card["colour"] == "blue":
            cardtext += "<span title=\"blue\">🔵</span>"
        elif card["colour"] == "purple":
            cardtext += "<span title=\"purple\">🟣</span>"
        elif card["colour"] == "brown":
            cardtext += "<span title=\"brown\">🟤</span>"
        elif card["colour"] == "gray":
            cardtext += "<span title=\""
            if variables.british:
                cardtext += "grey"
            else:
                cardtext += "gray"
            cardtext += "\">⚪</span>"
        elif card["colour"] == "special":
            cardtext += "<span title=\"special\">✨</span>"
        cardtext += card["name"] + "</span>"
    return cardtext

def portfoliogen(theportfolio,thetype,portnumber):
    if thetype == "palette":
        portstring = "<table class=\"palette portfolio\">\n<tbody>\n<tr>\n<td colspan=\"2\">" + variables.name.lower() + "</td>\n</tr>\n<tr>\n<td class=\"deck1\">"        
        try:
            reddeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("red")]
            for deck in decklist:
                if deck["name"] == reddeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + reddeck
        except:
            specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")]
            for deck in decklist:
                if deck["name"] == specialdeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + specialdeck
        portstring += "</td>\n<td class=\"deck5\">"
        try:
            bluedeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("blue")]
            for deck in decklist:
                if deck["name"] == bluedeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + bluedeck
        except:
            specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")]
            for deck in decklist:
                if deck["name"] == specialdeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + specialdeck
        portstring += "</td>\n</tr>\n<tr>\n<td class=\"deck2\">"
        try:
            orangedeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("orange")]
            for deck in decklist:
                if deck["name"] == orangedeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + orangedeck
        except:
            specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")]
            for deck in decklist:
                if deck["name"] == specialdeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + specialdeck
        portstring += "</td>\n<td class=\"deck6\">"
        try:
            purpledeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("purple")]
            for deck in decklist:
                if deck["name"] == purpledeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + purpledeck
        except:
            specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")]
            for deck in decklist:
                if deck["name"] == specialdeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + specialdeck
        portstring += "</td>\n</tr>\n<tr>\n<td class=\"deck3\">"
        try:
            yellowdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("yellow")]
            for deck in decklist:
                if deck["name"] == yellowdeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + yellowdeck
        except:
            specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")]
            for deck in decklist:
                if deck["name"] == specialdeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + specialdeck
        portstring += "</td>\n<td class=\"deck7\">"
        try:
            browndeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("brown")]
            for deck in decklist:
                if deck["name"] == browndeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + browndeck
        except:
            specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")]
            for deck in decklist:
                if deck["name"] == specialdeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + specialdeck
        portstring += "</td>\n</tr>\n<tr>\n<td class=\"deck4\">"
        try:
            greendeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("green")]
            for deck in decklist:
                if deck["name"] == greendeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + greendeck
        except:
            specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")]
            for deck in decklist:
                if deck["name"] == specialdeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + specialdeck
        portstring += "</td>\n<td class=\"deck8\">"
        try:
            greydeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("gray")]
            for deck in decklist:
                if deck["name"] == greydeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + greydeck
        except:
            specialdeck = list(theportfolio["decks"].keys())[list(theportfolio["decks"].values()).index("special")]
            for deck in decklist:
                if deck["name"] == specialdeck.replace(" ",""):
                    if deck["mastered"]:
                        portstring += "■"
                    else:
                        portstring += "□"
                    break
            portstring += " " + specialdeck
        portstring += "</td>\n</tr>\n<tr>\n<td colspan=\"2\"><a href=\"" + theportfolio["url"] + "\">palette portfolio "
        if portnumber < 10:
            portstring += "0" + str(portnumber)
        else:
            portstring += str(portnumber)
        portstring += "</a></td>\n</tr>\n</tbody>\n</table>\n"
    elif thetype == "monochrome":
        thecolour = list(theportfolio["decks"].values())[0]
        portstring = "<table class=\"" + thecolour + " portfolio\">\n<tbody>\n<tr>\n<td colspan=\"2\">" + variables.name.lower() + "</td>\n</tr>\n<tr>\n<td class=\"deck1\">"
        thedecks = sorted(list(theportfolio["decks"].keys()))
        for deck in decklist:
            if deck["name"] == thedecks[0].replace(" ",""):
                if deck["mastered"]:
                    portstring += "■"
                else:
                    portstring += "□"
                break
        portstring += " " + thedecks[0] + "</td>\n<td class=\"deck5\">"
        for deck in decklist:
            if deck["name"] == thedecks[4].replace(" ",""):
                if deck["mastered"]:
                    portstring += "■"
                else:
                    portstring += "□"
                break
        portstring += " " + thedecks[4] + "</td>\n</tr>\n<tr>\n<td class=\"deck2\">"
        for deck in decklist:
            if deck["name"] == thedecks[1].replace(" ",""):
                if deck["mastered"]:
                    portstring += "■"
                else:
                    portstring += "□"
                break
        portstring += " " + thedecks[1] + "</td>\n<td class=\"deck6\">"
        for deck in decklist:
            if deck["name"] == thedecks[5].replace(" ",""):
                if deck["mastered"]:
                    portstring += "■"
                else:
                    portstring += "□"
                break
        portstring += " " + thedecks[5] + "</td>\n</tr>\n<tr>\n<td class=\"deck3\">"
        for deck in decklist:
            if deck["name"] == thedecks[2].replace(" ",""):
                if deck["mastered"]:
                    portstring += "■"
                else:
                    portstring += "□"
                break
        portstring += " " + thedecks[2] + "</td>\n<td class=\"deck7\">"
        for deck in decklist:
            if deck["name"] == thedecks[6].replace(" ",""):
                if deck["mastered"]:
                    portstring += "■"
                else:
                    portstring += "□"
                break
        portstring += " " + thedecks[6] + "</td>\n</tr>\n<tr>\n<td class=\"deck4\">"
        for deck in decklist:
            if deck["name"] == thedecks[3].replace(" ",""):
                if deck["mastered"]:
                    portstring += "■"
                else:
                    portstring += "□"
                break
        portstring += " " + thedecks[3] + "</td>\n<td class=\"deck8\">"
        for deck in decklist:
            if deck["name"] == thedecks[7].replace(" ",""):
                if deck["mastered"]:
                    portstring += "■"
                else:
                    portstring += "□"
                break
        portstring += " " + thedecks[7] + "</td>\n</tr>\n<tr>\n<td colspan=\"2\"><a href=\"" + theportfolio["url"] + "\">monochrome portfolio "
        if portnumber < 10:
            portstring += "0" + str(portnumber)
        else:
            portstring += str(portnumber)
        portstring += "</a></td>\n</tr>\n</tbody>\n</table>\n"
    return portstring

portfoliosearch = len(portfolios)
latestpalette = 0
latestmonochrome = 0
palettes = 0
monochromes = 0
while portfoliosearch > 0:
    if portfolios[portfoliosearch-1]["type"] == "palette":
        palettes += 1
        if latestpalette == 0:
            latestpalette = portfoliosearch
    if portfolios[portfoliosearch-1]["type"] == "monochrome":
        monochromes += 1
        if latestmonochrome == 0:
            latestmonochrome = portfoliosearch
    portfoliosearch -= 1

def filterwrite(page,colour=False,sigs=False):
    filterstring = "<p class=\"typefilter\">"
    if colour:
        filterstring += "Filtered to <span class=\"" + colour + "\"><b>"
        if colour == "gray":
            if variables.british:
                filterstring += "grey"
            else:
                filterstring += "gray"
        else:
            filterstring += colour
        filterstring += "</b></span>. <a href=\"/" + page + "\">Show all</a>"
    else:
        filterstring += "Filter: <a href=\"/" + page + "/red\" title=\"red\">🔴</a> <a href=\"/" + page + "/orange\" title=\"orange\">🟠</a> <a href=\"/" + page + "/yellow\" title=\"yellow\">🟡</a> <a href=\"/" + page + "/green\" title=\"green\">🟢</a> <a href=\"/" + page + "/blue\" title=\"blue\">🔵</a> <a href=\"/" + page + "/purple\" title=\"purple\">🟣</a> <a href=\"/" + page + "/brown\" title=\"brown\">🟤</a> <a href=\"/" + page + "/gray\" title=\""
        if variables.british:
            filterstring += "grey"
        else:
            filterstring += "gray"
        filterstring += "\">⚪</a> <a href=\"/" + page + "/special\" title=\"special\">✨</a>"
        if sigs:
            filterstring += " <a href=\"/" + page + "/sig\" title=\"sig\">✍</a>"
    filterstring += "</p>\n"
    return filterstring

def printdeck(deck,fold=True):
    if fold:
        deckstring = "<details class=\"deckwrap\">\n<summary>" + deck["name"] + " ["
        if deck["mastered"]:
            deckstring += deck["mastered"].strftime("%Y-%m-%d")
        else:
            deckstring += str(deck["count"]) + "/20"
        deckstring += "]</summary>\n"
    else:
        deckstring = ""
    deckstring += "<table class=\"decktable " + deck["colour"] + "\">\n"
    if not fold:
        deckstring += "<thead>\n  <tr>\n    <th colspan=\"5\">" + deck["name"] + " ["
        if deck["mastered"]:
            deckstring += deck["mastered"].strftime("%Y-%m-%d")
        else:
            deckstring += str(deck["count"]) + "/20"
        deckstring += "]</th>\n  </tr>\n</thead>\n"
    deckstring += "<tbody>\n"
    test = 1
    while test < 21:
        if test % 5 == 1:
            deckstring += "  <tr>\n"
        deckstring += "    <td>"
        if test < 10:
            teststring = "0" + str(test)
        else:
            teststring = str(test)
        found = False
        for card in cardlist:
            if card["name"] == deck["name"] + teststring:
                deckstring += printcard(card)
                found = True
                break
        if found == False:
            deckstring += "<img src=\"/decks/" + deck["name"] + "/00.gif\" loading=\"lazy\">"
            if deck["name"] + teststring in pends:
                deckstring += "<p class=\"pending\">pending</p>"
        deckstring += "</td>\n"
        if test % 5 == 0:
            deckstring += "  </tr>\n"
        test += 1
    if deck["mastered"]:
        deckstring += "  <tr>\n    <td colspan=\"5\" align=\"center\"><img src=\"/decks/" + deck["name"] + "/master.gif\" title=\"mastered " + deck["name"]
        try:
            if deck["name"] in variables.firstmasteries:
                deckstring += " (first)\" class=\"first"
        except:
            pass
        deckstring += "\"><td>\n</tr>\n"
    deckstring += "</tbody>\n</table>\n"
    if fold:
        deckstring += "</details>\n"
    return deckstring

def crayonlog(colour,event):
    crayonno = event["crayons"][colour]
    if variables.british:
        if colour == "grey":
            crayonrend = "grey"
        else:
            crayonrend = colour
    else:
        crayonrend = colour
    if crayonno > 0:
        crayonstring = "+" + str(crayonno) + " " + crayonrend
    else:
        crayonstring = str(crayonno) + " " + crayonrend
    return crayonstring

def showdupes():
    dupeslist = []
    previouscard = ""
    for card in cardlist:
        try:
            if card["name"] == previouscard["name"]:
                dupeslist.append(card["name"])
        except:
            pass
        previouscard = card
    return dupeslist

if __name__ == "__main__":
    print("Building index page")

def indexgen():
    if os.path.exists("build/index.html"):
        os.remove("build/index.html")
    thefile = "build/index.html"
    headerwrite(thefile,"index")
    content = open(thefile,"a")
    firstdate = log.log[0]["date"]
    if len(cardlist) > 14400:
        rankcode = "rainbow"
        extra = len(cardlist) - 14400
        plusranks = int(extra / 300)
        if plusranks > 0:
            rank = "rainbow + " + str(plusranks)
        else:
            rank = "rainbow"
    else:
        if len(cardlist) > 14100:
            rank = "himalayan"
        elif len(cardlist) > 13800:
            rank = "puma"
        elif len(cardlist) > 13500:
            rank = "chartreux"
        elif len(cardlist) > 13500:
            rank = "russian blue"
        elif len(cardlist) > 12900:
            rank = "panther"
        elif len(cardlist) > 12600:
            rank = "cheetah"
        elif len(cardlist) > 12300:
            rank = "tiger"
        elif len(cardlist) > 12000:
            rank = "lion"
        elif len(cardlist) > 11700:
            rank = "metal"
        elif len(cardlist) > 11400:
            rank = "ground"
        elif len(cardlist) > 11100:
            rank = "darkness"
        elif len(cardlist) > 10800:
            rank = "water"
        elif len(cardlist) > 10500:
            rank = "nature"
        elif len(cardlist) > 10200:
            rank = "light"
        elif len(cardlist) > 9900:
            rank = "wind"
        elif len(cardlist) > 9600:
            rank = "fire"
        elif len(cardlist) > 9300:
            rank = "mercury"
        elif len(cardlist) > 9000:
            rank = "jupiter"
        elif len(cardlist) > 8700:
            rank = "uranus"
        elif len(cardlist) > 8400:
            rank = "neptune"
        elif len(cardlist) > 8100:
            rank = "earth"
        elif len(cardlist) > 7800:
            rank = "venus"
        elif len(cardlist) > 7500:
            rank = "saturn"
        elif len(cardlist) > 7200:
            rank = "mars"
        elif len(cardlist) > 6900:
            rank = "magnolia"
        elif len(cardlist) > 6600:
            rank = "chocolate cosmos"
        elif len(cardlist) > 6300:
            rank = "lilac"
        elif len(cardlist) > 6000:
            rank = "hydrangea"
        elif len(cardlist) > 5700:
            rank = "clover"
        elif len(cardlist) > 5400:
            rank = "daffodil"
        elif len(cardlist) > 5100:
            rank = "tiger lily"
        elif len(cardlist) > 4800:
            rank = "sakura"
        elif len(cardlist) > 4500:
            rank = "silver"
        elif len(cardlist) > 4200:
            rank = "bronze"
        elif len(cardlist) > 3900:
            rank = "amethyst"
        elif len(cardlist) > 3600:
            rank = "sapphire"
        elif len(cardlist) > 3300:
            rank = "emerald"
        elif len(cardlist) > 3000:
            rank = "gold"
        elif len(cardlist) > 2700:
            rank = "amber"
        elif len(cardlist) > 2400:
            rank = "ruby"
        elif len(cardlist) > 2200:
            rank = "dragon fruit"
        elif len(cardlist) > 2000:
            rank = "apricot"
        elif len(cardlist) > 1800:
            rank = "grape"
        elif len(cardlist) > 1600:
            rank = "blueberry"
        elif len(cardlist) > 1400:
            rank = "lime"
        elif len(cardlist) > 1200:
            rank = "lemon"
        elif len(cardlist) > 1000:
            rank = "tangerine"
        elif len(cardlist) > 800:
            rank = "strawberry"
        elif len(cardlist) > 700:
            rank = "gray"
        elif len(cardlist) > 600:
            rank = "brown"
        elif len(cardlist) > 500:
            rank = "purple"
        elif len(cardlist) > 400:
            rank = "blue"
        elif len(cardlist) > 300:
            rank = "green"
        elif len(cardlist) > 200:
            rank = "yellow"
        elif len(cardlist) > 100:
            rank = "orange"
        else:
            rank = "red"
        rankcode = re.sub(" ","",rank)
    content.write("<a href=\"/levels\"><img src=\"/assets/levels/" + rankcode + ".gif\"></a><img src=\"/decks/sigs/" + variables.name.lower() + ".gif\" loading=\"lazy\">\n<ul>\n<li>player name: <span class=\"name\">" + variables.name + "</span></li>\n<li>" + str(len(cardlist)) + " cards held <span class=\"rank " + rank + "\">(" + rank + ")</span></li>\n<li>started <code>" + firstdate.strftime("%Y-%m-%d") + "</code></li>\n<li>last updated <code>" + datetime.datetime.today().strftime("%Y-%m-%d") + "</code></li>\n<li><a href=\"https://git.praze.net/tre/tcg\" target=\"_blank\">code</a> under construction</li>\n")
    if len(variables.misclink["text"]) > 0:
        content.write("<li><a href=\"" + variables.misclink["link"] + "\">" + variables.misclink["text"] + "</a></li>\n")
    content.write("</ul>\n")
    if crayred + crayorange + crayyellow + craygreen + crayblue + craypurple + craybrown + craygrey > 0:
        content.write("<table id=\"crayontable\">\n<tbody>\n<tr>\n")
        if crayred > 0:
            content.write("<td class=\"red\"><img src=\"/assets/crayons/crayon1.gif\" class=\"crayon\" title=\"red\"> × " + str(crayred) + "</td>\n")
        if crayorange > 0:
            content.write("<td class=\"orange\"><img src=\"/assets/crayons/crayon2.gif\" class=\"crayon\" title=\"orange\"> × " + str(crayorange) + "</td>\n")
        if crayyellow > 0:
            content.write("<td class=\"yellow\"><img src=\"/assets/crayons/crayon3.gif\" class=\"crayon\" title=\"yellow\"> × " + str(crayyellow) + "</td>\n")
        if craygreen > 0:
            content.write("<td class=\"green\"><img src=\"/assets/crayons/crayon4.gif\" class=\"crayon\" title=\"green\"> × " + str(craygreen) + "</td>\n")
        if crayblue > 0:
            content.write("<td class=\"blue\"><img src=\"/assets/crayons/crayon5.gif\" class=\"crayon\" title=\"blue\"> × " + str(crayblue) + "</td>\n")
        if craypurple > 0:
            content.write("<td class=\"purple\"><img src=\"/assets/crayons/crayon6.gif\" class=\"crayon\" title=\"purple\"> × " + str(craypurple) + "</td>\n")
        if craybrown > 0:
            content.write("<td class=\"brown\"><img src=\"/assets/crayons/crayon7.gif\" class=\"crayon\" title=\"brown\"> × " + str(craybrown) + "</td>\n")
        if craygrey > 0:
            content.write("<td class=\"grey\"><img src=\"/assets/crayons/crayon8.gif\" class=\"crayon\" title=\"")
            if variables.british:
                content.write("grey")
            else:
                content.write("gray")
            content.write("\"> × " + str(craygrey) + "</td>\n")
        content.write("</tr>\n</tbody>\n</table>\n")
    tradecommon = list((Counter(tradeout) & Counter(tradein)).elements())
    sketch = len(tradecommon)
    if sketch > 0:
        content.write("<table class=\"sketchpads\">\n<tbody>\n<tr>\n<td><img src=\"/assets/sketch/")
        if sketch % 20 < 10:
            content.write("0" + str(sketch % 20))
        else:
            content.write(str(sketch % 20))
        content.write(".gif\"></td>\n")
        if sketch > 19:
            content.write("<td><img src=\"/assets/sketch/20.gif\" title=\"")
            sketchdifference = int(sketch / 20) - redeemedsketch
            if sketchdifference > 0:
                content.write(str(sketchdifference) + " to turn in")
            else:
                content.write("all turned in")
            content.write("\"></td>\n")
        content.write("</tr>\n<tr>\n<td align=\"center\">" + str(sketch % 20) + "/20</td>\n")
        if sketch > 19:
            content.write("<td align=\"center\">" + str(int(sketch / 20)) + " completed</td>\n")
        content.write("</tr>\n</tbody>\n</table>")
    if latestpalette + latestmonochrome > 0:
        content.write("<a href=\"/portfolios\">\n<div class=\"foliocase\">\n")
        if latestpalette > 0:
            content.write(portfoliogen(portfolios[latestpalette-1],"palette",palettes))
        if latestmonochrome > 0:
            content.write(portfoliogen(portfolios[latestmonochrome-1],"monochrome",monochromes))
        content.write("</div>\n</a>\n")
    decksofinterest = []
    mastereddecks = []
    for deck in decklist:
        if deck["mastered"]:
            mastereddecks.append(deck)
    mastereddecks = sorted(mastereddecks,key=lambda d: d["mastered"],reverse=True)
    if len(mastereddecks) > 0:
        content.write("<h2>mastered decks</h2>\n<p id=\"masteredcarousel\">")
        masteredcount = 0
        for deck in mastereddecks:
            if masteredcount < variables.maxmastered:
                content.write("<img src=\"/decks/" + deck["name"] + "/master.gif\" title=\"mastered " + deck["name"])
                try:
                    if deck["name"] in variables.firstmasteries:
                        content.write(" (first)\" class=\"first")
                except:
                    pass
                content.write("\">")
            masteredcount += 1
        if len(mastereddecks) > variables.maxmastered:
            content.write(" <a href=\"mastered\">see&nbsp;all</a>")
        content.write("</p>\n")
    sigs = []
    for card in cardlist:
        if card["name"][0:4] == "sig_":
            sigs.append(card)
    if len(sigs) > 0:
        content.write("<h2>signatures</h2>\n<p>")
        for card in sigs:
            content.write(printcard(card))
        content.write("</p>\n")
    if len(variables.faves) > 0:
        content.write("<h2>faves</h2>\n<p>")
        faveslist = sorted(variables.faves)
        for card in faveslist:
            content.write(printcard(card))
        content.write("</p>\n")
    if len(coupons) > 0:
        content.write("<h2>coupons</h2>\n<p>")
        for coupon in coupons:
            for key,value in coupon.items():
                content.write("<img src=\"/assets/coupons/" + key + ".png\" class=\"coupon")
                if value == 0:
                    content.write(" expired\" title=\"expired\"")
                else:
                    content.write("\" title=\"" + str(value) + " left\"")
                content.write(" loading=\"lazy\">")
        content.write("</p>\n")
    donations = []
    try:
        for donatedeck in variables.donations["decks"]:
            donation = {}
            donation["name"] = donatedeck
            for deck in decklist:
                if deck["name"] == donatedeck:
                    if deck["mastered"]:
                        donation["type"] = "mastered"
                    else:
                        donation["type"] = "deck"
                    break
            donations.append(donation)
    except:
        pass
    try:
        for card in variables.donations["scrapbook"]:
            donation = {}
            donation["name"] = card
            donation["type"] = "single"
            donations.append(donation)
    except:
        pass
    if len(donations) > 0:
        donations = sorted(donations, key=lambda d: d["name"])
        content.write("<h2>donations</h2>\n<p>")
        for donation in donations:
            if donation["type"] == "deck":
                content.write("<img src=\"/decks/" + donation["name"] + "/00.gif\" loading=\"lazy\">")
            elif donation["type"] == "mastered":
                content.write("<img src=\"/decks/" + donation["name"] + "/master.gif\" title=\"mastered " + donation["name"])
                try:
                    if donation["name"] in variables.firstmasteries:
                        content.write(" (first)\" class=\"first")
                except:
                    pass
                content.write("\">")
            elif donation["type"] == "single":
                content.write(printcard(donation["name"]))
        content.write("</p>\n")
    content.close()
    footerwrite(thefile)

if __name__ == "__main__":
    indexgen()
    print("Building levels page")

def levelsgen():
    if not os.path.isdir("build/levels"):
        os.mkdir("build/levels")
    if os.path.exists("build/levels/index.html"):
        os.remove("build/levels/index.html")
    thefile = "build/levels/index.html"
    headerwrite(thefile,"levels")
    content = open(thefile,"a")
    content.write("<h1>levels</h1>\n<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/red.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[0].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/orange.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/yellow.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/green.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/blue.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/purple.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/brown.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/gray.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/strawberry.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/tangerine.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/lemon.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/lime.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/blueberry.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/grape.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[1800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/apricot.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[2000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/dragonfruit.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[2200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/ruby.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[2400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/amber.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[2700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/gold.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[3000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/emerald.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[3300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/sapphire.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[3600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/amethyst.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[3900].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/bronze.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[4200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/silver.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[4500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/sakura.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[4800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/tigerlily.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[5100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/daffodil.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[5400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/clover.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[5700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/hydrangea.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[6000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/lilac.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[6300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/chocolatecosmos.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[6600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/magnolia.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[6900].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/mars.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[7200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/saturn.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[7500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/venus.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[7800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/earth.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[8100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/neptune.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[8400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/uranus.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[8700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/jupiter.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[9000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/mercury.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[9300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/fire.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[9600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/wind.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[9900].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/light.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[10200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/nature.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[10500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/water.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[10800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/darkness.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[11100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/ground.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[11400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/metal.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[11700].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/lion.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[12000].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/tiger.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[12300].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/cheetah.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[12600].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/panther.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[12900].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/russianblue.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[13200].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/chartreux.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[13500].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/puma.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[13800].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/himalayan.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[14100].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    try:
        content.write("<table class=\"level\">\n<tbody>\n<tr>\n<td align=\"center\"><img src=\"/assets/levels/rainbow.gif\" loading=\"lazy\"></td>\n</tr>\n<tr>\n<td align=\"center\"><code>" + datelist[14400].strftime("%Y-%m-%d") + "</code></td>\n</tr>\n</tbody>\n</table>\n")
    except:
        pass
    content.close()
    footerwrite(thefile)

if __name__ == "__main__":
    levelsgen()
    print("Building portfolios page")

def portfoliosgen(colour=False):
    if not os.path.isdir("build/portfolios"):
        os.mkdir("build/portfolios")
    if colour:
        if not os.path.isdir("build/portfolios/" + colour):
            os.mkdir("build/portfolios/" + colour)
        thefile = "build/portfolios/" + colour + "/index.html"
    else:
        thefile = "build/portfolios/index.html"
    if os.path.exists(thefile):
        os.remove(thefile)
    headerwrite(thefile,"portfolios")
    content = open(thefile,"a")
    content.write("<h1>portfolios</h1>\n")
    if latestpalette + latestmonochrome > 0:
        if latestpalette > 0:
            content.write("<div class=\"foliocase\">\n")
            portnumber = 1
            for portfolio in portfolios:
                if portfolio["type"] == "palette":
                    content.write(portfoliogen(portfolio,"palette",portnumber))
                    portnumber += 1
            content.write("</div>\n")
        if latestmonochrome > 0:
            content.write("<div class=\"foliocase\">\n")
            portnumber = 1
            for portfolio in portfolios:
                if portfolio["type"] == "monochrome":
                    content.write(portfoliogen(portfolio,"monochrome",portnumber))
                    portnumber += 1
            content.write("</div>\n")
    content.close()
    footerwrite(thefile)
        
if __name__ == "__main__":
    portfoliosgen()
    print("Building collecting page")

def collectinggen(colour=False):
    if not os.path.isdir("build/collecting"):
        os.mkdir("build/collecting")
    if colour:
        if not os.path.isdir("build/collecting/" + colour):
            os.mkdir("build/collecting/" + colour)
        thefile = "build/collecting/" + colour + "/index.html"
    else:
        thefile = "build/collecting/index.html"
    if os.path.exists(thefile):
        os.remove(thefile)
    headerwrite(thefile,"collecting")
    content = open(thefile,"a")
    content.write("<h1>decks in progress</h1>\n" + filterwrite("collecting",colour) + "<div>\n<h2 class=\"collectingheader\">High priority</h2>\n")
    for deck in decklist:
        if deck["priority"] == 1 and deck["mastered"] == False:
            if colour:
                if deck["colour"] == colour:
                    content.write(printdeck(deck,False))
            else:
                content.write(printdeck(deck,False))
    content.write("</div>\n<div>\n<h2 class=\"collectingheader\">Medium priority</h2>\n")
    for deck in decklist:
        if deck["priority"] == 2 and deck["mastered"] == False:
            if colour:
                if deck["colour"] == colour:
                    content.write(printdeck(deck))
            else:
                content.write(printdeck(deck))
    content.write("</div>\n<div>\n<h2 class=\"collectingheader\">Low priority</h2>\n")
    for deck in decklist:
        if deck["priority"] == 3 and deck["mastered"] == False:
            if colour:
                if deck["colour"] == colour:
                    content.write(printdeck(deck))
            else:
                content.write(printdeck(deck))
    content.write("</div>\n")
    content.close()
    footerwrite(thefile)

def collectingall():
    collectinggen()
    for thevalue in values:
        collectinggen(thevalue)
        
if __name__ == "__main__":
    collectingall()
    print("Building mass collecting pages")

masslist = sorted(list(variables.masscollect.keys()))

def massindexgen():
    if not os.path.isdir("build/mass"):
        os.mkdir("build/mass")
    thefile = "build/mass/index.html"
    if os.path.exists(thefile):
        os.remove(thefile)
    headerwrite(thefile,"mass")
    content = open(thefile,"a")
    content.write("<h1>mass collecting/keeping</h1>\n<ul>\n")
    massindex = 1
    for series in masslist:
        content.write("<li><a href=\"/mass/" + str(massindex) + "\">" + series + "</a>")
        content.write("</li>\n")
        massindex += 1
    content.write("</ul>\n")
    content.close()
    footerwrite(thefile)

def massseriesgen(series,massindex):
    if not os.path.isdir("build/mass/" + str(massindex)):
        os.mkdir("build/mass/" + str(massindex))
    thefile = "build/mass/" + str(massindex) + "/index.html"
    if os.path.exists(thefile):
        os.remove(thefile)
    headerwrite(thefile,"mass")
    content = open(thefile,"a")
    content.write("<h1>" + series + "</h1>\n<p><a href=\"/mass\">back to mass decks page</a></p>\n<p>")
    for deck in decklist:
        if deck["mastered"]:
            if series in deck["mass"] or series in deck["massmaster"]:
                content.write("<img src=\"/decks/" + deck["name"] + "/master.gif\" title=\"mastered " + deck["name"])
                try:
                    if deck["name"] in variables.firstmasteries:
                        content.write(" (first)\" class=\"first")
                except:
                    pass
                content.write("\">")
    content.write("</p><p>")
    for card in cardlist:
        if series in card["mass"]:
            if card["dupe"] == False:
                content.write(printcard(card))
    content.write("</p>\n")
    content.close()
    footerwrite(thefile)
        
def massall():
    massindexgen()
    massindex = 1
    for series in masslist:
        massseriesgen(series,massindex)
        massindex += 1

if __name__ == "__main__":
    massall()
    print("Building mastered page")

def masteredgen(colour=False):
    if not os.path.isdir("build/mastered"):
        os.mkdir("build/mastered")
    if colour:
        if not os.path.isdir("build/mastered/" + colour):
            os.mkdir("build/mastered/" + colour)
        thefile = "build/mastered/" + colour + "/index.html"
    else:
        thefile = "build/mastered/index.html"
    if os.path.exists(thefile):
        os.remove(thefile)
    headerwrite(thefile,"mastered")
    content = open(thefile,"a")
    content.write("<h1>mastered decks</h1>\n")
    content.write(filterwrite("mastered",colour))
    for deck in decklist:
        if deck["mastered"]:
            if colour:
                if deck["colour"] == colour:
                    content.write(printdeck(deck))
            else:
                content.write(printdeck(deck))
    content.close()
    footerwrite(thefile)

def masteredall():
    masteredgen()
    for thevalue in values:
        masteredgen(thevalue)
        
if __name__ == "__main__":
    masteredall()
    print("Building trading page")

tradelist = []
sigtradelist = []
for card in cardlist:
    if card["priority"] == 4:
        tradelist.append(card)
    elif card["priority"] == 5:
        sigtradelist.append(card)
alltradelist = tradelist + sigtradelist

def tradegen(colour=False):
    if not os.path.isdir("build/trade"):
        os.mkdir("build/trade")
    if colour:
        if not os.path.isdir("build/trade/" + colour):
            os.mkdir("build/trade/" + colour)
        thefile = "build/trade/" + colour + "/index.html"
    else:
        thefile = "build/trade/index.html"
    if os.path.exists(thefile):
        os.remove(thefile)
    headerwrite(thefile,"trade")
    content = open(thefile,"a")
    content.write("<h1>available for trade</h1>\n" + filterwrite("trade",colour,True) + "<p class=\"tradeterms\">")
    if len(variables.tradestatement) > 0:
        content.write(variables.tradestatement + " ")
    content.write("Trade cards <a href=\"" + variables.tradepost + "\">here</a></p>\n<p><textarea readonly>")
    precomma = False
    for card in alltradelist:
        if colour:
            if card["colour"] == colour:
                if precomma:
                    content.write(", ")
                content.write(card["name"])
                precomma = True
        else:
            if precomma:
                content.write(", ")
            content.write(card["name"])
            precomma = True
    content.write("</textarea>\n<p>")
    for card in alltradelist:
        if colour:
            if card["colour"] == colour:
                content.write(printcard(card))
        else:
            content.write(printcard(card))
    content.write("</p>\n")
    content.close()
    footerwrite(thefile)

def tradeall():
    tradegen()
    for thevalue in values:
        tradegen(thevalue)
    tradegen("sig")
        
if __name__ == "__main__":
    tradeall()
    print("Building wanted page")

def wantedgen():
    if not os.path.isdir("build/wanted"):
        os.mkdir("build/wanted")
    if os.path.exists("build/wanted/index.html"):
        os.remove("build/wanted/index.html")
    thefile = "build/wanted/index.html"
    headerwrite(thefile,"wanted")
    content = open(thefile,"a")
    content.write("<h1>wanted cards</h1>\n<h2>High priority</h2>\n<textarea readonly>")
    precomma = False
    for card in wantedlist:
        if card["priority"] == 1:
            if precomma:
                content.write(", ")
            content.write(card["name"])
            precomma = True
    precomma = False
    content.write("</textarea>\n<p>")
    for card in wantedlist:
        if card["priority"] == 1:
            if precomma:
                content.write(", ")
            content.write(cardtext(card))
            precomma = True
    precomma = False
    content.write("</p>\n<h2>Medium priority</h2>\n<textarea readonly>")
    for card in wantedlist:
        if card["priority"] == 2:
            if precomma:
                content.write(", ")
            content.write(card["name"])
            precomma = True
    precomma = False
    content.write("</textarea>\n<p>")
    for card in wantedlist:
        if card["priority"] == 2:
            if precomma:
                content.write(", ")
            content.write(cardtext(card))
            precomma = True
    precomma = False
    content.write("</p>\n<h2>Low priority</h2>\n<textarea readonly>")
    for card in wantedlist:
        if card["priority"] == 3:
            if precomma:
                content.write(", ")
            content.write(card["name"])
            precomma = True
    precomma = False
    content.write("</textarea>\n<p>")
    for card in wantedlist:
        if card["priority"] == 3:
            if precomma:
                content.write(", ")
            content.write(cardtext(card))
            precomma = True
    content.write("</p>\n")
    content.close()
    footerwrite(thefile)

if __name__ == "__main__":
    wantedgen()
    print("Building search page")

def searchgen():
    if not os.path.isdir("build/search"):
        os.mkdir("build/search")
    thefile = "build/search/index.html"
    if os.path.exists(thefile):
        os.remove(thefile)
    headerwrite(thefile,"search")
    content = open(thefile,"a")
    content.write("<h1>card search</h1>\n<form>\n  <label for=\"cardinput\">Enter a list of cards and/or decks here:</label>\n  <textarea id=\"cardinput\" name=\"cardinput\"></textarea>\n  <input type=\"button\" value=\"Search\" onclick=\"searchcards()\">\n</form>\n<p id=\"hpwfound\"></p>\n<p id=\"mpwfound\"></p>\n<p id=\"lpwfound\"></p>\n<p id=\"hptfound\"></p>\n<p id=\"mptfound\"></p>\n<p id=\"lptfound\"></p>\n<p id=\"nothing\"></p>\n<script>\n function searchcards() {\n     const thecards = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20'];\n     const hpw = [")
    precomma = False
    for card in wantedlist:
        if card["priority"] == 1:
            if precomma:
                content.write(", ")
            content.write("'" + card["name"] + "'")
            precomma = True
    content.write("];\n     const mpw = [")
    precomma = False
    for card in wantedlist:
        if card["priority"] == 2:
            if precomma:
                content.write(", ")
            content.write("'" + card["name"] + "'")
            precomma = True
    content.write("];\n     const lpw = [")
    precomma = False
    for card in wantedlist:
        if card["priority"] == 3:
            if precomma:
                content.write(", ")
            content.write("'" + card["name"] + "'")
            precomma = True
    content.write("];\n     const hpt = [")
    precomma = False
    for card in cardlist:
        if card["priority"] == 2:
            if precomma:
                content.write(", ")
            content.write("'" + card["name"] + "'")
            precomma = True
    content.write("];\n     const mpt = [")
    precomma = False
    for card in cardlist:
        if card["priority"] == 3:
            if precomma:
                content.write(", ")
            content.write("'" + card["name"] + "'")
            precomma = True
    content.write("];\n     const lpt = [")
    precomma = False
    for card in cardlist:
        if card["priority"] == 4:
            if precomma:
                content.write(", ")
            content.write("'" + card["name"] + "'")
            precomma = True
    content.write("];\n     const searchstring = document.getElementById('cardinput').value;\n     const searcharray = searchstring.replaceAll(' ','').replaceAll('\\n',',').replaceAll('\\r',',').toLowerCase().split(',');\n     const hpwfound = [];\n     const mpwfound = [];\n     const lpwfound = [];\n     const hptfound = [];\n     const mptfound = [];\n     const lptfound = [];\n     for (const element of searcharray) {\n         let cardend = element.substring(element.length, element.length - 2);\n         if (!(thecards.includes(cardend))) {\n             for (const ending of thecards) {\n                 searcharray.push(element + ending);\n             };\n         };\n     };\n     for (const element of searcharray) {\n         if (hpw.includes(element)) {\n             hpwfound.push(element);\n         } else if (mpw.includes(element)) {\n             mpwfound.push(element);\n         } else if (lpw.includes(element)) {\n             lpwfound.push(element);\n         } else if (hpt.includes(element)) {\n             hptfound.push(element);\n         } else if (mpt.includes(element)) {\n             mptfound.push(element);\n         } else if (lpt.includes(element)) {\n             lptfound.push(element);\n         };\n     };\n     if ((hpwfound.length) > 0) {\n         document.getElementById('hpwfound').innerHTML = '<span class=\"sorttitle\">Wanted (high priority):</span> <span class=\"searchresults\">' + hpwfound.join(', ') + '</span>';\n     } else {\n         document.getElementById('hpwfound').innerHTML = '';\n     };\n     if ((mpwfound.length) > 0) {\n         document.getElementById('mpwfound').innerHTML = '<span class=\"sorttitle\">Wanted (medium priority):</span>  <span class=\"searchresults\">' + mpwfound.join(', ') + '</span>';\n     } else {\n         document.getElementById('mpwfound').innerHTML = '';\n     };\n     if ((lpwfound.length) > 0) {\n         document.getElementById('lpwfound').innerHTML = '<span class=\"sorttitle\">Wanted (low priority):</span>  <span class=\"searchresults\">' + lpwfound.join(', ') + '</span>';\n     } else {\n         document.getElementById('lpwfound').innerHTML = '';\n     };\n     if ((hptfound.length) > 0) {\n         document.getElementById('hptfound').innerHTML = '<span class=\"sorttitle\">Will trade out for <a href=\"/wanted\">high priority cards</a> only:</span>  <span class=\"searchresults\">' + hptfound.join(', ') + '</span>';\n     } else {\n         document.getElementById('hptfound').innerHTML = '';\n     };\n     if ((mptfound.length) > 0) {\n         document.getElementById('mptfound').innerHTML = '<span class=\"sorttitle\">Will trade out for <a href=\"/wanted\">high or medium priority cards</a>:</span>  <span class=\"searchresults\">' + mptfound.join(', ') + '</span>';\n     } else {\n         document.getElementById('mptfound').innerHTML = '';\n     };\n     if ((lptfound.length) > 0) {\n         document.getElementById('lptfound').innerHTML = '<span class=\"sorttitle\">Will trade out for <a href=\"/wanted\">any wanted card</a>:</span>  <span class=\"searchresults\">' + lptfound.join(', ') + '</span>';\n     } else {\n         document.getElementById('lptfound').innerHTML = '';\n     };\n     if ((hpwfound.length) + (mpwfound.length) + (lpwfound.length) + (hptfound.length) + (mptfound.length) + (lptfound.length) == 0) {\n         document.getElementById('nothing').innerHTML = 'No results';\n     } else {\n         document.getElementById('nothing').innerHTML = '';\n     }\n }\n</script>\n    </main>\n  </body>\n</html>")
    content.close()

if __name__ == "__main__":
    searchgen()
    print("Building log page")

def loggen(month=False):
    if month:
        if not os.path.isdir("build/log/month"):
            os.mkdir("build/log/month")
        if os.path.exists("build/log/month/index.html"):
            os.remove("build/log/month/index.html")
        thefile = "build/log/month/index.html"
    else:
        if not os.path.isdir("build/log"):
            os.mkdir("build/log")
        if os.path.exists("build/log/index.html"):
            os.remove("build/log/index.html")
        thefile = "build/log/index.html"
    headerwrite(thefile,"log")
    content = open(thefile,"a")
    content.write("<h1>log</h1>\n<p class=\"typefilter\">")
    if month:
        content.write("<a href=\"/log\">Show all</a>")
    else:
        content.write("<a href=\"/log/month\">Show current month only</a>")
    content.write("</p>\n")
    for event in logitems:
        if month:
            if event["date"].month == datetime.datetime.now().month and event["date"].year == datetime.datetime.now().year:
                admit = True
            else:
                admit = False
        else:
            admit = True
        if admit == True:
            content.write("<p><code>" + event["date"].strftime("%Y-%m-%d") + "</code> <a href=\"" + event["url"] + "\">[" + event["name"] + "]</a>: ")
            try:
                if event["received"]:
                    content.write("Received ")
                    receivedlist = sorted(event["received"], key=lambda d: d["name"])
                    position = 1
                    for card in receivedlist:
                        content.write(cardtext(card))
                        if len(receivedlist) != position:
                            content.write(", ")
                        position += 1
                    content.write(".")
                    try:
                        if event["lost"]:
                            content.write(" ")
                    except:
                        try:
                            if event["crayons"]:
                                content.write(" ")
                        except:
                            pass
            except:
                pass
            try:
                if event["lost"]:
                    content.write("Lost ")
                    lostlist = sorted(event["lost"], key=lambda d: d["name"])
                    position = 1
                    for card in lostlist:
                        content.write(cardtext(card))
                        if len(lostlist) != position:
                            content.write(", ")
                        position += 1
                    content.write(".")
                    try:
                        if event["crayons"]:
                            content.write(" ")
                    except:
                        pass
            except:
                pass
            try:
                if event["crayons"]:
                    content.write("Crayons: ")
                    try:
                        content.write(crayonlog("red",event))
                        if list(event["crayons"])[-1] != "red":
                            content.write(", ")
                    except:
                        pass
                    try:
                        content.write(crayonlog("orange",event))
                        if list(event["crayons"])[-1] != "orange":
                            content.write(", ")
                    except:
                        pass
                    try:
                        content.write(crayonlog("yellow",event))
                        if list(event["crayons"])[-1] != "yellow":
                            content.write(", ")
                    except:
                        pass
                    try:
                        content.write(crayonlog("green",event))
                        if list(event["crayons"])[-1] != "green":
                            content.write(", ")
                    except:
                        pass
                    try:
                        content.write(crayonlog("blue",event))
                        if list(event["crayons"])[-1] != "blue":
                            content.write(", ")
                    except:
                        pass
                    try:
                        content.write(crayonlog("purple",event))
                        if list(event["crayons"])[-1] != "purple":
                            content.write(", ")
                    except:
                        pass
                    try:
                        content.write(crayonlog("brown",event))
                        if list(event["crayons"])[-1] != "brown":
                            content.write(", ")
                    except:
                        pass
                    try:
                        content.write(crayonlog("grey",event))
                    except:
                        pass
                    content.write(".")
            except:
                pass
            content.write("</p>\n")
    content.close()
    footerwrite(thefile)

def logall():
    loggen(False)
    loggen(True)

if __name__ == "__main__":
    logall()