# -*- coding: utf-8 -*-

import logging
from os import makedirs, path
from subprocess import check_output
from traceback import format_exc
from uuid import uuid4

from bs4 import BeautifulSoup
from libbot import config_get

from modules.utils import *

logger = logging.getLogger(__name__)


class EmptyCardException(Exception):
    pass


async def getWaterLeft(cardid, filename, app=None):
    url = f"https://bwtaqua.com.ua/card-topup/?id={cardid}"

    try:
        # if path.exists(f"data/pages/{str(filename)}.html") is False:
        #     run(["touch", f"data/pages/{str(filename)}.html"])

        logger.info(f"Trying to get liters for url '{url}'")

        if await config_get("use_compiled_page_saver") is True:
            proc = check_output(
                [
                    "PageSaver/pageSaver",
                    f"https://bwtaqua.com.ua/card-topup/?id={cardid}",
                ]
            )  # , ">", f"data/pages/{str(filename)}.html"])
            html_file = proc.decode("utf-8")
        else:
            proc = check_output(
                [
                    "node",
                    "./PageSaver/pageSaver.js",
                    f"https://bwtaqua.com.ua/card-topup/?id={cardid}",
                ]
            )  # , ">", f"data/pages/{str(filename)}.html"])
            html_file = proc.decode("utf-8")

        # with open(f'data/pages/{str(filename)}.html') as f:
        #     html_file = f.read()
        #     f.close()

        soup = BeautifulSoup(html_file, "html.parser")

        output = (
            (
                soup.find_all(
                    "h3",
                    class_="headline headline_center headline_pink js-payment-balance",
                )[0].getText()
            )
            .replace("Твій баланс ", "")
            .replace(" л", "")
        )

        logger.info(
            f"Parsed {output} liters of water remaining (user: {str(filename)}, cardid: {cardid})"
        )

    except Exception as exp:
        logger.exception(
            f"Exception occured: {exp} (user: {str(filename)}, cardid: {cardid})", exp
        )

        try:
            tmp_name = str(uuid4())
            makedirs("tmp", exist_ok=True)
            with open(path.join("tmp", tmp_name), "w", encoding="utf-8") as f:
                f.write(html_file)
        except NameError:
            tmp_name = "N/A"
            logger.warning(f"'html_file' is not defined so I won't gather any tmp data")

        if app != None:
            await app.send_message(
                await config_get("owner_id"),
                f"**Exception occured:**\n • User: `{str(filename)}`\n • Card: [{cardid}]({url})\n • Exception: `{exp}`\n • TMP UUID: `{tmp_name}`\n • Traceback: `{format_exc()}`",
                disable_web_page_preview=True,
            )
        else:
            logger.warning(f"Exception occurred and could not send to user: {exp}")

        output = "Failure"

    return output


if __name__ == "__main__":
    cardid = input("Enter card number: ")
    userid = input("Enter Telegram ID (optional): ")

    print(f"Card has {str(getWaterLeft(cardid, userid, app=None))} l. left")
