#!/usr/bin/env python3

import sys
import os
import re

VERSION = "0.93b"

re_cave_id = re.compile(r'<div class="name cyan">(.*?)</div><div class="creator">(.*?)</div><div class')
re_cave_id_empty = re.compile(r'<div class="name cyan">(.*?)</div><div class="creator">(.*?)</div><div class="comments">&nbsp;')
re_cave_id_okre = re.compile(r'<div class="name">(.*?)</div><div class="creator">(.*?)</div><div class')
re_cave_id_okre_empty = re.compile(r'<div class="name">(.*?)</div><div class="creator">(.*?)</div><div class="comments">&nbsp;')
re_message = re.compile(r'<div class="message"><div class="head b1"><span>.*?</span><span>.*?</span></div><p>.*</p></div>', re.MULTILINE | re.DOTALL)
re_msg_start = re.compile(r'\d\d-\d\d-\d\d')
re_creation_date = re.compile(r'images/caves/.*?\.png\?type=(\d{8})')
re_cave_code = re.compile(r'/([A-Za-z0-9]{12})\.png')

print(f"Krissz2RnD_Msg Converter v{VERSION} by Michael Kamensky.")
if len(sys.argv) < 3:
    print(f"Usage: {sys.argv[0]} <db_filename.html> <target dir> [-n] [-o] [-s] [-d]")
    print(f"    -o - exclude old engine caves")
    print(f"    -n - exclude new engine caves")
    print(f"    -s - skip caves with no comments")
    print(f"    -l - write log file ('_filelist.log')")
    print(f"    -d - log cave creation date in _filelist.log")
    print(f"    -c - use cave code as message filename")
    exit(1)

src_file = sys.argv[1]
dest_dir = sys.argv[2]

skip_nkre = False
skip_okre = False
skip_empty = False
write_log = False
log_date = False
use_code = False

for i in range(len(sys.argv)):
    if sys.argv[i] == "-o":
        skip_okre = True
    elif sys.argv[i] == "-n":
        skip_nkre = True
    elif sys.argv[i] == "-s":
        skip_empty = True
    elif sys.argv[i] == "-l":
        write_log = True
    elif sys.argv[i] == "-d":
        log_date = True
    elif sys.argv[i] == "-c":
        use_code = True

# check if target directory exists
if not os.path.isdir(dest_dir):
    print(f"ERROR: Directory '{dest_dir}' not found!\n")
    exit(10)

if write_log:
    listfile = open("_filelist.log", "w")

with open(src_file, "r") as f:
    current_target = ""
    data = f.read()
    lines = f.readlines()
    data_split = data.split('<div class="fav-star"></div>')
    for element in data_split:
        cave_id = re_cave_id.search(element)
        if cave_id == None:
            cave_id = re_cave_id_okre.search(element)
            if cave_id != None and skip_okre:
                continue # skipping an old engine cave
        elif skip_nkre:
            continue # skipping a new engine cave
        if cave_id != None:
            cave_date = "unknown"
            is_empty = re_cave_id_empty.search(element) or re_cave_id_okre_empty.search(element)
            if is_empty and skip_empty:
                continue # skipping cave with no comments
            if log_date:
                cave_date_result = re_creation_date.search(element)
                if cave_date_result != None:
                    cave_date = cave_date_result.groups()[0]

            cave_code_result = re_cave_code.search(element)
            if cave_code_result != None:
                cave_code = cave_code_result.groups()[0]
            else:
                cave_code = ""

            cave_name   = cave_id.groups()[0]
            cave_author = cave_id.groups()[1]

            if cave_name == "" and cave_author == "":
                continue

            current_target = f"{cave_name} by {cave_author}"
            current_target = current_target.replace("/", "_")
            current_target = current_target.replace("\\", "_")
            current_target = current_target.replace("*", "_")
            current_target = current_target.replace("&amp;", "&")

            log_entry = current_target
            if log_date:
                log_entry = f"{cave_date} - {log_entry}"
            if use_code and cave_code != "":
                log_entry = f"{cave_code} - {log_entry}"

            print(f"Converting: {log_entry}")

            if write_log:
                listfile.write(f"{log_entry}\n")

            message_start = data.find(f'{cave_id.groups()[0]}</div><div class="creator">')
            message_start = message_start + data[message_start:].find('<div class="message"')
            message_end = data.find("</div></div></div></div>", message_start)
            if is_empty:
                msg = ""
            else:
                msg = data[message_start:message_end]

            cl_msg = msg.replace("\n", "")
            cl_msg = cl_msg.replace("<p>", "")
            cl_msg = cl_msg.replace("</span></div>", "\n")
            cl_msg = cl_msg.replace("</p></div>", "\n")
            cl_msg = cl_msg.replace("</p>", "\n")
            cl_msg = cl_msg.replace("<br>", "\n")
            cl_msg = cl_msg.replace('<div class="message"><div class="head b1"><span>', "")
            cl_msg = cl_msg.replace("</div>", "")
            cl_msg = cl_msg.replace("<span>", "")
            cl_msg = cl_msg.replace('</span>', ' ')
            cl_msg = cl_msg.replace('<span class="yellow">', ' ') # TODO: somehow make this highlighted in RnD?
            cl_msg = cl_msg.replace('&amp;', '&')

            messages = []
            message = ""

            for line in cl_msg.split('\n'):
                if re_msg_start.search(line) != None:
                    if message != "":
                        messages.append(message.strip() + "\n\n")
                        message = ""
                    message += "# .font: font.text_2\n20" + line + "  \n# .font: font.text_1\n"
                else:
                    message += line + "  \n"

            if message != "":
                messages.append(message.strip() + "\n\n")

            messages.reverse()

            final_msg = "".join(messages)
            final_msg = final_msg.strip()

            if use_code:
                if cave_code != "":
                    current_target = cave_code
                else:
                    print(f"ERROR: Cave code not found!\n")
                    exit(10)

            target_file = dest_dir + "/" + current_target + ".txt"

            out = open(target_file, "w")
            out.write(final_msg)
            out.close()

if write_log:
    listfile.close()
