;;; Code:

(deftheme barak "Barak's Theme")

;;; Color Palette

(defvar zenburn-colors-alist
  '(("zenburn-fg+1"     . "#FFFFEF")
    ("zenburn-fg"       . "#DCDCCC")
    ("zenburn-fg-1"     . "#656555")
    ("zenburn-bg-2"     . "#000000")
    ("zenburn-bg-1"     . "#2B2B2B")
    ("zenburn-bg-05"    . "#383838")
    ("zenburn-bg"       . "#3F3F3F")
    ("zenburn-bg+1"     . "#4F4F4F")
    ("zenburn-bg+2"     . "#5F5F5F")
    ("zenburn-bg+3"     . "#6F6F6F")
    ("zenburn-red+1"    . "#DCA3A3")
    ("zenburn-red"      . "#CC9393")
    ("zenburn-red-1"    . "#BC8383")
    ("zenburn-red-2"    . "#AC7373")
    ("zenburn-red-3"    . "#9C6363")
    ("zenburn-red-4"    . "#8C5353")
    ("zenburn-orange"   . "#DFAF8F")
    ("zenburn-yellow"   . "#F0DFAF")
    ("zenburn-yellow-1" . "#E0CF9F")
    ("zenburn-yellow-2" . "#D0BF8F")
    ("zenburn-green-1"  . "#5F7F5F")
    ("zenburn-green"    . "#7F9F7F")
    ("zenburn-green+1"  . "#8FB28F")
    ("zenburn-green+2"  . "#9FC59F")
    ("zenburn-green+3"  . "#AFD8AF")
    ("zenburn-green+4"  . "#BFEBBF")
    ("zenburn-cyan"     . "#93E0E3")
    ("zenburn-blue+1"   . "#94BFF3")
    ("zenburn-blue"     . "#8CD0D3")
    ("zenburn-blue-1"   . "#7CB8BB")
    ("zenburn-blue-2"   . "#6CA0A3")
    ("zenburn-blue-3"   . "#5C888B")
    ("zenburn-blue-4"   . "#4C7073")
    ("zenburn-blue-5"   . "#366060")
    ("zenburn-magenta"  . "#DC8CC3")))
  
(defvar barak-colors-alist
  '(("background"       . "#000000")
    ("cursor"           . "#A7A7A7")
    ("fg-default"       . "#E0E0E0")
    ("mouse"            . "sienna1")
    ("comment"          . "#238E23")
    ("constant"         . "#E3AC3D")
    ("docstring"        . "DarkOrange")
    ("zenburn-fg+1"     . "#FFFFEF")
    ("zenburn-fg"       . "#DCDCCC")
    ("zenburn-fg-1"     . "#656555")
    ("zenburn-bg-2"     . "#000000")
    ("zenburn-bg-1"     . "#2B2B2B")
    ("zenburn-bg-05"    . "#383838")
    ("zenburn-bg"       . "#3F3F3F")
    ("zenburn-bg+1"     . "#4F4F4F")
    ("zenburn-bg+2"     . "#5F5F5F")
    ("zenburn-bg+3"     . "#6F6F6F")
    ("zenburn-red+1"    . "#DCA3A3")
    ("zenburn-red"      . "#CC9393")
    ("zenburn-red-1"    . "#BC8383")
    ("zenburn-red-2"    . "#AC7373")
    ("zenburn-red-3"    . "#9C6363")
    ("zenburn-red-4"    . "#8C5353")
    ("zenburn-orange"   . "#DFAF8F")
    ("zenburn-yellow"   . "#F0DFAF")
    ("zenburn-yellow-1" . "#E0CF9F")
    ("zenburn-yellow-2" . "#D0BF8F")
    ("zenburn-green-1"  . "#5F7F5F")
    ("zenburn-green"    . "#7F9F7F")
    ("zenburn-green+1"  . "#8FB28F")
    ("zenburn-green+2"  . "#9FC59F")
    ("zenburn-green+3"  . "#AFD8AF")
    ("zenburn-green+4"  . "#BFEBBF")
    ("zenburn-cyan"     . "#93E0E3")
    ("zenburn-blue+1"   . "#94BFF3")
    ("zenburn-blue"     . "#8CD0D3")
    ("zenburn-blue-1"   . "#7CB8BB")
    ("zenburn-blue-2"   . "#6CA0A3")
    ("zenburn-blue-3"   . "#5C888B")
    ("zenburn-blue-4"   . "#4C7073")
    ("zenburn-blue-5"   . "#366060")
    ("zenburn-magenta"  . "#DC8CC3"))
  "List of Zenburn colors.
