{ pkgs, ... }:
let
  tomlGenerate = (pkgs.formats.toml { }).generate;
in
{
  # TODO: switch to module on next release

  home.packages = [ pkgs.joshuto ];
  home.shellAliases."fm" = "joshuto --change-directory";

  xdg.configFile = {
    "joshuto/joshuto.toml".source = tomlGenerate "joshuto-joshuto.toml" {
      scroll_offset = 6;
      # xdg_open = true;
      # xdg_open_fork = true;
      use_trash = true;
      watch_files = true;
      display = {
        mode = "default";
        collapse_preview = true;
        column_ratio = [
          1
          3
          4
        ];
        show_borders = true;
        show_hidden = false;
        show_icons = true;
        tilde_in_titlebar = true;
        line_number_style = "absolute";
        linemode = "size";
      };
      display.sort = {
        sort_method = "natural";
        case_sensitive = false;
        directories_first = true;
        reverse = false;
      };
      search = {
        string_case_sensitivity = "insensitive";
        glob_case_sensitivity = "sensitive";
        fzf_case_sensitivity = "insensitive";
      };
      tab = {
        display_mode = "all";
        home_page = "inherit";
      };
    };
    "joshuto/mimetype.toml".source = tomlGenerate "joshuto-mimetype.toml" {

      class = {
        audio_default = [
          {
            command = "mpv";
            args = [ "--" ];
          }
          {
            command = "mediainfo";
            confirm_exit = true;
          }
        ];

        image_default = [
          {
            command = "geeqie";
            fork = true;
            silent = true;
          }
          {
            command = "qimgv";
            args = [ "--" ];
            fork = true;
            silent = true;
          }
          {
            command = "krita";
            args = [ "--" ];
            fork = true;
            silent = true;
          }
          {
            command = "exiftool";
            confirm_exit = true;
          }
          {
            command = "swappy";
            args = [ "-f" ];
            fork = true;
          }
        ];

        video_default = [
          {
            command = "mpv";
            args = [ "--" ];
            fork = true;
            silent = true;
          }
          {
            command = "mediainfo";
            confirm_exit = true;
          }
          {
            command = "mpv";
            args = [
              "--mute"
              "on"
              "--"
            ];
            fork = true;
            silent = true;
          }
        ];

        text_default = [
          { command = "hx"; }
          { command = "micro"; }
          {
            command = "gedit";
            fork = true;
            silent = true;
          }
          {
            command = "bat";
            args = [ "--paging=always" ];
          }
        ];

        reader_default = [
          {
            command = "evince";
            fork = true;
            silent = true;
          }
          {
            command = "zathura";
            fork = true;
            silent = true;
          }
        ];

        libreoffice_default = [
          {
            command = "libreoffice";
            fork = true;
            silent = true;
          }
        ];
      };

      extension = {
        ## image formats
        avif."inherit" = "image_default";
        bmp."inherit" = "image_default";
        gif."inherit" = "image_default";
        heic."inherit" = "image_default";
        jpeg."inherit" = "image_default";
        jpe."inherit" = "image_default";
        jpg."inherit" = "image_default";
        pgm."inherit" = "image_default";
        png."inherit" = "image_default";
        ppm."inherit" = "image_default";
        webp."inherit" = "image_default";

        svg.app_list = [
          {
            command = "inkview";
            fork = true;
            silent = true;
          }
          {
            command = "inkscape";
            fork = true;
            silent = true;
          }
        ];
        tiff.app_list = [
          {
            command = "qimgv";
            fork = true;
            silent = true;
          }
          {
            command = "krita";
            fork = true;
            silent = true;
          }
        ];

        ## audio formats
        flac."inherit" = "audio_default";
        m4a."inherit" = "audio_default";
        mp3."inherit" = "audio_default";
        ogg."inherit" = "audio_default";
        wav."inherit" = "audio_default";

        ## video formats
        avi."inherit" = "video_default";
        av1."inherit" = "video_default";
        flv."inherit" = "video_default";
        mkv."inherit" = "video_default";
        m4v."inherit" = "video_default";
        mov."inherit" = "video_default";
        mp4."inherit" = "video_default";
        ts."inherit" = "video_default";
        webm."inherit" = "video_default";
        wmv."inherit" = "video_default";

        ## text formats
        build."inherit" = "text_default";
        c."inherit" = "text_default";
        cmake."inherit" = "text_default";
        conf."inherit" = "text_default";
        cpp."inherit" = "text_default";
        css."inherit" = "text_default";
        csv."inherit" = "text_default";
        cu."inherit" = "text_default";
        ebuild."inherit" = "text_default";
        eex."inherit" = "text_default";
        env."inherit" = "text_default";
        ex."inherit" = "text_default";
        exs."inherit" = "text_default";
        go."inherit" = "text_default";
        h."inherit" = "text_default";
        hpp."inherit" = "text_default";
        hs."inherit" = "text_default";
        html."inherit" = "text_default";
        ini."inherit" = "text_default";
        java."inherit" = "text_default";
        js."inherit" = "text_default";
        json."inherit" = "text_default";
        kt."inherit" = "text_default";
        lua."inherit" = "text_default";
        log."inherit" = "text_default";
        md."inherit" = "text_default";
        micro."inherit" = "text_default";
        ninja."inherit" = "text_default";
        py."inherit" = "text_default";
        rkt."inherit" = "text_default";
        rs."inherit" = "text_default";
        scss."inherit" = "text_default";
        sh."inherit" = "text_default";
        srt."inherit" = "text_default";
        svelte."inherit" = "text_default";
        toml."inherit" = "text_default";
        tsx."inherit" = "text_default";
        txt."inherit" = "text_default";
        vim."inherit" = "text_default";
        xml."inherit" = "text_default";
        yaml."inherit" = "text_default";
        yml."inherit" = "text_default";

        # archive formats
        "7z".app_list = [
          {
            command = "7z";
            args = [ "x" ];
            confirm_exit = true;
          }
          {
            command = "file-roller";
            fork = true;
            silent = true;
          }
        ];
        bz2.app_list = [
          {
            command = "tar";
            args = [ "-xvjf" ];
            confirm_exit = true;
          }
          {
            command = "file-roller";
            fork = true;
            silent = true;
          }
        ];
        gz.app_list = [
          {
            command = "tar";
            args = [ "-xvzf" ];
            confirm_exit = true;
          }
          {
            command = "file-roller";
            fork = true;
            silent = true;
          }
        ];
        tar.app_list = [
          {
            command = "tar";
            args = [ "-xvf" ];
            confirm_exit = true;
          }
          {
            command = "file-roller";
            fork = true;
            silent = true;
          }
        ];
        tgz.app_list = [
          {
            command = "tar";
            args = [ "-xvzf" ];
            confirm_exit = true;
          }
          {
            command = "file-roller";
            fork = true;
            silent = true;
          }
        ];
        rar.app_list = [
          {
            command = "unrar";
            args = [ "x" ];
            confirm_exit = true;
          }
          {
            command = "file-roller";
            fork = true;
            silent = true;
          }
        ];
        xz.app_list = [
          {
            command = "tar";
            args = [ "-xvJf" ];
            confirm_exit = true;
          }
          {
            command = "file-roller";
            fork = true;
            silent = true;
          }
        ];
        zip.app_list = [
          {
            command = "unzip";
            confirm_exit = true;
          }
          {
            command = "file-roller";
            fork = true;
            silent = true;
          }
        ];

        # misc formats
        aup.app_list = [
          {
            command = "audacity";
            fork = true;
            silent = true;
          }
        ];

        m3u.app_list = [
          { command = "micro"; }
          { command = "mpv"; }
          {
            command = "gedit";
            fork = true;
            silent = true;
          }
          {
            command = "bat";
            confirm_exit = true;
          }
        ];

        odt."inherit" = "libreoffice_default";
        odf."inherit" = "libreoffice_default";
        ods."inherit" = "libreoffice_default";
        odp."inherit" = "libreoffice_default";

        doc."inherit" = "libreoffice_default";
        docx."inherit" = "libreoffice_default";
        xls."inherit" = "libreoffice_default";
        xlsx."inherit" = "libreoffice_default";
        ppt."inherit" = "libreoffice_default";
        pptx."inherit" = "libreoffice_default";

        pdf."inherit" = "reader_default";

        kra.app_list = [
          {
            command = "krita";
            fork = true;
            silent = true;
          }
        ];
        kdenlive.app_list = [
          {
            command = "kdenlive";
            fork = true;
            silent = true;
          }
        ];

        tex.app_list = [
          { command = "micro"; }
          {
            command = "gedit";
            fork = true;
            silent = true;
          }
          {
            command = "bat";
            confirm_exit = true;
          }
          { command = "pdflatex"; }
        ];

        torrent.app_list = [{ command = "transmission-gtk"; }];
      };

      mimetype = {
        # application/octet-stream
        application.subtype.octet-stream."inherit" = "video_default";
        # text/*
        text."inherit" = "text_default";
        # video/*
        video."inherit" = "video_default";
      };
    };

    "joshuto/bookmarks.toml".source = tomlGenerate "joshuto-bookmarks.toml" {
      bookmark = [
        {
          path = "/";
          key = "r";
        }
        {
          path = "~/";
          key = "h";
        }
        {
          path = "~/Scaricati";
          key = "d";
        }
        {
          path = "~/Syncthing";
          key = "s";
        }
      ];
    };
  };
}
