# /// script
# dependencies = [
#   "qbittorrent-api",
#   "docopt",
# ]
# ///

"""qbt_sum_size.py

Description:
Get the total size of all added torrents and the total size of all completed 
torrents from a qBittorrent instance.

Usage:
    qbt_sum_size.py (HOSTNAME) (USERNAME) (PASSWORD)
    qbt_sum_size.py -h

Examples:
    qbt_sum_size.py "http://localhost:8080" "admin" "adminadmin"
    qbt_sum_size.py "https://cat.seedhost.eu/lol/qbittorrent" "lol" "supersecretpassword"

Options:
    -h, --help      show this help message and exit
"""

import qbittorrentapi
from docopt import docopt


# convert byte units
def human_bytes(bites: int) -> str:
    B = float(bites)
    KiB = float(1024)
    MiB = float(KiB**2)
    GiB = float(KiB**3)
    TiB = float(KiB**4)

    match B:
        case B if B < KiB:
            return "{0} {1}".format(B, "bytes" if 0 == B > 1 else "byte")
        case B if KiB <= B < MiB:
            return "{0:.2f} KiB".format(B / KiB)
        case B if MiB <= B < GiB:
            return "{0:.2f} MiB".format(B / MiB)
        case B if GiB <= B < TiB:
            return "{0:.2f} GiB".format(B / GiB)
        case B if TiB <= B:
            return "{0:.2f} TiB".format(B / TiB)
        case _:
            return ""


if __name__ == "__main__":
    args = docopt(__doc__)  # type: ignore

    completed_torrent_sizes = []
    total_added_bytes = int()

    with qbittorrentapi.Client(
        host=args["HOSTNAME"], username=args["USERNAME"], password=args["PASSWORD"]
    ) as qbt_client:
        try:
            qbt_client.auth_log_in()
        except qbittorrentapi.LoginFailed as e:
            print(e)

        for torrent in qbt_client.torrents_info():
            if torrent.completion_on != 0:
                completed_torrent_sizes.append(torrent.total_size)

            total_added_bytes = sum(
                [torrent.total_size for torrent in qbt_client.torrents_info()]
            )

    total_completed_bytes = sum(completed_torrent_sizes)

    print(f"\nTotal completed size: {human_bytes(total_completed_bytes)}")
    print(f"Total added size: {human_bytes(total_added_bytes)}\n")