/**
 * @file configuration.c
 * @author Michal Vasko <mvasko@cesnet.cz>
 * @brief yanglint configuration
 *
 * Copyright (c) 2017 CESNET, z.s.p.o.
 *
 * This source code is licensed under BSD 3-Clause License (the "License").
 * You may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 */

#include "configuration.h"

#include <errno.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>

#include "linenoise/linenoise.h"

#include "common.h"

/* Yanglint home (appended to ~/) */
#define YL_DIR ".yanglint"

char *
get_yanglint_dir(void)
{
    int ret;
    struct passwd *pw;
    char *user_home, *yl_dir;

    if (!(pw = getpwuid(getuid()))) {
        YLMSG_E("Determining home directory failed (%s).", strerror(errno));
        return NULL;
    }
    user_home = pw->pw_dir;

    yl_dir = malloc(strlen(user_home) + 1 + strlen(YL_DIR) + 1);
    if (!yl_dir) {
        YLMSG_E("Memory allocation failed (%s).", strerror(errno));
        return NULL;
    }
    sprintf(yl_dir, "%s/%s", user_home, YL_DIR);

    ret = access(yl_dir, R_OK | X_OK);
    if (ret == -1) {
        if (errno == ENOENT) {
            /* directory does not exist */
            YLMSG_W("Configuration directory \"%s\" does not exist, creating it.", yl_dir);
            if (mkdir(yl_dir, 00700)) {
                if (errno != EEXIST) {
                    /* parallel execution, yay */
                    YLMSG_E("Configuration directory \"%s\" cannot be created (%s).", yl_dir, strerror(errno));
                    free(yl_dir);
                    return NULL;
                }
            }
        } else {
            YLMSG_E("Configuration directory \"%s\" exists but cannot be accessed (%s).", yl_dir, strerror(errno));
            free(yl_dir);
            return NULL;
        }
    }

    return yl_dir;
}

void
load_config(void)
{
    char *yl_dir, *history_file;

    if ((yl_dir = get_yanglint_dir()) == NULL) {
        return;
    }

    history_file = malloc(strlen(yl_dir) + 9);
    if (!history_file) {
        YLMSG_E("Memory allocation failed (%s).", strerror(errno));
        free(yl_dir);
        return;
    }

    sprintf(history_file, "%s/history", yl_dir);
    if (access(history_file, F_OK) && (errno == ENOENT)) {
        YLMSG_W("No saved history.");
    } else if (linenoiseHistoryLoad(history_file)) {
        YLMSG_E("Failed to load history.");
    }

    free(history_file);
    free(yl_dir);
}

void
store_config(void)
{
    char *yl_dir, *history_file;

    if ((yl_dir = get_yanglint_dir()) == NULL) {
        return;
    }

    history_file = malloc(strlen(yl_dir) + 9);
    if (!history_file) {
        YLMSG_E("Memory allocation failed (%s).", strerror(errno));
        free(yl_dir);
        return;
    }

    sprintf(history_file, "%s/history", yl_dir);
    if (linenoiseHistorySave(history_file)) {
        YLMSG_E("Failed to save history.");
    }

    free(history_file);
    free(yl_dir);
}
