#!/usr/bin/env python3
# -*- coding:utf-8 -*-

# SPDX-FileCopyrightText: 2014-2021 Luca Beltrame <lbeltrame@kde.org>
# SPDX-License-Identifier: GPL-3.0-or-later

import argparse
from enum import Enum
import os
from pathlib import Path
import re
import stat

import transmissionrpc
from xdg import Mime


class FileType(Enum):

    music = 1
    video = 2
    application = 3
    image = 4
    unknown = 100

    @staticmethod
    def detect(filelist: dict):

        # Get the largest file
        largest = max(filelist, key=lambda x: filelist[x])

        category = Mime.get_type_by_name(largest).media

        if category == "audio":
            return FileType.music
        elif category == "video":
            return FileType.video
        elif category == "application":
            return FileType.application
        elif category == "image":
            return FileType.image
        else:
            return FileType.unknown

    def destination_dir(self) -> Path:

        if self is FileType.music:
            return Path("/home/storage/music/Anime/")
        elif self is FileType.video:
            return Path("/home/storage/video/")
        elif self is FileType.application:
            return Path("/home/storage/applications/")
        elif self is FileType.image:
            return Path("/home/storage/images/")
        else:
            return Path("/home/storage/transmission-downloads/")


def main():

    # Get the information from Transmission

    source_directory = os.environ.get("TR_TORRENT_DIR")
    source_file = os.environ.get("TR_TORRENT_NAME")
    torrent_id = os.environ.get("TR_TORRENT_ID")

    with open("/var/lib/transmission/rpcpass", "r") as handle:
        rpc_pass = handle.read().strip()

    if source_directory is None or source_file is None:
        print("Please run this script from Transmission.")
        exit(1)

    source = Path(source_directory) / source_file

    assert source.exists()

    client = transmissionrpc.Client("localhost", port=9091,
                                    user="transmission", password=rpc_pass)

    # Returns a dictionary with the torrent_id as key
    filelist = client.get_files(torrent_id)[int(torrent_id)]
    filelist = {filelist[item]["name"]: filelist[item]["size"] for item in
                filelist}

    filetype = FileType.detect(filelist)

    destination = filetype.destination_dir()

    if destination == source_directory:
        return

    dest_path = destination / source.name
    source.rename(dest_path)

    permissions = dest_path.stat().st_mode
    permissions = permissions | stat.S_IROTH | stat.S_IWOTH | stat.S_IXOTH
    dest_path.chmod(permissions)

    client.stop_torrent(torrent_id)
    client.remove_torrent(torrent_id)

    print("Moved {} to {}".format(source, dest_path))


if __name__ == "__main__":
    main()