;;; configurations --- A small library to load project specific configurations.
;;; Commentary:
;;; Code:
(require 'seq)

(defvar project-config-dir "~/.fg42/project-config"
  "This variable contains the path to the projects global configurations.")

(defvar __project-name__ nil
  "It's an internal variable to holds the current project name.")

(defun project-name (project)
  "Return the project name of the given PROJECT."
  (car (last (seq-filter
               (lambda (x) (not (equal "" x)))
               (split-string project "/")))))

(defun global-project-config-path (project)
  "Return path of the global project config for the given PROJECT or nil."
  (let ((config-path (format "%s/%s.el"
                             project-config-dir
                             (project-name project))))
    (if (file-exists-p config-path)
        config-path
      nil)))

(defun config-path (project)
  "Return the path of the given PROJECT configuration."
  (let ((in-proj-config     (format "%s.fg42.el" project))
        (global-proj-config (global-project-config-path project)))
    (if (file-exists-p in-proj-config)
        in-proj-config
      global-proj-config)))


(defun load-config-file (project-name config)
  "Load the given CONFIG file with the given PROJECT-NAME."
  (require 'projects/dsl)
  (setq __project-name__ project-name)
  (load config))


(defun load-configuration ()
  "Load the configuration for the current project."
  (interactive)
  (let* ((project (cdr (project-current)))
         (config  (config-path project)))
    (if (not (equal nil config))
        (load-config-file project config)
      (message "No configuration has been found for current project."))))


(provide 'projects/configuration)
;;; configuration.el ends here