Each element has the form (NAME . HEX).")


(defmacro barak-with-color-variables (&rest body)
  "`let' bind all colors defined in `zenburn-colors-alist' around BODY.
Also bind `class' to ((class color) (min-colors 89))."
  (declare (indent 0))
  `(let ((class '((class color) (min-colors 89)))
         ,@(mapcar (lambda (cons)
                     (list (intern (car cons)) (cdr cons)))
                   barak-colors-alist))
     ,@body))

(defmacro zenburn-with-color-variables (&rest body)
  "`let' bind all colors defined in `zenburn-colors-alist' around BODY.
Also bind `class' to ((class color) (min-colors 89))."
  (declare (indent 0))
  `(let ((class '((class color) (min-colors 89)))
         ,@(mapcar (lambda (cons)
                     (list (intern (car cons)) (cdr cons)))
                   zenburn-colors-alist))
     ,@body))

;;; Theme Faces
(barak-with-color-variables
  (custom-theme-set-faces
   'barak
;;;; Built-in
;;;;; basic coloring
   '(button ((t (:underline t))))
   `(link ((t (:foreground ,zenburn-yellow :underline t :weight bold))))
   `(link-visited ((t (:foreground ,zenburn-yellow-2 :underline t :weight normal))))
   `(default ((t (:foreground ,fg-default :background ,background))))
   `(cursor ((t (:foreground ,cursor :background ,zenburn-fg+1))))
   `(blue ((t (:foreground "blue"))))
   `(bold ((t (:bold t))))
   `(bold-italic ((t (:bold t))))
   `(border-glyph ((t (nil))))
   `(buffers-tab ((t (:background "#121212" :foreground "#E0E0E0"))))
   `(font-lock-builtin-face ((t (:foreground "#E0E0E0"))))
   `(font-lock-comment-face ((t (:foreground "#238E23"))))
   `(font-lock-constant-face ((t (:foreground "#E3AC3D"))))
   `(font-lock-doc-string-face ((t (:foreground "DarkOrange"))))
   `(font-lock-function-name-face ((t (:foreground "#C5A6FF"))))
   `(font-lock-keyword-face ((t (:bold t :foreground "#4876FF"))))
   `(font-lock-preprocessor-face ((t (:foreground "#E9DFEF"))))
   `(font-lock-reference-face ((t (:foreground "#E1634F"))))
   `(font-lock-regexp-grouping-backslash ((t (:foreground "#E9C062"))))
   `(font-lock-regexp-grouping-construct ((t (:foreground "red"))))
   `(font-lock-string-face ((t (:foreground "#F05656"))))
   `(font-lock-type-face ((t (:foreground "#73E1E6"))))
   `(font-lock-variable-name-face ((t (:foreground "#00BFFF"))))
   `(font-lock-warning-face ((t (:bold t :foreground "Pink"))))
   `(gui-element ((t (:background "#A0A0A0" :foreground "black"))))
   `(region ((t (:background "#364458"))))
   `(mode-line ((t (:background "grey75" :foreground "black"))))
   `(highlight ((t (:background "#222222"))))
   `(highline-face ((t (:background "SeaGreen"))))
   `(italic ((t (nil))))
   `(left-margin ((t (nil))))
   `(text-cursor ((t (:background "green" :foreground "black"))))
   `(toolbar ((t (nil))))
   `(tabbar-default ((t (:background "black" :foreground "grey75"))))
   `(tabbar-selected ((t (:background "grey75" :foreground "black"))))
   `(tabbar-highlight  ((t (:bold t))))
   `(underline ((nil (:underline nil))))
   `(match ((t (:bold t :background nil))))
   `(show-paren-match ((t ((:bold t :foreground "#00ff00" :background nil)))))

   ; company mode
   `(company-tooltip ((t (:background "#303840" :foreground "#e0e0e0"))))
   `(company-tooltip-annotation ((t (:bold t :background "#303840" :foreground "#cae682"))))
   `(company-tooltip-selection ((t (:bold t :background "#505860" :foreground "#ffa000"))))
   `(company-scrollbar-bg ((t (:background "#505860" :foreground "#505860"))))
   `(company-scrollbar-fg ((t (:background "#808890" :foreground "#808890"))))
   ; powerline
   `(powerline-active1 ((t (:background "#303840" :foreground "#e0e0e0"))))
   `(powerline-active2 ((t (:background "#505860" :foreground "#ffa000"))))
   ; motion-face
   `(spacemacs-motion-face ((t (:background "#5f87ff" :foreground "#ffffff"))))
   `(spacemacs-normal-face ((t (:background "#5f87ff" :foreground "#ffffff"))))
   `(spacemacs-replace-face ((t (:background "#870000" :foreground "#ffffff"))))
   `(spacemacs-visual-face ((t (:background "#ffac00" :foreground "#ffffff"))))
   ))

;;; Theme Variables
(zenburn-with-color-variables
  (custom-theme-set-variables
   'barak
;;;;; ansi-color
   `(ansi-color-names-vector [,zenburn-bg ,zenburn-red ,zenburn-green ,zenburn-yellow
                                          ,zenburn-blue ,zenburn-magenta ,zenburn-cyan ,zenburn-fg])
;;;;; fill-column-indicator
   `(fci-rule-color ,zenburn-bg-05)
;;;;; vc-annotate
   `(vc-annotate-color-map
     '(( 20. . ,zenburn-red-1)
       ( 40. . ,zenburn-red)
       ( 60. . ,zenburn-orange)
       ( 80. . ,zenburn-yellow-2)
       (100. . ,zenburn-yellow-1)
       (120. . ,zenburn-yellow)
       (140. . ,zenburn-green-1)
       (160. . ,zenburn-green)
       (180. . ,zenburn-green+1)
       (200. . ,zenburn-green+2)
       (220. . ,zenburn-green+3)
       (240. . ,zenburn-green+4)
       (260. . ,zenburn-cyan)
       (280. . ,zenburn-blue-2)
       (300. . ,zenburn-blue-1)
       (320. . ,zenburn-blue)
       (340. . ,zenburn-blue+1)
       (360. . ,zenburn-magenta)))
   `(vc-annotate-very-old-color ,zenburn-magenta)
   `(vc-annotate-background ,zenburn-bg-1)
   ))

;;; Rainbow Support

;; (declare-function rainbow-mode 'rainbow-mode)
;; (declare-function rainbow-colorize-by-assoc 'rainbow-mode)

(defvar barak-add-font-lock-keywords nil
  "Whether to add font-lock keywords for zenburn color names.
In buffers visiting library `zenburn-theme.el' the zenburn
specific keywords are always added.  In all other Emacs-Lisp
buffers this variable controls whether this should be done.
This requires library `rainbow-mode'.")

(defvar barak-colors-font-lock-keywords nil)

;; (defadvice rainbow-turn-on (after zenburn activate)
;;   "Maybe also add font-lock keywords for zenburn colors."
;;   (when (and (derived-mode-p 'emacs-lisp-mode)
;;              (or zenburn-add-font-lock-keywords
;;                  (equal (file-name-nondirectory (buffer-file-name))
;;                         "zenburn-theme.el")))
;;     (unless zenburn-colors-font-lock-keywords
;;       (setq zenburn-colors-font-lock-keywords
;;             `((,(regexp-opt (mapcar 'car zenburn-colors-alist) 'words)
;;                (0 (rainbow-colorize-by-assoc zenburn-colors-alist))))))
;;     (font-lock-add-keywords nil zenburn-colors-font-lock-keywords)))

;; (defadvice rainbow-turn-off (after zenburn activate)
;;   "Also remove font-lock keywords for zenburn colors."
;;   (font-lock-remove-keywords nil zenburn-colors-font-lock-keywords))

;;; Footer

;;;###autoload
;; (and load-file-name
;;      (boundp 'custom-theme-load-path)
;;      (add-to-list 'custom-theme-load-path
;;                   (file-name-as-directory
;;                    (file-name-directory load-file-name))))

;(defun color-theme-barak-extras ()
;; Highlight numbers 
;(add-hook 'after-change-major-mode-hook 
	  ;(lambda () (font-lock-add-keywords 
		       ;nil
		       ;'(("\\<\\(\\(0[xX]\\|0[bB]\\)?-?[0-9a-fA-F]+\\.?[0-9]*?[fFlL]?\\)\\>" 1 '((t (:foreground "#E3AC3D")))))))))

(provide-theme 'barak)

;;;###autoload
;; (add-to-list 'safe-local-eval-forms
;;              '(when (require 'rainbow-mode nil t) (rainbow-mode 1)))

;; Local Variables:
;; no-byte-compile: t
;; indent-tabs-mode: nil
;; eval: (when (require 'rainbow-mode nil t) (rainbow-mode 1))
;; End:
