# -*- coding: utf-8 -*-
# File              : .config/ranger/commands.py
# Author            : Jeff LANCE <email@jefflance.me>
# Date              : 12.05.2021
# Last Modified Date: 08.03.2024 20:17:29
# Last Modified By  : Jeff Lance <email@jefflance.me>


from ranger.api.commands import Command
from plugins.ranger_udisk_menu.mounter import mount
from plugins.ranger_tmsu import Tmsu

import os
import ranger.api
import ranger.core.linemode


tmsu = Tmsu.findTmsu()


class mkcd(Command):
    """
    :mkcd <dirname>

    Creates a directory with the name <dirname> and enters it.
    """

    def execute(self):
        from os.path import join, expanduser, lexists
        from os import makedirs
        import re

        dirname = join(self.fm.thisdir.path, expanduser(self.rest(1)))
        if not lexists(dirname):
            makedirs(dirname)

            match = re.search("^/|^~[^/]*/", dirname)
            if match:
                self.fm.cd(match.group(0))
                dirname = dirname[match.end(0) :]

            for m in re.finditer("[^/]+", dirname):
                s = m.group(0)
                if s == ".." or (
                    s.startswith(".") and not self.fm.settings["show_hidden"]
                ):
                    self.fm.cd(s)
                else:
                    ## We force ranger to load content before calling `scout`.
                    self.fm.thisdir.load_content(schedule=False)
                    self.fm.execute_console("scout -ae ^{}$".format(s))
        else:
            self.fm.notify("file/directory exists!", bad=True)


class tmsu_tag(Command):
    """:tmsu_tag

    Tags the current file with tmsu
    """

    def execute(self):
        cf = self.fm.thisfile
        tmsu.tag(cf.basename, self.rest(1))

    def tab(self, tabnum):
        """Complete with tags"""
        results = []
        if self.arg(0) == self.arg(-1):
            input_tag = ""
            index = 1
        else:
            input_tag = self.arg(-1)
            index = -1

        if "=" in input_tag:
            split_value = input_tag.split("=")[1]
            split_tag = input_tag.split("=")[0]
            for value in tmsu.values(split_tag):
                if value.startswith(split_value):
                    results.append(split_tag + "=" + value)
        else:
            for tag in tmsu.tags():
                if tag.startswith(input_tag):
                    results.append(tag)
        return (self.start(index) + result for result in results)


class tmsu_untag(Command):
    """:tmsu_untag

    Untags the current file with tmsu
    """

    def execute(self):
        cf = self.fm.thisfile
        tmsu.untag(cf.basename, self.rest(1))

    def tab(self, tabnum):
        """Complete with tags"""
        results = []
        if self.arg(0) == self.arg(-1):
            input_tag = ""
            index = 1
        else:
            input_tag = self.arg(-1)
            index = -1
        cf = self.fm.thisfile

        for tag in tmsu.tags(fileName=cf.basename):
            if tag.startswith(input_tag):
                results.append(tag)
        return (self.start(index) + result for result in results)


class tmsu_ls(Command):
    """:tmsu_ls

    List tags of the current file with tmsu
    """

    def execute(self):
        cf = self.fm.thisfile
        tags = tmsu.tags(cf.basename)
        self.fm.notify(tags)


@ranger.api.register_linemode  # It may be used as a decorator too!
class MyLinemode(ranger.core.linemode.LinemodeBase):
    name = "tmsu_linemode"

    uses_metadata = False

    def filetitle(self, file, metadata):
        return file.relative_path + str(tmsu.tags(file))

    def infostring(self, file, metadata):
        return file.user