import json
import io
import os
import re
from backend import *


def renameFile(filename: str):
    """_summary_

    Args:
        filename (str): _description_

    Returns:
        _type_: _description_
    """
    newFileName = "".join(re.split("\(|\)|\[|\]", filename)[::2])
    try:
        os.rename(filename, newFileName)
        return True
    except OSError as err:
        return err


def loadDownloadHistory():
    """Loads the downloadHistory.json, creates it if it doesn't exist

    Returns:
        object: download history list
    """
    if os.path.isfile("./downloadHistory.json") and os.access(
        "./downloadHistory.json", os.R_OK
    ):
        return json.load(open("./downloadHistory.json"))
    else:
        with io.open(os.path.join("./", "downloadHistory.json"), "w") as db_file:
            db_file.write(json.dumps([]))
        return json.load(open("./downloadHistory.json"))


def writeShowToDownloadHistory(showName: str, downloadHistory: list):
    """Writes the showName and latestEpisode to the downloadHistory.json file

    Args:
        showName (str): _description_
        downloadHistory (list): _description_

    Returns:
        _type_: _description_
    """
    downloadHistory.append(showName)
    with io.open(os.path.join("./", "downloadHistory.json"), "w") as db_file:
        db_file.write(json.dumps(downloadHistory))
    return json.load(open("./downloadHistory.json"))


def readDownloadHistory(fileNameObject: object, downloadHistory: list):
    """Reads the downloadHistory.json and checks if the fileName is present

    Args:
        fileNameObject (str): _description_
        downloadHistory (list): _description_

    Returns:
        _type_: _description_
    """
    dhFileName = (
        fileNameObject["showName"] + " - " + str(fileNameObject["latestEpisode"])
    )
    if dhFileName not in downloadHistory:
        writeShowToDownloadHistory(dhFileName, downloadHistory)
        return False
    else:
        return True


def main():
    dh = loadDownloadHistory()
    config = config_check()
    downloader = gogoanime(
        config,
        1,
        config["CLIQuality"],
        "a",
        1,
        1,
        1,
        config["CLIDownloadLocation"],
    )
    list = downloader.get_show_from_bookmark()
    dl_links = {}
    for ep in list:
        if readDownloadHistory(ep, dh):
            showName = ep["showName"] + " - " + str(ep["latestEpisode"])
            print(f"{IN}{showName} already downloaded")
        else:
            print(
                f"{IN}Scraping DL for "
                + ep["showName"]
                + " Ep "
                + str(ep["latestEpisode"])
            )
            dl_links[downloader.get_download_link(ep["downloadURL"])] = (
                ep["showName"],
                ep["latestEpisode"],
            )
    result = downloader.file_downloader(dl_links)
    if config["CleanUpFileName"]:
        for file in result.data:
            renameFile(file)
    if len(result.errors) > 0:
        while len(result.errors) > 0:
            print(f"{ERR}{len(result.errors)} links failed retrying.")
            print(f"{IN}Re-Scraping Links")
            dl_links.clear()
            for ep in list:
                dl_links[downloader.get_download_link(ep["downloadURL"])] = (
                    ep["showName"],
                    ep["latestEpisode"],
                )
            result = downloader.file_downloader(dl_links, overwrite_downloads=0)
            if config["CleanUpFileName"]:
                for file in result.data:
                    renameFile(file)


if __name__ == "__main__":
    main()