#include "fuse.hpp"
#include "common.hpp"
#include <sys/stat.h>


static bool check_dir(const char* s, char* d) {
    if (!realpath(s, d)) {
        LOG_ERRNO("realpath(%s)", s);
        return false;
    }
    struct stat ss;
    if (stat(d, &ss) != 0) {
        LOG_ERRNO("%s", d);
        return false;
    }
    if (!S_ISDIR(ss.st_mode)) { // TODO: check permissions, too?
        LOG_ERR(ENOTDIR, "%s", d);
        return false;
    }
    return true;
}


int main(int argc, char** argv) {
    config_t config = {};

    if (argc < 4 || argc > 7) {
        LOG("Usage: %s [-p|--persistent] [--filter=...] dir-handler file-handler src/ [dst/]", argv[0]);
        return 1;
    }

    argc--; argv++;
    config.persistent = (!strcmp(argv[0], "-p") || !strcmp(argv[0], "--persistent"));
    if (config.persistent) {
        argc--; argv++;
    }
    if (!strncmp(argv[0], "--filter=", 9)) {
        argv[0] += 9;
        if (strlen(argv[9]) >= sizeof(config.filter)) {
            return 1;
        }
        strcpy(config.filter, argv[0]);
        argc--; argv++;
    }
    if (argc < 3) {
        return 1;
    }

    if (!realpath(argv[0], config.list_handler)) {
        LOG_ERRNO("realpath(%s)", argv[0]);
        return 1;
    }
    if (!realpath(argv[1], config.file_handler)) {
        LOG_ERRNO("realpath(%s)", argv[1]);
        return 1;
    }

    if (!check_dir(argv[2], config.src)) {
        return 1;
    }
    if (!check_dir(argv[argc-1], config.dst)) {
        return 1;
    }

    return fifuma_fuse_loop(config)? 0: 1;
}